2016-05-20 3 views
0

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

using UnityEngine; 
using System.Collections; 

public class Spawner : MonoBehaviour { 
// Use this for initialization 
    void Start() { 
     InvokeRepeating ("SpawnAThing", 3.0f, 3.0f); 
    } 

// Update is called once per frame 
    void Update() { 

    } 
    void SpawnAThing(){ 
     GameObject x=null; 
     int z = Random.Range (0, 2); 
     switch (z) { 
     case 0: 
      x = (GameObject)Instantiate(Resources.Load("BadCircle"));; 
      break; 
     case 1: 
      x = (GameObject)Instantiate(Resources.Load("GoodCircle")); 
      break; 
     } 
     x.transform.position.Set (Random.Range (-Screen.width, Screen.width), Random.Range (-Screen.height, Screen.height), 0.0f); 
    } 
} 

ответ

3

Ваш код не работает должным образом из-за использования transform.position.Set()

position.Set() не может изменить положение, потому что он не возвращает ссылку на эту позицию. Он возвращает копию.

Изменить преобразование непосредственно x.transform.position = new Vector3(x,y,z);

Так все, что вам нужно сделать, это заменить

x.transform.position.Set (Random.Range (-Screen.width, Screen.width), Random.Range (-Screen.height, Screen.height), 0.0f); 

с

x.transform.position = new Vector3(Random.Range(-Screen.width, Screen.width), Random.Range(-Screen.height, Screen.height), 0.0f); 

EDIT:

Вы не можете увидеть это теперь, потому что Screen.width и Screen.height находятся слишком далеко от экрана. Вы должны преобразовать вид в мире точка с , то вы можете использовать в представлять экран с 0,5 является средней точкой. Если вы его не видите, уменьшите 15, которые передаются по оси Z.

x.transform.position = Camera.main.ViewportToWorldPoint(new Vector3(Random.Range(0f, 1f), Random.Range(0f, 1f), Camera.main.nearClipPlane + 15f)); 
+0

Теперь код doesnt't работа на всех :( – VolcanicTitan

+0

@VolcanicTitan Это не работает, потому что это право изменить преобразование. Причина, по которой вы не видите объект, состоит в том, что ваше случайное число находится вне поля зрения/экрана. Вы можете это доказать, запустив программу, выбрав один экземпляр объекта, перейдите в режим просмотра сцены и нажмите F. Вы найдете его в другом случайном месте. Ваши позиции отключены от экрана. Это 3D или 2D-объект? – Programmer

+1

Никогда не использовал единство - что означает, что я могу быть вне базы, но случайное число между шириной и шириной похоже на то, что оно будет отключено от экрана в полтора раза. Соедините это с высотой, и это будет вне экрана 3/4 времени. Не должно быть '(0, width)' и аналогичным образом '(0, height)'? Я понимаю, что это было исходное определение, предоставленное OP, но, возможно, это является причиной нерабочего кода для этого решения. – Rob

0

Создать GameObject и переименовать его в «SpawnController» и присоединить этот скрипт:

using UnityEngine; 

    public class SpawnController : MonoBehaviour { 

     //Set at inspector new Min and Max X axis Range. 
     public float maxWidth; 
     public float minWidth; 

     //Set at inspector new Min and Max Y axis Range 
     public float maxHeight; 
     public float minHeight; 

     //Set at inspector new Min and Max Z axis Range (3D game) 
     public float maxDepth; 
     public float minDepth; 

     //Set the time at inspector you want the object to be created eg: every 10 seconds 
     public float rateSpawn; 

     private float currentRateSpawn; 

     // Drag to inspector your gameObject what you want instatiate 
     public GameObject gameObject; 

     void Update() { 

      currentRateSpawn += Time.deltaTime; 
      if (currentRateSpawn > rateSpawn) { 
       currentRateSpawn = 0; 
       Spawn(); 
      } 
     } 

     private void Spawn() { 


      //Define new (Min and Max) range values for the Vector3 AXIS 
      float randWitdh = Random.Range(minWidth, maxWidth); 
      float randHeight = Random.Range(minHeight, maxHeight); 
      float randDepth = Random.Range(minDepth, maxDepth); 

      //Vector3 now has a new random range value 
      Vector3 random = new Vector3(randWitdh, randHeight, randDepth); 

      //Object will dynamically instantiate according to the values established in the inspector 
      Instantiate (gameObject, random, Quaternion.identity); 
     } 
    } 
Смежные вопросы