在我的Unity3d游戏中,我有2节课。其中一个ActsGeneral
初始化变量gameManagerScript
而另一个Act_0
尝试访问它。
类GameManager
存储在object中,该对象仅存在于第一个场景中。我使用函数DontDestroyOnLoad()
在其他场景中使用此类。因此,访问变量gameManagerScript
的唯一方法是使用函数FindGameObjectWithTag
。但是当我开始模拟时,Find
没有时间找到gameManagerObject
。在这里,我有错误。
Script Execution Order Settings也没有帮助。我应该检查对象是否等于null
?
Class ActsGeneral
void Awake()
{
gameManagerObject = GameObject.FindGameObjectWithTag("GameManager");
gameManagerScript = gameManagerObject.GetComponent<GameManager>();
}
班级 Act_0
void Start()
{
// error: Object reference not set to an instance of an object
if (actsGeneral.gameManagerScript.currentActNumber == currentLocalActNumber)
{
}
}
EDIT1
我让Find
函数有更多时间来查找对象gameManagerObject
,但现在我仍然有错误。所有对象和组件都已启用,我设置了脚本执行顺序设置。但它仍然无法奏效。我只是不明白其原因。
void Start()
{
StartCoroutine("StartDelay");
}
IEnumerator StartDelay()
{
yield return new WaitForSeconds(1.5f);
if (actsGeneral.gameManagerScript != null)
if (actsGeneral.gameManagerScript.currentActNumber == currentLocalActNumber)
{
Debug.Log("222");
}
}
答案 0 :(得分:3)
当您尝试从另一个场景中的另一个类访问数据时,最简单的方法是使用单例模式。
首先将此脚本添加到您的proyect:
using UnityEngine;
public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
private static T instance;
/**
Returns the instance of this singleton.
*/
public static T Instance
{
get
{
if (instance == null)
{
instance = (T)FindObjectOfType(typeof(T));
if (instance == null)
{
Debug.LogError("An instance of " + typeof(T) +
" is needed in the scene, but there is none.");
}
}
return instance;
}
}
}
其次将此添加到您的 ActsGeneral 类。
using UnityEngine;
public class ActsGeneral : Singleton<ActsGeneral> {
...
在您的班级 Act_0 来自其他场景
public class Act_0 : MonoBehaviour {
ActsGeneral ac;
..
void Start()
{
ac = ActsGeneral.Instance;
//Do something with ac ....
}
请记住,带有ActsGeneral脚本的GameObject必须在load属性上不要销毁,并且必须在第一个加载的场景中。
如果这不起作用,问题出在 ActsGeneral 脚本的Awake事件中,因此您可以为此更改它:
void Awake()
}
gameManagerScript = GameManager.Instance;
}
并在 GameManager 脚本
中using UnityEngine;
public class GameManager : Singleton<GameManager> {
...