Articles of monobehaviour

游戏对象被禁用和被禁用之间有什么区别?

我正在查看一个脚本,该脚本有一个特定的函数调用来禁用脚本,并标记一个列表重构: void Disable() { gameObject.SetActive(false); isEnumerated = false; } 我正在试图确定的是,只需在OnDisable()函数中使用代码会更好一些: void OnDisable() { isEnumerated = false; } 我发现OnDisable()每当游戏对象被“禁用”或“不活动”时都会调用,但是我对两者之间的确切区别感到困惑。 文档我发现这两个参考仅仅是特定的,因为它们是两种不同的情况,提供定义的地方似乎使用两个词的同义词。

在序列化的Unity脚本中定义字段范围的最佳实践?

我从Object Oriented Design角度了解到,为了提供encapsulation ,我们应该避免在class定义publicvariables,而是通过公共方法来访问它们。 目前,我正在开发一个Unity项目代码库,它将大多数fields定义为public因为它需要在Unity Inspector选项卡中访问它们。 将字段定义为private和刚刚添加的[SerializableField]属性更好吗? 这样做有什么缺点吗? 我想知道是否有任何最佳做法来定义驱动的Unity类中的字段范围? 私人领域: public class SampleClass: MonoBehaviour { [SerializeField] private Field sampleField; } 公共领域: public class SampleClass: MonoBehaviour { public Field sampleField; }

有几个具有通用接口的类,但仍然能够通过该接口访问MonoBehaviour方法?

在我们的项目中,我们曾经有一个PlayerObject类,然后是从这个类派生的Unit和Building。 我们最近开始看看Bolt,它需要定义可能具有不同状态的对象来直接inheritanceBolt类。 所以Unit和Building不能从PlayerObjectinheritance。 这就产生了一些问题,我们的游戏很大一部分使用了PlayerObject而不是Unit或者Building来执行相同的操作。 把它们分开真的会让程序产生一个问题,因为你现在必须使用Unit和Building来代替PlayerObject。 我认为制作一个通用的接口IPlayerObject,并在接口中定义公共属性和方法,使得从IPlayerObject派生的Building和Unit都可以做到这一点。 我没有足够的思考,并发现如果我使用IPlayerObject,我不能再访问MonoBehaviour的方法和字段(如变换,或渲染)。 我可以这样做,我可以使用IPlayerObjecttypes,单位或建筑types,仍然可以通过该接口访问MonoBehaviour? 如果没有,是否有适当的方法来做到这一点,过去只是添加额外的方法分别处理单位和建筑types。

如何使Unity中的列表(和数组)只能使用某个“types”的GameObjects

如果我在通用的C#编码,我可以创建一个列表,只存储一个特定types的对象。 如果我不小心尝试在列表中添加除此types以外的任何内容,我会及时告知并可以快速解决问题。 List<Foo> my_list = new List<Foo>(); my_list.Add(Bar) //Error 但是因为我使用的是Unity,所以我的脚本需要附加到一个GameObject上,并且需要保存在List中。 List<GameObject> my_list = new List<GameObject>(); GameObject Foo = new GameObject; Foo.AddComponent<Foo>(); GameObject Bar = new GameObject; Bar.AddComponent<Bar>(); my_list.Add(Foo) //Fine my_list.Add(Bar) //Works, but I don't want it to 我只希望列表中存储“Foo”GameObjects(带有Foo组件的GameObjects),但是没有任何东西可以阻止我意外地存储任何types的GameObject,这可能(并且已经)导致我花了几个小时来尝试debugging问题。 有没有一种方法来子types的游戏对象,以便它的效果List<GameObject(Foo)> my_list ? 有没有办法与数组做呢?

recursion序列化错误?

每次尝试从资源加载和实例化对象时,我都会遇到一系列的五个错误: GetBool is not allowed to be called during serialization, call it from Awake or Start instead. Called from MonoBehaviour 'Immigrant' on game object 'Immigrant'. See "Script Serialization" page in the Unity Manual for further details. UnityEditor.EditorPrefs:GetBool(String, Boolean) SyntaxTree.VisualStudio.Unity.Bridge.Configuration.GlobalConfiguration:get_SendConsoleToVisualStudio() SyntaxTree.VisualStudio.Unity.Bridge.Configuration.ActiveConfiguration:get_SendConsoleToVisualStudio() SyntaxTree.VisualStudio.Unity.Bridge.VisualStudioIntegration:OnLog(String, String, LogType) UnityEngine.Resources:Load(String) UnityException: GetBool is not allowed to be called during serialization, call […]

其他MonoBehaviour的StartCoroutine不起作用

我试图复制关于协程的Unity文档的模型,但是我想把它分成另一个类: 我有这两个: public class A: MonoBehaviour { void Start() { print("Starting " + Time.time); B test = new B(); StartCoroutine(test.WaitAndPrint(2.0F)); print("Before WaitAndPrint Finishes " + Time.time); } } public class B: MonoBehaviour { public IEnumerator WaitAndPrint(float waitTime) { yield return new WaitForSeconds(waitTime); print("WaitAndPrint " + Time.time); } } 它打印,忽略协程: 在WaitAndPrint完成之前开始0 这两种方法在同一个class上工作得很好。

我怎么能给一个MonoBehaviour字段的默认值,取决于对象?

在Unity3D中,我有一个MonoBehaviour被添加到游戏对象。 我正在给它添加一个string “name”字段。 我希望名称的默认值是组件添加到的游戏对象的名称。 是否有捷径可寻? 一些更多细节: 该组件是我添加名称字段的现有组件。 在旧版本中,名称始终是游戏对象的名称,这是一个新function,可以使它们不同。 常见的情况是(仍然)名称是游戏对象的名称,因此将其作为默认值可以简化将组件添加到新对象的过程。 理想情况下 ,对旧场景进行反序列化将填充默认值,因此更新场景不需要费力。 我不太关心这个,而不是关于新创建的场景/对象。 该组件已经使用了一个CustomEditor 。 如果更改了游戏对象的名称,或者将组件的值粘贴到不同的游戏对象中,我不在乎更新组件中的名称。 我能想到的一种方法是添加一个bool “覆盖名称”的对象。 如果bool选中,则使用默认名称(游戏对象); 如果选中,则使用新字段。 但是我想避免增加GUI的复杂性来支持它。 我的要求的重点是添加新function(覆盖名称),而不添加步骤创建工作stream程。