Jump to content
Unity Insider Forum

GUI Buttons und Texte zur Laufzeit erstellen - Probleme


Recommended Posts

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!

post-678-0-22652700-1434356291_thumb.jpeg

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

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

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

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...