2017-05-30 60 views
2

我有這個池腳本:爲什麼使用對象池並試圖將對象放置在地形上的隨機位置時,它不是隨機的?

​​

而且我在使用本腳本實例化對象。 它應該將物體放置在地形區域周圍的任意位置。 但是,相反,所有的對象都在x = 0,y = 20,z = 0的相同位置。根本不是隨機的。

using System; 
using UnityEngine; 
using Random = UnityEngine.Random; 
using System.Collections; 
using System.Collections.Generic; 
using System.Linq; 

public class InstantiateObjects : MonoBehaviour 
{ 

    public GameObject Spaceship; 
    public int spaceshipsStartingHeight = 20; 
    [HideInInspector] 
    public GameObject[] spaceships; 

    // for tracking properties change 
    private Vector3 _extents; 
    private int _spaceshipCount; 
    private float _spaceshipSize; 
    private List<int> randomNumbers = new List<int>(); 
    private ObjectPool bulletPool; 

    /// <summary> 
    ///  How far to place spheres randomly. 
    /// </summary> 
    public Vector3 Extents; 

    /// <summary> 
    ///  How many spheres wanted. 
    /// </summary> 
    public int SpaceShipCount; 
    public float SpaceShipSize; 

    // Use this for initialization 
    void Start() 
    { 
     rndNumbers(); 
     Clone(); 
     spaceships = GameObject.FindGameObjectsWithTag("SpaceShip"); 
    } 

    private void OnValidate() 
    { 
     // prevent wrong values to be entered 
     Extents = new Vector3(Mathf.Max(0.0f, Extents.x), Mathf.Max(0.0f, Extents.y), Mathf.Max(0.0f, Extents.z)); 
     SpaceShipCount = Mathf.Max(0, SpaceShipCount); 
     SpaceShipSize = Mathf.Max(0.0f, SpaceShipSize); 
    } 

    private void Reset() 
    { 
     Extents = new Vector3(250.0f, 20.0f, 250.0f); 
     SpaceShipCount = 100; 
     SpaceShipSize = 20.0f; 
    } 

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

    } 

    private void Clone() 
    { 
     if (Extents == _extents && SpaceShipCount == _spaceshipCount && Mathf.Approximately(SpaceShipSize, _spaceshipSize)) 
      return; 

     // cleanup 
     var ShipsToDestroy = GameObject.FindGameObjectsWithTag("SpaceShip"); 
     foreach (var t in ShipsToDestroy) 
     { 
      if (Application.isEditor) 
      { 
       DestroyImmediate(t); 
      } 
      else 
      { 
       Destroy(t); 
      } 
     } 

     var withTag = GameObject.FindWithTag("Terrain"); 
     if (withTag == null) 
      throw new InvalidOperationException("Terrain not found"); 

     bulletPool = new ObjectPool(Spaceship, SpaceShipCount); 

     for (var i = 0; i < SpaceShipCount; i++) 
     { 
      GameObject o = bulletPool.GetInstance(); 
      o.tag = "SpaceShip"; 
      o.transform.SetParent(base.gameObject.transform); 
      o.transform.localScale = new Vector3(SpaceShipSize, SpaceShipSize, SpaceShipSize); 

      // get random position 
      var x = Random.Range(-Extents.x, Extents.x); 
      var y = Extents.y; // sphere altitude relative to terrain below 
      var z = Random.Range(-Extents.z, Extents.z); 

      // now send a ray down terrain to adjust Y according terrain below 
      var height = 10000.0f; // should be higher than highest terrain altitude 
      var origin = new Vector3(x, height, z); 
      var ray = new Ray(origin, Vector3.down); 
      RaycastHit hit; 
      var maxDistance = 20000.0f; 
      var nameToLayer = LayerMask.NameToLayer("Terrain"); 
      var layerMask = 1 << nameToLayer; 
      if (Physics.Raycast(ray, out hit, maxDistance, layerMask)) 
      { 
       var distance = hit.distance; 
       y = height - distance + y; // adjust 
      } 
      else 
      { 
       Debug.LogWarning("Terrain not hit, using default height !"); 
      } 

      //o.transform.Rotate(0.0f,randomNumbers[i],0.0f); 
      // place ! 
      o.transform.position = new Vector3(x, y + spaceshipsStartingHeight, z); 
     } 

     _extents = Extents; 
     _spaceshipCount = SpaceShipCount; 
     _spaceshipSize = SpaceShipSize; 
    } 

    public void rndNumbers() 
    { 

    } 
} 
+1

你在哪裏以及如何設置位置? –

+0

@KevinGosse裏面的Clone方法在這部分我得到的位置//獲得隨機位置然後在底部附近設置位置:o.transform.position = new Vector3(x,y + spaceshipsStartingHeight,z); –

+0

@KevinGosse oops忘記添加第二個腳本,我放置對象。現在加入。 –

回答

1

答案是刪除Clone()中的整個// cleanUp部分。現在它使用池創建隨機對象。