2017-05-24 14 views
-1

在層次結構中我有一個畫布,在它下面我有一個用戶界面按鈕和用戶界面切換。在按鈕上,我附上了一個帶有onclick事件的腳本。如何使用ui按鈕和ui在腳本中切換來創建/銷燬另一個腳本上的對象?

這個想法是當我點擊按鈕取決於切換狀態false/true決定是否創建更多的gameobjects或首先銷燬所有舊的gameobjects並創建新的。

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

public class GenerateObjectsButton : MonoBehaviour 
{ 
    private InstantiateObjects instantiateobjects; 
    private bool toggleOnOf; 
    public Toggle toggle; 

    private void Start() 
    { 
     instantiateobjects = new InstantiateObjects(); 
     toggle.onValueChanged.AddListener((value) => 
      { 
       MyListener(value); 
      }); 
    } 

    public void MyListener(bool value) 
    { 
     if (value) 
     { 
      //do the stuff when the toggle is on 
      toggleOnOf = true; 
     } 
     else 
     { 
      //do the stuff when the toggle is off 
      toggleOnOf = false; 
     } 
    } 

    public void OnButton() 
    { 
     if (toggleOnOf == false) 
     { 
      instantiateobjects.generateObjectOnTerrain(); 
     } 
     else 
     { 
      instantiateobjects.DestroyObjects(); 
      instantiateobjects.generateObjectOnTerrain(); 
     } 
    } 
} 

的InstantiateObjects腳本:

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; 
    public bool randomScale = false; 
    public float setRandScaleXMin, setRandScaleXMax; 
    public float setTandScaleYMin, setTandScaleYMax; 
    public float setTandScaleZMin, setRandScaleZMax; 
    public bool generateNew; 

    private float terrainWidth; 
    private float terrainLength; 
    private float xTerrainPos; 
    private float zTerrainPos; 
    private int numberOfObjectsToCreate; 
    private GameObject objInstance; 
    private GameObject[] createdObjects; 
    private string objname; 

    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; 

     objname = prefab.name; 
     MyCustomEditor.TagsAndLayers.AddTag(objname); 

     generateNew = false; 
     generateObjectOnTerrain(); 
    } 

    public void Update() 
    { 

    } 

    public void DestroyObjects() 
    { 
     if (createdObjects != null && createdObjects.Length > 0) 
     { 
      for (int i = 0; i < createdObjects.Length; i++) 
      { 
       DestroyImmediate(createdObjects[i]); 
      } 
      createdObjects = new GameObject[0]; 
     } 
    } 

    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)); 

      //Generate random x,y,z scale on the terrain 
      float randScaleX = Random.Range(setRandScaleXMin, setRandScaleXMax); 
      float randScaleY = Random.Range(setTandScaleYMin, setTandScaleYMax); 
      float randScaleZ = Random.Range(setTandScaleYMax, setRandScaleZMax); 

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

      //Generate the Prefab on the generated position   
      objInstance = Instantiate(prefab, new Vector3(randX, yVal, randZ), Quaternion.identity); 

      if (randomScale == true) 
       objInstance.transform.localScale = new Vector3(randScaleX, randScaleY, randScaleZ); 

      if (parent) 
       objInstance.transform.parent = this.transform; 

      objInstance.tag = objname; 
     } 

     createdObjects = GameObject.FindGameObjectsWithTag(objname); 
    } 
} 

我面對現在的問題是:

在InstantiateObjects當我按一下按鈕我得到就行空例外:

createdObjects = GameObject.FindGameObjectsWithTag(objname); 

createdObjects爲空。除了我第一次運行遊戲,它不是空的,但每次當我點擊按鈕它是空的。

第二個問題是,我需要將切換狀態更改爲false,然後單擊該按鈕true單擊按鈕false單擊該按鈕,然後纔得到DestroyObjects方法。

回答

0

它可能不會更新數組,因爲引用是相同的。在每次迭代開始時將數組重置爲null並查看是否有效。

+0

問題是在這一行不知道爲什麼:第一次我運行遊戲時,objectsToInstantiate的值是5,因爲它在檢查器中設置。但是,每次我點擊按鈕,無論切換狀態objectsToInstantiate的值是0.不知道爲什麼它是0時,我點擊按鈕。 –

+0

關於將其重置爲null,每次迭代都不能解決null問題。也許它是null,因爲objectsToInstantiate值是0.不確定。 –

相關問題