我为Unity编写了一个小资产(编辑)。它运作良好。但是,所有代码都在一个Monobehaviour中,因此我想将其分为三个额外的脚本,每个脚本用于某种特定类型的活动(读/写文件,对象管理,导航管理),因此我与方法相冲突。 Unity请求访问其他脚本中的数据(我来自Delphi,带有简单的单元)。 我发现的解决方案是:检查器中的各个组件使用SendMessage调用Target脚本中的方法,而其中一些方法则在三个附加脚本中调用其他方法。这三个脚本不能互相访问,但必须共享目标脚本变量。要在目标脚本中执行此操作:
[HideInInspector] public FileScript1 Script1;
[HideInInspector] public FileScript2 Script2;
[HideInInspector] public FileScript3 Script3;
public void Start () {
Script1 = FindObjectOfType (typeof(FileScript1)) as FileScript1;
Script2 = FindObjectOfType (typeof(FileScript2)) as FileScript2;
Script3 = FindObjectOfType (typeof(FileScript3)) as FileScript3;
}
并访问其他脚本,我可以使用Script1.myMethod。
在我实例化的三个脚本中
public FileTarget myTarget;
最后,我必须将这三个脚本添加为目标脚本的组成部分,并将FileTarget对象拖到层次结构中的每个目标上。然后,我可以使用[HideInInspector]。这样,我还可以访问目标脚本。
这一切似乎很费力,我想到了对这三个脚本使用静态类而不是Monobehaviour(这三个脚本不是层次结构中的对象)。 但是除了不必实例化Target脚本中的三个脚本之外,我仍然需要实例化这三个脚本中的目标脚本并将它们添加为Target组件。 我绝对不想让您教编程,但是您能指导我实现这一目标的最佳方法吗? 谢谢
答案 0 :(得分:1)
由于不需要将三个脚本附加到Gameobjects,因此您可以将它们简单地定义为普通C#类,并从Target
实例化它们。
另外,您可以为他们提供对Target
的引用,作为构造函数中的参数,您可以将其另存为私有成员以供以后访问,例如:
class FileScript1
{
private Target _target;
public FileScript1(Target target)
{
_target = target;
}
}
像这样在Start
的{{1}}中创建对象:
Target
答案 1 :(得分:0)
假设您将这些脚本附加到GameObjects,则需要使用GetComponent<>()。调用的工作方式是返回指定类型的组件,如果不存在,则返回null。这样,您可以将脚本(也是组件)附加到您选择的GameObject,然后进行调用。
例如:
myClassVariable = this.gameObject.getComponent<myClass>();