我正在编写一个脚本来控制场景的环境照明。我有一个下拉列表和三个脚本,用于不同的环境照明,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使用中值切割算法。这三个脚本在连接到摄像机时可以自行运行,但是当我尝试使用其他脚本控制它们时,在禁用它们之后,即使将它们设置为启用,脚本仍然无法正常运行。
答案 0 :(得分:3)
您需要确保:
Script1
,Script2
和Script3
,即:public class Script1 : MonoBehaviour {}
和Script1.cs
(区分大小写,请使用类名的首字母)。Control Script
中正确分配了对所有这三个引用的引用,如下所示: 它应该全部工作,你的控制脚本中的代码是可以的。
编辑:尝试在所有三个脚本中使用此代码,并查看在下拉列表中从选项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