strudi Geschrieben 15. Juni 2015 Melden Share Geschrieben 15. Juni 2015 Hallo! Wie auf dem angehängten Bild zu sehen, möchte ich so etwas ähnliches wie einen Tagebucheintrag zur Laufzeit generieren wenn ich auf ein GameObject klicke. Es funktioniert soweit auch, nur nicht so, wie ich mir das vorstelle. Immer wenn ich einen Eintrag hinzufüge, soll in der linken Spalte der Button generiert und in der rechten Spalte soll der dazugehörige Eintrag angezeigt werden. Jetzt sieht es so aus, das jeder neue Button untereinander platziert wird (was auch so sein soll) und die dazugehörigen Texte werden in der rechten Spalte ebenfalls untereinander generiert. Ich wollte das aber so machen, dass wenn man auf einen Button klickt nur den dazugehörigen Eintrag in der rechten Spalte sieht. Wenn man auf einen anderen Button klickt sieht man einen anderen Eintrag etc. Da ich die Einträge zur Laufzeit generiere habe ich ein paar Probleme eine korrekte Lösung dafür zu finden. Wären die Einträge immer sichtbar, wüsste ich schon wie ich das Problem löse. Aber man soll diese Einträge während dem Spielen finden. Würde mich freuen wenn mir jemand helfen kann. Vielen lieben Dank und Liebe Grüße! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 15. Juni 2015 Melden Share Geschrieben 15. Juni 2015 Der Trick ist, die rechte Seite des GUI in Ruhe zu lassen, wenn der Eintrag gefunden wird. Du erstellst ja irgendwo einen neuen Button - das dürfte in etwa so aussehen: var button = ErstelleDenButton(); //oder mache ihn sichtbar... button.SetzeEigenschaften("Aufschrift", eintrag); Der Code in deinem Skript auf dem Button nimmt dann den Eintrag (Es könnte auch eine Nummer sein, die woanders der Schlüssel zum richtigen Eintrag in einem Dictionary ist) und ersetzt dann den Text auf der rechten Seite. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
strudi Geschrieben 15. Juni 2015 Autor Melden Share Geschrieben 15. Juni 2015 Der Trick ist, die rechte Seite des GUI in Ruhe zu lassen, wenn der Eintrag gefunden wird. Du erstellst ja irgendwo einen neuen Button - das dürfte in etwa so aussehen: var button = ErstelleDenButton(); //oder mache ihn sichtbar... button.SetzeEigenschaften("Aufschrift", eintrag); Der Code in deinem Skript auf dem Button nimmt dann den Eintrag (Es könnte auch eine Nummer sein, die woanders der Schlüssel zum richtigen Eintrag in einem Dictionary ist) und ersetzt dann den Text auf der rechten Seite. Dankeschön. Ich poste mal meinen Code den ich zu Testzwecken gemacht habe: using UnityEngine; using UnityEngine.UI; using System.Collections; public class LogFileManager : MonoBehaviour { public GameObject logEntryTitlePrefab; public GameObject logEntryTextPrefab; public GameObject logFileFoundTitlePrefab; void Awake(){ } // Use this for initialization void Start () { CreateLogFileEntry("LogfilesFound", "LogfileData", "Erster Eintrag", "Tagebuch eines Aliens", "Hallo ich bin ein Alien!"); CreateLogFileEntry("LogfilesFound", "LogfileData", "Zweiter Eintrag", "Alte Rasse", "Es gibt uns wirklich ... "); } // Update is called once per frame void Update () { } //Erstelle einen neuen Logfileeintrag mit Prefabs public void CreateLogFileEntry(string logFileFound, string logFileData, string logFileTitle, string entryTitle, string entryText){ GameObject logEntryTitle = (GameObject)Instantiate(logEntryTitlePrefab); GameObject logEntryText = (GameObject)Instantiate(logEntryTextPrefab); GameObject logFileFoundTitle = (GameObject)Instantiate(logFileFoundTitlePrefab); LogFileSetup(logFileFound, logFileData, logEntryTitle, logEntryText, logFileFoundTitle, logFileTitle, entryTitle, entryText); } //Setup für die Logfileeinträge um sie während der Laufzeit an die richtige Position zu setzen und richtig zu skalieren etc. public void LogFileSetup(string logFileFound, string logFileData, GameObject logEntryTitle, GameObject logEntryText, GameObject logFileFoundTitle, string logFileTitle, string entryTitle, string entryText){ logEntryTitle.transform.SetParent(GameObject.Find(logFileData).transform); logEntryText.transform.SetParent(GameObject.Find(logFileData).transform); logFileFoundTitle.transform.SetParent(GameObject.Find(logFileFound).transform); logEntryTitle.transform.localScale = new Vector3 (1,1,1); logEntryText.transform.localScale = new Vector3 (1,1,1); logFileFoundTitle.transform.localScale = new Vector3 (1,1,1); logEntryTitle.transform.GetComponent<Text>().text = entryTitle; logEntryText.transform.GetComponent<Text>().text = entryText; logFileFoundTitle.transform.GetComponent<Text>().text = logFileTitle; } } Ich denke ich bin die ganze Sache wieder falsch angegangen. Buttons und Texte setze ich über ein Prefab an die gewünschte Position des Parent. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
strudi Geschrieben 18. Juni 2015 Autor Melden Share Geschrieben 18. Juni 2015 Ich weiß nicht was ich falsch mache. Ich bin die Grundlagen schon so oft durch gegangen. Ich kann die Buttons und Texte zur Laufzeit hinzufügen, aber sie werden nicht als eigenständiges Objekt behandelt. Buttons und Texte sind ein Prefab, aber wenn ich mehrere Buttons hinzufüge, wird der Code nicht spererat für sich abgearbeitet, sonder teilt sich den Code mit den anderen Buttons. Warum? Was mache ich da falsch? using UnityEngine; using UnityEngine.UI; using System.Collections; public class LogFileManager : MonoBehaviour { private bool isActive = false; void Awake(){ } // Use this for initialization void Start () { } // Update is called once per frame void Update () { } //Setup für die Logfileeinträge um sie während der Laufzeit an die richtige Position zu setzen und richtig zu skalieren etc. public void LogFileSetup(string logFileFound, string logFileData, Text logEntryText, Button logFileFoundTitle, string logFileTitle, string entryText){ logEntryText.transform.SetParent(GameObject.Find(logFileData).transform); logFileFoundTitle.transform.SetParent(GameObject.Find(logFileFound).transform); logEntryText.transform.localScale = new Vector3 (1,1,1); logFileFoundTitle.transform.localScale = new Vector3 (1,1,1); logFileFoundTitle.transform.GetComponentInChildren<Text>().text = "Test"; logFileFoundTitle.onClick.AddListener(() => OpenLogEntry()); } public void OpenLogEntry(){ if(!isActive){ isActive = true; print ("Test"); }else { print ("Hello again"); isActive = false; } } } using UnityEngine; using System.Collections; using UnityEngine.UI; public class test : MonoBehaviour { public LogFileManager logFileManager; public Text logEntryTextPrefab; public Button logFileFoundTitlePrefab; // Use this for initialization void Start () { } // Update is called once per frame void Update () { } //Erstelle einen neuen Logfileeintrag mit Prefabs public void CreateLogFileEntry(string logFileFound, string logFileData, string logFileTitle, string entryText){ Text logEntryText = (Text)Instantiate(logEntryTextPrefab); Button logFileFoundTitle = (Button)Instantiate(logFileFoundTitlePrefab); logFileManager.LogFileSetup(logFileFound, logFileData, logEntryText, logFileFoundTitle, logFileTitle, entryText); } public void OnMouseDown(){ CreateLogFileEntry("Image", "LogText", "Erster Eintrag", "Hallo ich bin ein Alien!"); } } Das ganze ist nur zum testen. Danke lg Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.