2015-12-25 65 views
0

我正在創造一個無盡的亞軍,併爲我的遊戲隨機生成障礙。發生什麼事情是我得到下面的異常,但這並不影響玩這個遊戲那麼多,會不會是一個問題最後,如果我將它實現到android平臺?在無盡的對象上生成例外

例外:

的ArgumentException:RandomRangeInt只能從主 線程調用。 加載場景時將從加載線程執行構造函數和字段初始值設定項。 不要在構造函數或字段初始值設定項中使用此函數,而應將初始化代碼移動到喚醒或啓動函數。 UnityEngine.Random.Range(的Int32分鐘,最大的Int32)(在C:/buildslave/unity/build/artifacts/generated/common/runtime/UnityEngineRandomBindings.gen.cs:30) wall..ctor()

代碼:

using UnityEngine; 
using System.Collections; 

public class wall : MonoBehaviour { 
public Vector3 spawnPoint; 
private Transform camPos; 
private int ranXpos = Random.Range(-5,6); 

    // Use this for initialization 
    void Start() { 
     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); 
     } 
    } 
} 

如何從這個異常了嗎?

+0

你應該使用UnityEngine.Random.Range(int max,int min)函數。 –

回答

3
  • 首先,如果你得到一個異常,你不能再進一步,雖然它工作正常。
  • 其次您不能將Random.Range用作靜態 變量的初始值設定項。添加AwakeStart方法和初始化 there.By看你的代碼,你可以做的是分裂您 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); 
          } 
         } 
        } 
    
+0

感謝您的回答和解釋。 –

+0

其實,成員「ranXpos」不是靜態的。使用引擎調用結果初始化它仍然可能會有問題,因爲引擎調用只能在Unity主線程中使用。然而,Unity可能會將資產加載到後臺線程中,並且資產加載也必須實例化MonoBehaviours,MonoBehaviours然後將調用引擎。這就是爲什麼有Awake()和Start()方法。他們保證在主Unity線程中被調用,允許您使用Random和其他引擎API安全地初始化您的成員。 –

+0

感謝您提供更多信息。 (Y) – AVI

2

嘗試使用,

private int ranXpos = Random.Range(-5, 6); 

裏面start()

+0

感謝您的回答 –