2015-12-25 1 views
0

Я создаю бесконечный бегун и произвольно создаю препятствия для своей игры. Что происходит, я получаю следующее исключение, но это не влияет на то, чтобы играть в эту игру, будет ли это проблемой в конце, если я реализую его на платформе Android?Получение исключения из бесконечного генерации объектов

Исключение:

ArgumentException: RandomRangeInt можно назвать только из главного нити. Конструкторы и инициализаторы полей будут выполняться из загрузочной нити при загрузке сцены. Не используйте эту функцию в инициализаторах конструктора или поля, вместо этого переместите код инициализации в функцию Awake или Start. 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 в качестве инициализатора для статической переменной . Добавить Awake или Start метод и инициализировать 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, который затем вызовет движок. Вот почему существуют методы Awake() и Start(). Они гарантированы для вызова в основном потоке Unity, что позволяет вам безопасно инициализировать своих членов с помощью Random и другого движка api. –

+0

Благодарим за предоставление дополнительной информации. (Y) – AVI

2

Попробуйте использовать,

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

in start()

+0

Спасибо за ответ –

Смежные вопросы