2016-06-20 30 views
0

So habe ich ein einfaches Projekt, wo ich ein Spielbrett aus mehreren Quadraten zu machen, und es hat ein Gitter, das ein- oder ausgeschaltet werden kann.Unity make instanziiert Objekt toggle erscheinen oder verschwinden

Leider funktioniert es nicht so. Hier ist mein Board Manager Code:

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

namespace BoardHandle { 
    [RequireComponent(typeof(SpriteRenderer))] 
    public class BoardManager : MonoBehaviour { 

     //2d list that represents the board 
     List<List<GameObject>> board = new List<List<GameObject>>(); 

     //Gamebjects import 
     public GameObject GrassTile; 
     public GameObject Grid; 

     //UI buttons import 
     public Toggle GridToggle; 

     //Miscellanious variables that could be edited in inspector 
     public int rows; 
     public int cols; 
     public float tileWidth; 
     public float tileHeight; 


     void Start() { 

      GrassTile.transform.localScale = new Vector3 (tileWidth, tileHeight, 0f); 
      Grid.transform.localScale = new Vector3 (tileWidth, tileHeight, 0f); 

      //Adds all of the stuff to the game board 
      for (int x = 0; x < cols; x++) { 
       board.Add (new List<GameObject>()); 
       for (int y = 0; y < rows; y++) { 
        board [x].Add (GrassTile); 
       } 
      } 


      //Makes board bits all go to the screen 
      for (int x = 0; x < board.Count; x++) { 
       for (int y = 0; y < board[x].Count; y++) { 

        //Makes the grid. And it stays there currently until the game ends. 
        Instantiate (Grid, 
           new Vector3 (x * tileWidth, y * tileHeight, 0), 
           Quaternion.identity); 

        //This is the actual board, filled with grass tiles. I wnat to keep this. 
        Instantiate (board [x] [y], 
           new Vector3 (x * tileWidth, y * tileHeight, 0), 
           Quaternion.identity); 
       } 
      } 
     } 


     void Update() { 

     } 


    } 
} 

Meine Spielprogrammierung Erfahrung ist von Pygame. In Pygame muss sich der Hintergrund ständig über sich selbst regenerieren. Wenn ich also das Gitter verschwinden lassen will, muss ich es nur einmal pro Frame und einen Frame später blitzen lassen. Da Objekte in der Einheit verschoben werden können, ohne den Hintergrund im Code neu generieren zu müssen, bleibt das Raster nach nur einer Instanziierung erhalten. Ich möchte nur eine Möglichkeit kennen, dass, wenn GridToggle.isOn wahr ist, das Gitter instanziiert wird und dort bleibt, bis GridToggle.isOn falsch ist, wenn das Gitter nicht mehr da ist, bis es wieder eingeschaltet wird. Vielen Dank!

Antwort

1

In Unity können GameObjects deaktiviert und Komponenten deaktiviert werden.

Wenn ein GameObject deaktiviert ist, wird es als "nicht vorhanden" betrachtet. Wenn Sie nur das Rendering deaktivieren möchten, können Sie alternativ auch die Renderer-Komponente der Kacheln deaktivieren. Klingt wie die erste Option ist, was Sie wollen.

Das Deaktivieren eines GameObject deaktiviert auch seine untergeordneten GameObjects. Um die Platine und ihren Inhalt zu deaktivieren, würde ich vorschlagen, die instanziierten Objekte als Kinder des Boards zu haben. Sie können dies durch die Transformation des Gameobject:

instantiatedGameObject.transform.parent = this.transform; 

Da Sie Toggle verwenden, können Sie einen Ereignis-Listener es könnte hinzufügen:

GridToggle.onValueChanged.AddListener((value) => this.SetActive(value)); 
+0

Ich werde dies versuchen. Vielen Dank! – Demandooda

+0

Kühl. Aber ich frage mich, wie kann ich den Renderer remote von einem anderen Skript deaktivieren. Das Raster wird von einem separaten Skript verwaltet und ist ein Prefab. – Demandooda

+0

Also statt der Toggle wollen Sie es mit einem anderen Skript steuern? Wenn Sie mit dem BoardHandle einen Verweis auf das GameObject haben, können Sie es einfach vom anderen Skript aus deaktivieren. – Lof