从其他脚本Unity访问脚本



我为Unity编写了一个小资产(编辑器)。它运行良好。然而,所有的代码都在一个Monopahavior中,我想把它分成三个额外的脚本,每个脚本都用于特定类型的活动(读/写文件、对象管理、导航管理)。因此,我与Unity要求访问其他脚本中数据的方法发生了冲突(我来自Delphi,有它的简单单元)。我发现的解决方案是:检查器中的各个组件使用SendMessage调用Target脚本中的方法,其中一些方法调用另外三个脚本中的其他方法。这三个脚本互不访问,但必须共享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;

最后,我必须添加三个脚本作为Target脚本的组件,并从层次结构中拖动每个脚本上的FileTarget对象。然后我可以使用[HideInInspector]。这样我也可以访问目标脚本。

所有这些似乎都很费力,我想到了为这三个脚本使用静态类,而不是Monopahavior(这三个剧本不是层次结构中的对象)。但是,除了不必实例化Target脚本中的三个脚本外,我还需要实例化这三个脚本中的目标脚本,并将它们添加为Target组件。我绝对不想请你教编程,但你能告诉我最好的方法吗?感谢

由于您的三个脚本不需要附加到游戏对象,您可以简单地将它们定义为普通的C#类,并从Target实例化它们
此外,您可以在构造函数中为它们提供对Target的引用作为参数,您可以将其保存为私有成员以便稍后访问,例如:

class FileScript1
{
private Target _target;
public FileScript1(Target target)
{
_target = target;
}
}

并在TargetStart中创建如下对象:

private FileScript1 Script1;
public void Start () {
Script1 = new FileScript1(this);
}

假设将这些脚本附加到GameObjects,则需要使用GetComponent<>()。调用的工作方式是返回指定类型的组件,如果不存在,则返回null。通过这种方式,您可以将脚本(也是一个组件)附加到您选择的GameObject,然后进行调用。

例如:

myClassVariable = this.gameObject.getComponent<myClass>();

最新更新