我有一个绑定到主相机的主游戏类,它存储我必须从其他脚本读取/编辑的变量。
如何实施?我是 Unity 和 OOP 的新手,我在 Internet 上找不到答案。
例子:
文件 1:
public class Game : MonoBehaviour
{
ArrayList antibodies = new ArrayList();
// другой код
}
第二个文件:
public class Skin : MonoBehaviour
{
void OnTriggerEnter2D(Collider2D other){
if(other.gameObject.tag == "antibody "){
(тут как-то достать antibodies).Remove(other);
}
}
}
首先,该字段
antibodies没有设置访问修饰符。默认情况下,它设置为private,这意味着您无法从外部访问它。一般来说,你可以通过不同的方式获得访问权,它们取决于你的目标,我不知道。
例如:
public static antibodies。然后可以通过类名访问:Game.antibodies.Remove(other). 但通常这是不好的做法。您可以从程序中的任何位置打开此字段以进行访问,这会将代码变成面条。Game单例和一个字段public antibodies。这类似于第一个选项,肯定会把你的代码变成面条。antibodies我们创建字段,并使用orpublic搜索对象。但这是不好的做法。创建隐式依赖关系并降低性能(尤其是在场景中有很多对象的情况下)。GameObject.FindObjectOfTypeGameObject.FindWithTagGame在组件内部保留对组件的引用,Skin然后再次生成该字段。然后我们可以访问where是对 type 组件的引用。(如何分配这个链接是一个完全不同的故事。例如,在创建和初始化你的“抗体”时。或者在舞台上设置一个预制件,然后在标记的字段中将链接扔到编辑器中。有很多选项)。一般来说,这是处理依赖项的最正常方式。antibodiespublic_game.antibodies.Remove(other)_gameGameSerializelField当然还有其他选择,但不知道他们不会想到的任务。让我们详细讨论一般情况下最正常的情况。
当实例化一个对象时,我们
Skin调用该方法Init并传递一个对Game. 或者我们在编辑器中手动将链接扔到舞台上的对象组件中。稍微偏离主题:
antibody例如,将脚本添加到 objectsAntibody。即使它是空的。因为你不能保证带有标签的对象上面有必要的组件。此外,一个对象只能有一个标签,并且可以有任意多个组件。如果您需要用两个“标签”标记一个对象怎么办?没有人能免受错别字的影响。在代码中写标签很容易出错,但是如果你在写类型名时出错,开发环境或编译器会告诉你。因此,您将有一个列表List<Antibody>Game即将成为一个具有大量功能、依赖项和职责的全局单一“管理器”班级。也是不好的做法。应将职责划分为更小的类别,并赋予适当的名称。类名Game,Manager,Controller等Helper并不能真正说明它们的用途,通常是此类单体类的指标。