2017-05-20 2 views
-1

내가 원하는 것은 inspector에서 생성 할 객체의 수를 변경 한 다음 모든 기존 객체를 먼저 삭제 한 다음 새 객체 수를 만드는 경우입니다. 어떻게 새 개체를 만들기 전에 모든 개체를 삭제할 수 있습니까?

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

    [ExecuteInEditMode] 
    public class InstantiateObjects : MonoBehaviour 
    { 
     public GameObject prefab; 
     public Terrain terrain; 
     public float yOffset = 0.5f; 
     public int objectsToInstantiate; 
     public bool parent = true; 

     private float terrainWidth; 
     private float terrainLength; 
     private float xTerrainPos; 
     private float zTerrainPos; 
     private int numberOfObjectsToCreate; 
     private GameObject objInstance; 

     public void Start() 
     { 
      //Get terrain size 
      terrainWidth = terrain.terrainData.size.x; 
      terrainLength = terrain.terrainData.size.z; 

      //Get terrain position 
      xTerrainPos = terrain.transform.position.x; 
      zTerrainPos = terrain.transform.position.z; 

      numberOfObjectsToCreate = objectsToInstantiate; 
      generateObjectOnTerrain(); 
     } 

     private void Update() 
     { 
      if (numberOfObjectsToCreate != objectsToInstantiate) 
      { 
       for (int i = 0; i < objectsToInstantiate; i++) 
       { 
        Destroy(objInstance); 
       } 
        generateObjectOnTerrain(); 
      } 

     } 

     public void generateObjectOnTerrain() 
     { 
      for (int i = 0; i < objectsToInstantiate; i++) 
      { 
       //Generate random x,z,y position on the terrain 
       float randX = UnityEngine.Random.Range(xTerrainPos, xTerrainPos + terrainWidth); 
       float randZ = UnityEngine.Random.Range(zTerrainPos, zTerrainPos + terrainLength); 
       float yVal = Terrain.activeTerrain.SampleHeight(new Vector3(randX, 0, randZ)); 

       //Apply Offset if needed 
       yVal = yVal + yOffset; 

       //Generate the Prefab on the generated position   
       objInstance = Instantiate(prefab, new Vector3(randX, yVal, randZ), Quaternion.identity); 
       objInstance.name = "Teleportation Booth"; 
       if (parent) 
        objInstance.transform.parent = this.transform; 
      } 
     } 
    } 

는 Inspector에서 변수를 만들 개체의 수를 설정하는 것입니다 :

public int objectsToInstantiate; 
이 변수는 개체의 새 번호를 생성 할 경우 변경 사항이 있다면 확인하는 헬퍼해야

검사관에서 변경되었습니다.

private int numberOfObjectsToCreate; 

그리고 업데이트 기능의 코드는 변경되지 않습니다. inspector에 새로운 값을 입력하면 아무것도 변하지 않습니다.

+0

개체를 만들 때 Instantiate를 사용해서는 안됩니다. 먼저 개체를 미리 정의한 풀 컨트롤러에서 이전 개체로 대체 할 수 있습니다. 미리 정의 된 개체 수를 가지며 필요한 경우 더 많은 개체가 만들어 지지만 그렇지 않은 경우, 그것만이 사용하지 않는 객체의 속성을 변경합니다. 이것을 사용하면 메모리 누수를 없앨 수 있습니다. (이 문제에서) –

+0

@ArtemLayko 저는 기존의 object 객체를 복제하고 싶다는 것을 잊어 버렸습니다. 그래서 Instantiate를 사용하고 있습니다. 하지만 복제하고 싶거나 새로운 객체를 만들려면 어떻게해야합니까? –

+0

개체 풀 사용 – Bijan

답변

-1

변경 Destroy(objInstance);에서 DestroyImmediately(objInstance);으로 변경해야합니다.

그러나 update에서 새 개체를 제거하고 추가하는 것은 좋지 않습니다. 특정 개체를 추가/제거하기 위해 개체 풀을 유지하려고 시도 할 수 있으며 한 개체에서 많은 개체가 제거/추가되는 경우에만 일괄 처리를 수행해야합니다.

관련 문제