2017-05-30 14 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

この部分のCloneメソッドの中の@KevinGosseは、位置を取得します。//ランダムな位置を取得してから、ボトム近くの位置を設定します。o.transform.position = new Vector3(x、y + spaceshipsStartingHeight、z); –

+0

@KevinGosse oopsは、オブジェクトの位置を指定する2番目のスクリプトを追加するのを忘れてしまった。今すぐ追加しました。 –

答えて

1

回答は、Clone()内の// cleanUp部分全体を削除することです。今では、プールを使ってランダムなオブジェクトを作成しています。

関連する問題