是否有可能以某种方式将标志值分配给来自其他枚举元素组合的值?
类似这样的东西:
[Flags]
public enum MyTypeObject
{
Unit = Defender | Worker,
Defender,
Worker
}
是否有可能以某种方式将标志值分配给来自其他枚举元素组合的值?
类似这样的东西:
[Flags]
public enum MyTypeObject
{
Unit = Defender | Worker,
Defender,
Worker
}
是否可以立即删除对象?
据我了解,Destroy() 在帧结束时删除,特别是在 OnCollisionEnter() 之后。是否可以在 OnCollisionEnter() 完成之前删除对象?
好吧,这就是我理解我的问题的方式:) 更详细地说:在碰撞内部,调用以下内容:_stateHoneyGetter.OnEnter(_honeyGiver)
private void OnCollisionEnter(Collision collision)
{
//Если объект может давать мёд, то берём его
_honeyGiver = collision.gameObject.GetComponent<IHoneyGiver>();
if (_honeyGiver is IHoneyGiver && сurrentHoneyStocks < parameters.maxHoneyStocks)
{
_stateMovement.OnExit();
_stateHoneyGetter.OnEnter(_honeyGiver);
}
}
这是协程开始的地方:
public void OnEnter(object honeyGiver)
{
coroutine = HoneyGet((IHoneyGiver)honeyGiver, _parameters.getHoneyTime);
_bee.StartCoroutine(coroutine);
}
public IEnumerator HoneyGet(IHoneyGiver honeyGiver, float waitTime)
{
while (true)
{
//Проверяем может ли пчела ещё взять мёд и наличие объекта у которого мы хотим взять мёд, если нет свободных мест возникает ошибка
if (сurrentHoneyStocks < _parameters.maxHoneyStocks && !honeyGiver.Equals(null))
try
{
сurrentHoneyStocks +=
honeyGiver.HoneyGive(_beeGmOdj, _parameters.getHoney);
}
catch
{
_stateMovement.OnEnter<HoneyGoTo>();
yield break;
}
//Проверяем существует ли дающий мёд, если нет, дальше ищем мёд
if (honeyGiver.Equals(null))
{
_stateMovement.OnEnter<HoneyGoTo>();
yield break;
}
//Проверяем заполненность хранилища мёда пчелы, если оно заполнено летим в улей Hive
else if (сurrentHoneyStocks >= _parameters.maxHoneyStocks)
{
_stateMovement.OnEnter<GoTo>();
yield break;
}
yield return new WaitForSeconds(waitTime);
}
}
这是直接从花中提取蜂蜜:
public float HoneyGive(GameObject whosAsking, float honey)
{
if (!(!(honeyGetters.Contains(whosAsking)) ^ !canCollectHoney))
throw new ArgumentException("This object can't take honey. The seats are occupied or it doesn't have an IHoneyConsumer");
if (сurrentHoneyStocks - honey >= 0)
{
сurrentHoneyStocks = сurrentHoneyStocks - honey;
return honey;
}
else
{
Destroy(transform.root.gameObject);
return сurrentHoneyStocks;
}
}
现在关于这件事的一个问题:
Destroy(transform.root.gameObject);
return сurrentHoneyStocks;
让我吃惊的第一件事是return
泷把剩下的蜂蜜还给我了。这让我很开心。让我感到不安的是,在那之后,当检查 honeyGiver 的存在时:
//Проверяем существует ли дающий мёд, если нет, дальше ищем мёд
if (honeyGiver.Equals(null))
honeyGiver 仍然存在,因此,会发生额外的协程调用,因此蜜蜂会在原地挂起一个额外的滴答声。
好的,我会不用剩下的蜂蜜,没有必要返回一些东西,但是我可以以某种方式立即删除该对象,这样就不会有额外的调用?
这里我们有一个物体,别人不应该通过它,重力作用在它上面是可取的,但是当它与其他物体碰撞时,它不应该翻身。
我正在尝试在游戏中实现保存。我把变量的值保存在一个继承自ScriptableObject的类中
public class HealthAndDeathLocaStorage : ScriptableObject
{
[SerializeField]
private float health;
[SerializeField]
private bool death;
public float Health { get => health; set => health = value; }
public bool Death { get => death; set => death = value; }
}
我将此类的一个实例放在视图字典Dictionary<string, ScriptableObject>
中。我使用库将此字典序列化为 Json Newtonsoft
:
public void Save(object saveObject, string fileName)
{
string strJsonData = JsonConvert.SerializeObject(saveObject);
File.WriteAllText(_filePath + fileName, strJsonData);
}
反序列化后:
public Dictionary<string, ScriptableObject> Load(string fileName)
{
//Чтение из файла
string strJsonData = File.ReadAllText(_filePath + fileName);
return JsonConvert.DeserializeObject<Dictionary<string, ScriptableObject>>(strJsonData);
}
当我从字典中获取对象并尝试将其转换为 HealthAndDeathLocaStorage 类型时:
HealthAndDeathLocaStorage locaStorage = ScriptableObject.CreateInstance<HealthAndDeathLocaStorage>();
locaStorage = (HealthAndDeathLocaStorage) SaveLoadAllComponent.Get(this, "healthAndDeath");
我收到一个错误:Specified cast is not valid
。这是一个需要解决的问题。
我读到,由于继承人缺少某些东西,可能会发生这种错误。在实现保存的这个选项之前,我使用了 JsonUtility 实用程序函数(但由于 JsonUtility 不序列化字典,我决定切换到 Newtonsoft 库)。使用 JsonUtility 时,我创建了一个中间类,在其中定义了引发异常的属性的空白,并且已经在继承人中重新定义了所有内容。
public class StoringLocalData : ScriptableObject
{
public virtual float Health
{
set { throw new ArgumentException("У данного объекта не сущетствует свойства Health"); }
get { throw new FieldAccessException("У данного объекта не сущетствует свойства Health"); }
}
public virtual bool tDeath
{
set { throw new ArgumentException("У данного объекта не сущетствует свойства Death"); }
get { throw new FieldAccessException("У данного объекта не сущетствует свойства Death"); }
}
}
但
使用当前的序列化库,异常不会写入pig,当它们被序列化时,会引发这些异常并中断序列化。因此,我尝试制作这样的中间类:
public class LocalStorage : ScriptableObject
{
[SerializeField]
private float health;
[SerializeField]
private bool death;
public virtual float Health
{
set;
get;
}
public virtual bool Death
{
set;
get;
}
}
因此,HealthAndDeathLocaStorage 不再继承自 ScriptableObject,而是继承自 LocalStorage。但这并没有解决问题,错误Specified cast is not valid.
并没有消失。
是否有可能不爬遍整个项目来寻找什么和在哪里,而只是戳几个按钮,这样无论在哪里使用选定的类,它的名字都会被重命名为一个新的?
我创建了一个空的游戏对象,我在其中创建了另一个空的游戏对象,在上面挂了一个 Collider 并附加了 Health 脚本,伤害通过了。如果我在主要对象上挂一个刚体,伤害不会过去。其实多少钱?
在调试中,脚本没有进入 OnTriggerEnter。
如果 Rigidbody 也使用 Collider 附加到子对象,则伤害会再次传递。
public int maxHealth = 100;
public int currentHealth = 100;
public HealthBar healthBar;
private void Start()
{
healthBar.SetMaxHealth(maxHealth);
}
private void OnTriggerEnter(Collider other)
{
Bullet bullet = other.gameObject.GetComponent<Bullet>();
if (bullet)
{
TakeDamage(20);
if (currentHealth == 0) Destroy(gameObject);
}
}
private void TakeDamage(int damege)
{
currentHealth -= damege;
healthBar.SetHealth(currentHealth);
}
通常,至少对问题进行一些可视化总比没有好:
为每一列获取唯一值的好方法DataFrame
。
数据框: https ://yadi.sk/i/CiNCLc2juUxaXw
我的解决方案:
adult_train_drop = adult_train.drop(['Age', 'fnlwgt', 'Education_Num', 'Capital_Gain', 'Capital_Loss', 'Hours_per_week'], axis=1)
for col in adult_train_drop:
print(col, ': ', adult_train[col].unique())
print()
结果:
Workclass : [' State-gov' ' Self-emp-not-inc' ' Private' ' Federal-gov' ' Local-gov'
nan ' Self-emp-inc' ' Without-pay' ' Never-worked']
Education : [' Bachelors' ' HS-grad' ' 11th' ' Masters' ' 9th' ' Some-college'
' Assoc-acdm' ' Assoc-voc' ' 7th-8th' ' Doctorate' ' Prof-school'
' 5th-6th' ' 10th' ' 1st-4th' ' Preschool' ' 12th']
Martial_Status : [' Never-married' ' Married-civ-spouse' ' Divorced'
' Married-spouse-absent' ' Separated' ' Married-AF-spouse' ' Widowed']
Occupation : [' Adm-clerical' ' Exec-managerial' ' Handlers-cleaners' ' Prof-specialty'
' Other-service' ' Sales' ' Craft-repair' ' Transport-moving'
' Farming-fishing' ' Machine-op-inspct' ' Tech-support' nan
' Protective-serv' ' Armed-Forces' ' Priv-house-serv']
Relationship : [' Not-in-family' ' Husband' ' Wife' ' Own-child' ' Unmarried'
' Other-relative']
Race : [' White' ' Black' ' Asian-Pac-Islander' ' Amer-Indian-Eskimo' ' Other']
Sex : [' Male' ' Female']
Country : [' United-States' ' Cuba' ' Jamaica' ' India' nan ' Mexico' ' South'
' Puerto-Rico' ' Honduras' ' England' ' Canada' ' Germany' ' Iran'
' Philippines' ' Italy' ' Poland' ' Columbia' ' Cambodia' ' Thailand'
' Ecuador' ' Laos' ' Taiwan' ' Haiti' ' Portugal' ' Dominican-Republic'
' El-Salvador' ' France' ' Guatemala' ' China' ' Japan' ' Yugoslavia'
' Peru' ' Outlying-US(Guam-USVI-etc)' ' Scotland' ' Trinadad&Tobago'
' Greece' ' Nicaragua' ' Vietnam' ' Hong' ' Ireland' ' Hungary'
' Holand-Netherlands']
Target : [' <=50K' ' >50K']
有可能得到类似的结果,但是
DataFrame
类似。我正在研究教材《Android. Programming for Professionals》(2017年第3版),有这么一个地方:
LocationRequest request = LocationRequest.create();
request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
request.setNumUpdates(1);
request.setInterval(0);
LocationServices.FusedLocationApi
.requestLocationUpdates(mClient, request, new LocationListener() {
@Override
public void onLocationChanged(Location location) {
Log.i(TAG, "Got a fix: " + location);
}
});
问题是启动后,Location
日志中没有消息。也就是说,onLocationChanged
程序根本没有落下。
在文档中,我发现此选项用于获取Location
:
LocationServices.getFusedLocationProviderClient(getContext())
.getLastLocation()
.addOnSuccessListener(getActivity(), new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
Log.i(TAG, "Got a fix: " + location);
}
});
但他回来了null
。
有什么问题?或者有其他方法可以得到Location
吗?
如果需要重命名方法,有没有办法更改方法的名称,以便在任何地方调用它都会以相同的方式重命名?
具体来说,我有一个方法:
public static Intent newIntent(Context packageContext, UUID crimeId){
Intent intent = new Intent(packageContext, CrimePagerActivity.class);
intent.putExtra(EXTRA_CRIME_ID, crimeId);
return intent;
}
我希望方法的名称以某种方式反映它所属的类的名称,类似于newIntentCPA
. 有没有一种方法可以更改方法的名称,而不必寻找所有使用它的地方?
有两个问题:
如何使它在按下按钮时执行该函数(在我的示例中,当按下 Button_1 时,应该执行 hl 函数)?就我而言,结果是一个错误:
AttributeError:“MainMenu”对象没有属性“hl”
怎么做到的,当你点击left_action_items时,你会返回到上一个屏幕(嗯,一般如何使用它,例如,当你使用它时,会执行一个函数或变量的重新分配)?我尝试了以下选项:
left_action_items: [['arrow-left', lambda x: app.screen_manager.current = 'Screen_1']]'
并收到:
[['arrow-left', lambda x: app.screen_manager.current = 'Screen_1']]
SyntaxError:无效的语法
我实验过的一个例子:
主要.py:
from kivy.factory import Factory
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.config import Config
from kivy.core.window import Window
from kivy.uix.screenmanager import Screen
Config.set('graphics', 'resizable', '0')
Window.size = (351, 512)
Builder.load_file('ui.kv')
class MainMenu(Screen):
def hl(self):
print('hllo')
class Basic(MDApp):
def __init__(self, **kvargs):
super(Basic, self).__init__(**kvargs)
self.title = "KivyMD Examples - Progress Loader"
self.screen_manager = Factory.ManagerScreens()
def build(self):
return self.screen_manager
Basic().run()
ui.kv:
<ManagerScreens@ScreenManager>:
MainMenu:
id: Screen_1
Dictionary:
id: Screen_2
<MainMenu@Screen>:
name: 'Screen_1'
BoxLayout:
orientation: "vertical"
padding: 30
spacing: 20
pos_hint: {'top': 1.6}
MDFillRoundFlatButton:
text: "Button_1"
on_press: root.hl()
MDFillRoundFlatButton:
text: "Button_2"
on_press: app.screen_manager.current = 'Screen_2'
<Dictionary@Screen>:
name: 'Screen_2'
MDToolbar:
size_hint_y: .08
title: "Toolbar"
md_bg_color: app.theme_cls.primary_color
left_action_items: [['arrow-left', lambda x: x]]
pos_hint: {'top':1}
BoxLayout:
orientation: "vertical"
我正在学习 kivy,我想从 kivymd 制作一组可滚动的按钮,为此我使用 MDScrollViewRefreshLayout(取自示例)。但是有些按钮是不可见的,可见的不滚动。我想看看使用 ScrollView 的最简单的例子,这样 python 代码和标记是分开的。我找到了一个对我来说很清楚的示例,但是没有单独的标记文件,我无法弄清楚如何获得所需的结果。
主文件
from kivy.factory import Factory
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.config import Config
from kivy.core.window import Window
Config.set('graphics', 'resizable', '0')
Window.size = (351, 512)
Builder.load_file('dictionary.kv')
class Basic(MDApp):
def __init__(self, **kvargs):
super(Basic, self).__init__(**kvargs)
self.main = Factory.MainMenu()
def build(self):
return self.main
Basic().run()
字典.kv:
MDScrollViewRefreshLayout:
do_scroll_x: False
size_hint_y: None
BoxLayout:
orientation: "vertical"
padding: 30
spacing: 20
size_hint_y: None
pos_hint: {"top": -.6}
MDTextButton:
text: 'game 1_'
heigh: dp(60)
size_hint_y: None
MDTextButton:
text: 'game 2'
heigh: dp(60)
size_hint_y: None
MDTextButton:
text: 'game 3'
heigh: dp(60)
size_hint_y: None
MDTextButton:
text: "game 4"
heigh: dp(60)
size_hint_y: None
MDTextButton:
text: 'game 1'
heigh: dp(60)
size_hint_y: None
MDTextButton:
text: 'game 2'
heigh: dp(60)
size_hint_y: None
MDTextButton:
text: 'game 3'
heigh: dp(60)
size_hint_y: None
MDTextButton:
text: "game 4"
heigh: dp(60)
size_hint_y: None
MDTextButton:
text: 'game 1'
heigh: dp(60)
size_hint_y: None
MDTextButton:
text: 'game 2'
heigh: dp(60)
size_hint_y: None
MDTextButton:
text: 'game 3'
heigh: dp(60)
size_hint_y: None
MDTextButton:
text: "game 4"
heigh: dp(60)
size_hint_y: None
MDTextButton:
text: 'game 1'
heigh: dp(60)
size_hint_y: None
MDTextButton:
text: 'game 2'
heigh: dp(60)
size_hint_y: None
MDTextButton:
text: 'game 3'
heigh: dp(60)
size_hint_y: None
MDTextButton:
text: "game 4"
heigh: dp(60)
size_hint_y: None