2016-05-28 14 views
-1

Ich arbeite an der Erstellung eines unidirectional flow framework in Unity.String dynamisch an einen anderen String ('Muting' ein C# String)

Derzeit bin ich fest auf Text Updates zu bekommen, um so zu arbeiten, wie ich will. Hier ist, wie ich es möchte arbeiten:

  1. Ich habe eine Zeichenfolge auf einem Skript gespeichert: myString
  2. ich beliebig viele andere Zeichenfolge ist daran binden können: string1 = myString, string2 = myString etc
  3. Wenn ich ändern myString, alle anderen gebundenen Strings
  4. auch ändern

Hier ist meine (natürlich nicht in Betrieb) Code:

public class Binder : MonoBehaviour 
{ 
    public Button button; 

    public string buttonText = "Hi"; 

    void Start() 
    { 
    buttonText = button.GetComponentInChildren<Text>().text; 
    } 

    // Update is called once per frame 
    void Update() 
    { 
    buttonText = Time.time.ToString(); 
    } 
} 

Wie es offensichtlich ist, aktualisiert die Aktualisierung buttonText nicht die button.GetComponentInChildren<Text>().text (die bei "Hi" bleibt), weil es nur auf eine andere Zeichenfolge buttonText zeigt.

Wenn String ein Objekt wäre, könnte ich das Objekt mutieren und es würde alle Referenzen aktualisieren. Das wäre fantastisch.

Meine Frage ist: Weißt du, wie ich eine Zeichenfolge mutieren kann, so dass alle anderen Zeiger auf die gleiche Zeichenfolge natürlich den gleichen Wert zeigen? Angenommen, ich speichere die Zeichenfolge "Hello" und habe zwei UnityButtons. Ich setze diese beiden UnityButtons.text auf diese "Hallo" -String. Wenn ich "Hello" auf "Bye" ändere, ändert sich auch der Text dieser beiden Tasten zu "Bye"?

+0

Die Antwort hier könnte nicht einfacher sein, verwenden Sie einfach eine Eigenschaft. FBs Idee ist albern und wirklich nur konzeptionell bedeutungsvoll, wenn es um große Datenbankaktivitäten geht.Beachten Sie, dass FB in der Tat nichts anderes bedeutet als ihr "Flow" -System: Alles, was sie sagen, ist *** "funktioniert genauso auf Ihrer High-Level-db-Architektur, da gewöhnliche Eigenschaften in jeder Programmiersprache funktionieren" ** *. Ihre "Flow" - Idee ist in der Tat nichts anderes als das alltägliche "Eigentums" -Konzept auf der Sprachebene in C#. – Fattie

+0

Zweitens, Aggressor, ich bin mir nicht sicher, ob Sie neu bei Unity sind (es ist schwer, sich an alle hier zu erinnern!), Aber Sie bekommen oft sehr ** erfahrene ** Programmierer, die ** neu sind **, die sich einbinden Knoten, weil sie nicht auf UnityEvent gestoßen sind. http://StackOverflow.com/a/36249404/294884 .. das ist die Grundidee in Unity Engineering. Du benutzt es ständig für alles. (Alles, was dir von Unity gegeben wird, das bereits implementiert ist, ist so gemacht, und alles, was du oder ich machen, wird auf diese Weise gemacht.) Tatsächlich ist FBs "Flow" Idee genau "UnityEvent" (auf der Architekturskala) . – Fattie

+0

Ich habe das Dispatch-System für die Verwendung von Unity-Ereignissen und -Aktionen eingerichtet, aber ich habe versucht, auch Skripteigenschaften an den Speicher zu binden, damit die gebundenen Eigenschaften automatisch aktualisiert werden. Die Idee, die ich am meisten mag, ist das Single-Store-System. Es gibt einen Ort, an dem sich alle Instanzdaten befinden. Ich füge nur Fertighäuser an den Laden und dann den Laden zu aktualisieren. Ich habe jedoch experimentiert und bin ziemlich nah daran, es neu zu erstellen. Der wichtigste Vorteil, den ich "denke", ist es wert, dies zu tun, ist der Single-State-Aspekt. – Aggressor

Antwort

1

Ich glaube nicht, dass Sie mit Zeigern tun können. Obwohl Sie es mit einer anderen Methode tun können. Dies kann mit Auto-Eigenschaft in C# erreicht werden. Sehen Sie sich den folgenden Code an. Jedes Mal, wenn buttonText geändert wird, werden die Button Texte automatisch geändert. Sie können mehr Texts darin hinzufügen.

Wenn Sie genauer hinsehen, werden Sie feststellen, dass ich die Texte der Tasten in der Start Funktion zwischengespeichert habe. Sie sollten die Variablen immer zwischenspeichern und vermeiden, GetComponentInChildren wiederholt zu verwenden, wenn Sie diese Variable mehrmals verwenden werden.

void Start() 
{ 
    buttonText1 = button1.GetComponentInChildren<Text>(); 
    buttonText2 = button2.GetComponentInChildren<Text>(); 
} 

void Update() 
{ 
    buttonText = Time.time.ToString(); 
} 

public Button button1; 
public Button button2; 

Text buttonText1; 
Text buttonText2; 

string _buttonText = "HI"; 
public string buttonText 
{ 
    set 
    { 

     _buttonText = value; 

     //Change Text 1 
     if (buttonText1 != null) 
     { 
      buttonText1.text = _buttonText; 
     } 

     //Change Text 2 
     if (buttonText2 != null) 
     { 
      buttonText2.text = _buttonText; 
     } 
    } 

    get 
    { 
     return _buttonText; 
    } 
} 

Man beachte, dass in der Tat, Sie eine UnityEvent auf einem Grundstück setzen. Dies schafft einen "Laden", dem alles folgen kann. Setzen Sie einfach den "Zeiger" auf den Laden.

Wenn Sie UnityEvent nicht mit einem Argument verwendet vor, die etwas ärgerlich Syntax ist dies ...

[System.Serializable] public class ExplosionEvent:UnityEvent<int> {} 
public ExplosionEvent:UnityEvent followExplosions; 
// and then ... 
if (followExplosions!=null) followExplosions.invoke(42); 

So

ein UnityEvent auf einem Grundstück

es ist zu haben nur ..

public class HappyClass:MonoBehaviour 
    { 

    [System.Serializable] public class StoreEvent:UnityEvent<string> {} 
    public StoreEvent followStore; 
    string _store; 
    public string store 
     { 
     set { 
      _store = value; 
      if (followStore!=null) followStore.Invoke(_store); 
      } 
     get { return _store; } 
     } 
    ... 
+0

Ja, natürlich ist das trivial richtig und wahr. Der entscheidende Punkt, Aggressor, ist, die allgemeine "Idee" dort mit FBs "Flow" -Denken zu sehen, das, um es zu wiederholen, nichts anderes ist als "wir wollen, dass es genauso funktioniert wie Eigenschaften in C#" - - !! In C# verwenden Sie Eigenschaften, um dies selbstverständlich zu tun. Wenn Sie auch iOS programmieren, ist es jetzt noch einfacher und natürlicher in Swift (es gibt einen "didset" -Ansatz für Eigenschaften). – Fattie

+0

Ja, ich hatte nicht daran gedacht, es so zu tun, dass ich mich darauf konzentrierte, zu mutieren. Dies könnte mehr Arbeit sein, als ich gehofft hatte, aber es wird funktionieren. – Aggressor