2016-10-05 84 views
0

它確實工作過,但我不知道現在有什麼問題。 在層次結構中,我有一個GameObject,我將它重命名爲Sphere。這個球體被標記爲球體。爲什麼所有克隆的對象都不是gameobject Sphere下的子對象?

但運行遊戲時,所有克隆的對象都在層次結構中,而不是Sphere內的子對象。運行遊戲時,球體自身消失。

這是球遊戲物體的截圖運行遊戲之前: 腳本球生成器連接到球:

​​

這張截圖是運行遊戲時: 所有克隆應該是下球遊戲對象:

When Running

這是腳本:

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

public class SphereBuilder : MonoBehaviour 
{ 
    public GameObject SpaceShip; 

    // for tracking properties change 
    private Vector3 _extents; 
    private int _sphereCount; 
    private float _sphereSize; 

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

    /// <summary> 
    ///  How many spheres wanted. 
    /// </summary> 
    public int SphereCount; 
    public float SphereSize; 

    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)); 
     SphereCount = Mathf.Max(0, SphereCount); 
     SphereSize = Mathf.Max(0.0f, SphereSize); 
    } 

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

    private void Update() 
    { 
     UpdateSpheres(); 
    } 

    private void UpdateSpheres() 
    { 
     if (Extents == _extents && SphereCount == _sphereCount && Mathf.Approximately(SphereSize, _sphereSize)) 
      return; 

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

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

     for (var i = 0; i < SphereCount; i++) 
     { 
      var o = Instantiate(SpaceShip); 
      o.tag = "Sphere"; 
      o.transform.localScale = new Vector3(SphereSize, SphereSize, SphereSize); 

      // 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 !"); 
      } 

      // place ! 
      o.transform.position = new Vector3(x, y, z); 
     } 

     _extents = Extents; 
     _sphereCount = SphereCount; 
     _sphereSize = SphereSize; 
    } 
} 

回答

1

實例化對象後,設置變換父項。

o.transform.SetParent(gameObject.transform); 
+0

如果我想SetParent使用標籤例如,如果我將腳本附加到MainCamera但我希望該對象將GameObject下名稱球體? –

+0

如果您有權訪問GameObject(您可以將其作爲SphereBuilder腳本中的公共對象添加),那麼您可以使用o.transform.SetParent(spheres.transform); –

+0

好吧,這是工作:o.transform.SetParent(spheres.transform);但只有當我使GameObject球體無標記。但我希望它被標記,因爲我想從另一個類中獲取所有克隆的對象。爲什麼當我將Spheres GameObject標記爲Sphere時,它會被銷燬? –