2016-11-11 3 views
3

Es klingt vielleicht dumm, aber wie kann ich eine Klasse von einem Skript in Kind in einem anderen Skript in Eltern verweisen? Ich kann nichts auf Google finden. Hinweis: Es gibt paar Fehler in meinem Skript, das ist nicht der Punkt des Posts.Wie eine Klasse von Kind zu Eltern verweisen?

//Public 

//Private 
private Rigidbody myRigidbody; 
private Renderer myRenderer; 
private Material tileDefaultMaterial; 
private Material tileSelectedMaterial; 
private Material tileSameGroupMaterial; 

void Start() { 
    myRigidbody = GetComponent<Rigidbody>(); 
    myRenderer = GetComponent<Renderer>(); 
    tileDefaultMaterial = Resources.Load ("TileDefault", typeof(Material)) as Material; 
    tileSelectedMaterial = Resources.Load ("TileSelected", typeof(Material)) as Material; 
    tileSameGroupMaterial = Resources.Load ("TileSameGroup", typeof(Material)) as Material; 
} 

void Update() { 

} 

public class TileClass { 

    public int tileGroup = 0; //Indicates the Tile Group Number. 

} 

//Public 
public GameObject[] allTiles; //Aray of all Tile GameObject. 
public bool tileIsSelected = false; //If a Tile is Selected. 
public int selectedTileGroup = 0; //Indicates the Selected Tile Group Number. 
public int tileGroup = 0; //Indicates the Tile Group Number. 



//Private 


void Start() { 

    allTiles = new GameObject[transform.childCount]; 
    for(int i = 0; i < transform.childCount; i++){ 
     allTiles [i] = transform.GetChild (i).gameObject; 
    } 
} 

void Update() { 

} 

void OnMouseDown(){ 

    RaycastHit hitInfo = new RaycastHit(); 
    bool hit = Physics.Raycast (Camera.main.ScreenPointToRay (Input.mousePosition), out hitInfo); 

    if (hitInfo.transform.gameObject.tag == "Tile" && tileIsSelected == false) { 
     Debug.Log ("A Tile is Selected!"); 
     tileIsSelected = true; 
     selectedTileGroup = ; 
     for(int i = 0; i < allTiles.Length; i++){ 
      if (this.tileGroup == selectedTileGroup) { 
       allTiles [i].GetComponent<Renderer>().material = tileSameGroupMaterial; 
      } 
     } 
     myRenderer.material = tileSelectedMaterial; 
    } else if (hitInfo.transform.gameObject.tag == "Tile" && tileIsSelected == true) { 
     Debug.Log ("Second Tile is Clicked! (Should Swap them!)"); 
     myRenderer.material = tileDefaultMaterial; 
    } 
} 
+0

Sie können das nicht tun. Ihre Klasse erbt bereits von MonoBehaviour. Was genau möchten Sie erreichen? –

+2

Bitte geben Sie keinen Code als Bilder an. Siehe http://meta.stackoverflow.com/questions/303812/discourage-screenshots-of-code-and-or-errors – gus27

+0

Ich möchte eine Klasse mit einigen Variablen für jede Kachel erstellen und sie dann aus dem Manager-Skript verwalten. Ich bin mir nicht sicher, ob das der beste Weg ist. Ich bin neu in C# und Unity. – N1ckGreek

Antwort

4

Es gibt einen berühmten Ausspruch:

var allTiles = transform.GetComponentsInChildren<Tile>(); 

Und wie ich Ihnen gestern gesagt, hinzufügen OnMouseDown() in Tile.cs und schreiben myRenderer.material = tileDefaultMaterial; dort . Keine Notwendigkeit, dies in TileManager.cs zu schreiben. Und keine Notwendigkeit, Raycast zu verwenden, wenn Sie OnMouseDown() verwenden.

+0

Ich habe versucht, meinen Code in Tile.cs zu haben, aber ich kann Dinge wie tileIsSelected oder selectedTileGroup nicht verwalten, weil ich dieses Skript in allen meinen Kacheln habe. Wenn ich zum Beispiel eine Kachel wähle und dann auf einen leeren Platz klicke, möchte ich, dass kachelIselected auf allen Kacheln falsch ist, oder wenn ich auf eine Kachel mit Gruppennummer 1 klicke, möchte ich das Material auf allen Kacheln mit derselben Gruppennummer ändern. Ich denke, es sollte einfacher sein, wenn ich den Code in TileManager.cs hatte. – N1ckGreek

+0

Das macht jetzt Sinn. –

-4

Wie wäre es mit base.Methode?

das tun soll es

+0

Patrick Hoffman bearbeite meine Antworten nicht mit nutzlosen Änderungen. Vielen Dank. –

+0

Ich glaube nicht, dass dies eine Vererbungsfrage ist - er spricht über die Eltern/Kind-Beziehungen in der Unity-Transformationshierarchie. – Serlite

1

ich nicht Ihren Bildcode lesen kann, also wird ich meine eigenen Klassennamen für das Beispiel bilden. Ich rufe die Elternklasse TileManager und die Kindklasse Tile an.

Sagen Sie in Tile möchten Sie Zugriff auf das Array von Fliesen in der TileManager. Wenn allTiles als öffentlich deklariert ist, würden Sie in Tile irgendwo tun.

TileManager tileManager = transform.parent.GetComponent<TileManager>(); 
var allTiles = tileManager.allTiles; 

Nun ist die Tile Kind hat einen Verweis auf das Array. War das, was du wolltest?

Verwandte Themen