C# 获取无休止对象生成的异常
我创造了一个无止境的跑步者,并为我的游戏随机制造障碍。发生的是我得到了以下例外,但这并不会影响到玩游戏那么多,如果我在android平台上实现它,最终会是一个问题吗 例外情况: ArgumentException:只能从主 线 加载场景时,将从加载线程执行构造函数和字段初始值设定项。 不要在构造函数或字段初始值设定项中使用此函数,而是将初始化代码移到Awake或Start函数中。 UnityEngine.Random.Range(Int32 min,Int32 max)(在C:/buildslave/unity/build/artifacts/generated/common/runtime/UnityEngineRandomBindings.gen.cs:30) 墙() 代码:C# 获取无休止对象生成的异常,c#,unity3d,C#,Unity3d,我创造了一个无止境的跑步者,并为我的游戏随机制造障碍。发生的是我得到了以下例外,但这并不会影响到玩游戏那么多,如果我在android平台上实现它,最终会是一个问题吗 例外情况: ArgumentException:只能从主 线 加载场景时,将从加载线程执行构造函数和字段初始值设定项。 不要在构造函数或字段初始值设定项中使用此函数,而是将初始化代码移到Awake或Start函数中。 UnityEngine.Random.Range(Int32 min,Int32 max)(在C:/buildsla
使用UnityEngine;
使用系统集合;
公共类墙:单一行为{
公共矢量点;
私人改造营地;
private int ranXpos=Random.Range(-5,6);
//用于初始化
void Start(){
transform.position=newvector3(ranXpos,spawnPoint.y,spawnPoint.z);
camPos=GameObject.Find(“主摄像机”).GetComponent();
}
//每帧调用一次更新
无效更新(){
transform.position+=Vector3.back;
if(transform.position.z
如何摆脱此异常?- 首先,如果您遇到异常,您不能再进一步,尽管它工作正常
- 其次,不能将
用作静态变量的初始值设定项 变量添加Random.Range
或Awake
方法并初始化 看你的代码,你能做的就是拆分你的代码Start
声明如下Random.Range
public class wall : MonoBehaviour { public Vector3 spawnPoint; private Transform camPos; private int ranXpos ; //MODIFICATION // Use this for initialization void Start () { ranXpos = Random.Range(-5,6); //MODIFICATION transform.position= new Vector3(ranXpos,spawnPoint.y,spawnPoint.z); camPos = GameObject.Find("Main Camera").GetComponent<Transform>(); } // Update is called once per frame void Update () { transform.position += Vector3.back; if(transform.position.z< camPos.position.z) { Destroy(gameObject); } } }
公共类墙:单一行为{ 公共矢量点; 私人改造营地; 私有int ranXpos;//修改 //用于初始化 无效开始(){ ranXpos=Random.Range(-5,6);//修改 transform.position=newvector3(ranXpos,spawnPoint.y,spawnPoint.z); camPos=GameObject.Find(“主摄像机”).GetComponent(); } //每帧调用一次更新 无效更新(){ transform.position+=Vector3.back; if(transform.position.z
- 首先,如果您遇到异常,您不能再进一步,尽管它工作正常
- 其次,不能将
用作静态变量的初始值设定项 变量添加Random.Range
或Awake
方法并初始化 看你的代码,你能做的就是拆分你的代码Start
声明如下Random.Range
public class wall : MonoBehaviour { public Vector3 spawnPoint; private Transform camPos; private int ranXpos ; //MODIFICATION // Use this for initialization void Start () { ranXpos = Random.Range(-5,6); //MODIFICATION transform.position= new Vector3(ranXpos,spawnPoint.y,spawnPoint.z); camPos = GameObject.Find("Main Camera").GetComponent<Transform>(); } // Update is called once per frame void Update () { transform.position += Vector3.back; if(transform.position.z< camPos.position.z) { Destroy(gameObject); } } }
公共类墙:单一行为{ 公共矢量点; 私人改造营地; 私有int ranXpos;//修改 //用于初始化 无效开始(){ ranXpos=Random.Range(-5,6);//修改 transform.position=newvector3(ranXpos,spawnPoint.y,spawnPoint.z); camPos=GameObject.Find(“主摄像机”).GetComponent(); } //每帧调用一次更新 无效更新(){ transform.position+=Vector3.back; if(transform.position.z
- 尝试使用
private int ranXpos = Random.Range(-5, 6);
内部start()
尝试使用
private int ranXpos = Random.Range(-5, 6);
在
start()
内部,您应该使用UnityEngine.Random.Range(int max,int min)函数。您应该使用UnityEngine.Random.Range(int max,int min)函数。感谢您的回答和解释。实际上,“ranXpos”成员不是静态的。使用引擎调用结果初始化它仍然有问题,因为引擎调用只允许在Unity主线程中进行。然而,Unity可能会将资产加载分派到后台线程中,资产加载还必须实例化MonoBehavior,然后调用引擎。这就是为什么会有Awake()和Start()方法。它们保证在Unity主线程中被调用,允许您使用Random和其他引擎api安全地初始化您的成员。感谢您的回答和解释。实际上,成员“ranXpos”不是静态的。使用引擎调用结果初始化它仍然有问题,因为引擎调用只允许在Unity主线程中进行。然而,Unity可能会将资产加载分派到后台线程中,资产加载还必须实例化MonoBehavior,然后调用引擎。这就是为什么会有Awake()和Start()方法。它们保证在Unity主线程中被调用,允许您使用Random和其他引擎api安全地初始化您的成员