2016-05-21 15 views
2

Ich habe ein Spielobjekt namens "Student", das ein Skript angehängt hat, dann dupliziere ich es manuell (Strg + D), so dass jedes duplizierte Schülerobjekt dasselbe Skript hat Komponente. hier ist das Skript (nicht voll, weil zu lang)Prüfe den Wert einer Variablen von jedem Spielobjekt, das mit einem Skript verbunden ist

public class StudentScript : MonoBehaviour { 

private Animator animator; 
float sec; 
public int m; 
public GameManage gm; 

void Start() { 
    animator = GetComponent<Animator>(); 
    sec = 0f; 
    m = 0; 
} 

void Update() { 
    sec+=Time.deltaTime; 
    if (m == 5 && animator.GetInteger ("Behav") == 0) { 
     animator.SetTrigger ("Finish"); 
    } 
} 

//this is called from another script 
public void ResetStudentBehaviour(){ 
    if (animator.GetInteger ("Behav") != 0) { 
     animator.SetInteger ("Behav", 0); 
     sec = 0f; 
     if (m < 5) { 
      m++; 
     } 
    }else 
     Debug.Log ("student done <3"); 
} 
} 

i => will, wenn jeder Student m Wert m == 5 hat, dann Spiel beendet. was ich habe, ist bisher getan StudentScript von GameManage Skript aufgerufen (öffentlich, so habe ich die ganze Instanz manuell eingestellt), dann wird der Wert von m von jedem Schüler überprüfen

public StudentScript stu1, stu2; 
void Update() { 
    if (stu1.m == 5 && stu2.m == 5) { 
     StartCoroutine (ChangeScene()); 
    } 
} 
IEnumerator ChangeScene(){ 
    yield return new WaitForSeconds (10); 
    SceneManager.LoadScene(5); 
} 

gibt es eine einfache Möglichkeit zu überprüfen, m Wert aller Schüler Objekt ohne if (stu1.m == 5 && stu2.m == 5) zu verwenden, da in jeder Ebene, die Zahl der Schüler unterschiedlich ist, so möchte ich für alle Level ein dynamisches Skript machen

Antwort

4

ich ein List<> verwenden würde, und fügen sie alle Ihre StudentScript Objekte zu. Dann könnten Sie 's All Methode verwenden, um alle Elemente in der Liste zu überprüfen.

using System.Linq 

//Add all your StudentScript objects to this list 
List<StudentScript> studentScripts = new List<StudentScript>(); 

if(studentScripts.All(x => x.m == 5)) 
{ 
    StartCoroutine (ChangeScene()); 
} 

Auf diese Weise können StudentScripts.Add() die Skripte hinzufügen können, und es kann jeder Größe und alle Elemente geprüft werden, noch werden. Der x => x.m == 5 Teil wird als Lambda-Ausdruck bezeichnet (nur, wenn Sie es nicht wussten). Es ist nicht so gruselig wie es aussieht.

Wenn Sie nicht Linq und lambdas verwenden möchten, können Sie einfach über die Liste iterieren und eine Variable aktualisieren. Sie konnten die if Anweisung mit ersetzen:

private bool isGameOver() 
{ 
    bool gameOver = true; 

    for(int i = 0; i < studentScripts.Count; i++) 
    { 
     if (studentScripts[i].m != 5) 
     { 
      gameOver = false; 
      break; 
     } 
    } 

    return gameOver; 
} 

void Update() 
{ 
    if (isGameOver()) { 
    StartCoroutine (ChangeScene()); 
    } 
} 
+1

Ich arbeitete am zweiten Teil Ihrer Antwort, aber Sie haben es gepostet. Ich mag das besser, weil einige der Linq-Funktionen nicht in iOS funktionieren und einige, die Arbeit Arbeitsspeicher A-Los zuweisen. Das einzige, was übrig bleibt, ist, den zweiten Teil Ihrer Frage in eine Funktion zu stellen. Vielleicht boolean eine Funktion namens 'isGameOver'. Es ist nicht notwendig, aber es wird den Code wiederverwendbar machen. Jetzt wird die Update-Funktion weniger Code haben. – Programmer

+0

Smart, das wusste ich nicht über iOS. Nochmals vielen Dank für das Wissen haha. Ich werde es in eine Funktion für die Vollständigkeit stecken! Ich denke, 'All' ist in Ordnung für den Speicher? Ich werde es jetzt profilieren und überprüfen. –

+0

Entschuldigung, aber wie StudentScripts zu deklarieren? – Eeva

1

Sie können alle Objekte eines bestimmten Typs finden, die in der Szene sind, und dann filtern sie mit Linq oder ähnliches.

StudentScript[] studentsInScene = Object.FindObjectsOfType<StudentScript>(); 

if (studentsInScene.All(student => student.m == 5)) 
{ 
    StartCoroutine(ChangeScene()); 
} 

FindObjectsOfType vielleicht nicht ganz so schnell sein als Liste Sie selbst verwalten (obwohl es sein könnte), aber wenn dies nicht Ihre Engpass ist (was es sehr wahrscheinlich nicht), dann sind diese wenigen Zeilen Code ist viel einfacher zu verstehen und somit vorzuziehen.