【发布时间】:2019-12-17 22:26:13
【问题描述】:
我正在尝试在另一个 c# 脚本中调用一个函数,该函数附加到我场景中的另一个游戏对象。我正在Grounded 中创建脚本LevelChanger 的一个实例,如下所示:
LevelChanger levelChanger;
那么,在Awake()函数中:
GameObject gameObject = new GameObject("LevelChanger");
levelChanger = gameObject.AddComponent<LevelChanger>();
然后在IEnumerator 中这样调用:
levelChanger.FadeOut(true); // line 178
那么这是LevelChanger类:
using System.Collections;
using UnityEngine;
public class LevelChanger : MonoBehaviour
{
public Animator animator;
public void FadeOut(bool fadeIn)
{
animator.SetBool("Fade", true); // line 10
if (fadeIn) StartCoroutine(FadeInAsWell());
}
IEnumerator FadeInAsWell()
{
yield return new WaitForSeconds(0.9f);
animator.SetBool("Fade", false);
}
}
我已经尝试解决这个问题很长一段时间了,我到处检查(here、here、here、here 和其他网站)。我看到因为我的LevelChanger脚本附加到一个游戏对象,所以它是MonoBehaviour,不可能从另一个脚本创建类的实例,像这样:
LevelChanger levelChanger = new LevelChanger();
或者像我一开始这样的“正常”:
LevelChanger levelChanger;
然后像调用它的函数
levelChanger.FadeOut(true);
大多数情况下,我在运行时(第 176 行)得到 NullReferenceException,现在直接在 LevelChanger 脚本中(第 10 行)。
目前,我真的不知道如何解决这个问题:有人知道如何解决吗? (我还是个初学者)。
提前致谢!
【问题讨论】:
-
当组件仅在运行时创建时,您是如何将其附加到检查器中的?
-
AddComponent创建一个 new 组件 - 您在检查器中分配的任何内容指的是与您的代码创建的组件不同的组件 -
那你为什么要这样做?
GameObject gameObject = new GameObject("LevelChanger"); -
@EnricoCortinovis 好的,
new GameObject()所做的是创建一个新的空游戏对象。它存在于场景中,通常在原点。它有一个变换,没有别的。AddComponent向该游戏对象添加一个组件。所以你所做的就是用你的组件LevelChanger的实例创建了一个新的游戏对象。因为这些都是全新的对象,它们的检查器引用没有设置,所以 animator 为空。如果您想在编辑时获取场景中的预制件实例,请考虑使用检查器引用。 -
您在检查器中编辑的
LevelChanger实例与您使用gameObject.AddComponent<LevelChanger>();创建的实例完全不同。