从其他脚本Unity访问脚本

时间:2019-01-25 21:10:54

标签: c# unity3d

我为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组件。 我绝对不想让您教编程,但是您能指导我实现这一目标的最佳方法吗? 谢谢

2 个答案:

答案 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>();