Unity将脚本附加到另一个不起作用的脚本

时间:2017-05-11 13:01:02

标签: c# unity3d unity5

我正在编写一个脚本来控制场景的环境照明。我有一个下拉列表和三个脚本,用于不同的环境照明,script1,script2和script3。在我的控制脚本中,我写道:

public class ControlScript : MonoBehaviour {

    public Dropdown dropdown;
    public script1 s1;
    public script2 s2;
    public script3 s3;

    public void change() {
        int option = dropdown.value;
        disableAll();

        switch (option){
        case 0: 
            s1.enabled = true;
            break;

        case 1:
            s2.enabled = true;
            break;

        case 2:
            s3.enabled = true;
            break;
        }

    private void disableAll() {
        s1.enabled = false;
        s2.enabled = false;
        s3.enabled = false;
    }
}

然后我将此脚本附加到相机,相应地设置脚本并设置change()方法侦听onValueChanged()事件。

change()方法与下拉列表正确反应,但脚本s1 / s2 / s3未正确启用,因此不执行任何功能。我试图将s1,s2,s3另外附加到相机上,但似乎没有用。

有没有办法解决这个问题?

-------------------------------编辑更新-------------- ----------------- 脚本s1,s2,s3只是sudo代码,用于说明我打算在这个项目中做什么。脚本s1是使用球谐函数的环境照明脚本,脚本s2使用蒙特卡罗采样,脚本s3使用中值切割算法。这三个脚本在连接到摄像机时可以自行运行,但是当我尝试使用其他脚本控制它们时,在禁用它们之后,即使将它们设置为启用,脚本仍然无法正常运行。

2 个答案:

答案 0 :(得分:3)

您需要确保:

  • 三个脚本的类和脚本名称为Script1Script2Script3,即:public class Script1 : MonoBehaviour {}Script1.cs(区分大小写,请使用类名的首字母)。
  • 将所有三个脚本都指定为游戏对象的组件。
  • 您已通过Inspector在Control Script中正确分配了对所有这三个引用的引用,如下所示:enter image description here

它应该全部工作,你的控制脚本中的代码是可以的。

编辑:尝试在所有三个脚本中使用此代码,并查看在下拉列表中从选项A切换到B(或C等)时控制台中发生的情况(代码仅适用于Script1 ,编辑它为2和3 ofc)。

using UnityEngine;

public class Script1 : MonoBehaviour {

    private void OnEnable() {
        Debug.Log("Script 1 Activated");
    }

    private void OnDisable() {
        Debug.Log("Script 1 Deactivated");
    }
}

答案 1 :(得分:-1)

注意: *正如@Programmer所指出的,如果您尝试将该类用作GameObject的组件,那么您无法使用{创建它的实例{1}}你自己。因为那时new将无法知道它的核心方法如Unity将被调用。仅当您的求解目标是将脚本用作与Unity无关的普通Start,Update, OnXX类时,才应使用new

您不能将脚本本身作为变量的值。 “检查器”窗口中显示的变量需要对象。在脚本的情况下,它很容易,因为您可以调用其构造函数来实例化下面的实例

C#

但是,如果您尝试在类之间共享/* don't use `new` if scripts are inherited from MonoBehavior or are intended * to be managed by Unity. Instead use someGameObject.AddComponent<script1> * This will have to be done where script instance is created. * This instance can be accessed by using the method provided in the second * part of this answer. */ s1 = new script1(); s2 = new script2(); s3 = new script3(); 字段,则必须找到共享这些实例的方法。一种方法是将它们附加到空对象上,让我们调用它.enabled并将所有脚本附加到它上面。现在,您必须通过公开它的公共字段向OptionManager提供OptionManager的实例。之后,您可以在其组件中获得ControlScript,请参阅下面的示例

s1, s2, s3