Was ist falsch mit diesem Script (Unity, C#)?
Hallo,
ich bin im Moment dabei, mir selbst Unity bei zu bringen. Wie man sieht habe ich aber Probleme.
Was ich machen möchte ist eigentlich recht simple - Ich möchte eine Intro-Sequenz am Anfang des Spiels haben, die 3 Texte nacheinander Visible macht und dann am Ende kann man dann drücken um das Spiel zu starten, sprich den Intro Frame unsichtbar zu machen. Ich habe aber nur Probleme mit dem "wait" Befehl, da dieser hier komischerweise sehr unnötog kompliziert gemacht wurde. Anstatt eines einfachen "wait()-Befehls" oder so muss man ja irgendwas mit diesen "IEnumeratorn" machen. Ich habe mir auch schon Tutorials angeschaut, komme hier aber nicht zu irgendeinem guten Ergebnis, sobald ich die wait Funktion nutze.
Kennt sich hier vielleicht irgendjemand aus? Wäre sehr cool wenn ihr mir helft.
Nur zu Info: Ich bin kein Profi, also bitte hatet mich nicht wenn es sehr offensichtlich ist oder so.
Hier mein Script:
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;
public class Script1 : MonoBehaviour
{
public GameObject Intro;
public GameObject StartText;
public GameObject Text1;
public GameObject Text2;
public GameObject Text3;
public bool IsEnabled = false;
// Start is called before the first frame update
void Start()
{
Text1.SetActive(false);
Text2.SetActive(false);
Text3.SetActive(false);
StartText.SetActive(false);
Initialise();
}
IEnumerator Initialise()
{
Text1.SetActive(true);
yield return new WaitForSeconds(2f);
Text2.SetActive(true);
yield return new WaitForSeconds(2f);
Text3.SetActive(true);
yield return new WaitForSeconds(2f);
StartText.SetActive(true);
IsEnabled = true;
}
// Update is called once per frame
void Update()
{
if (IsEnabled == true)
{
if (Input.GetKeyDown(KeyCode.Mouse0))
{
Intro.SetActive(false);
IsEnabled = false;
}
}
}
}
Hier nochmal als Bild aus Visual Studio falls es jemand braucht:
1 Antwort
Hier in der Dokumentation steht das du Initialise() nicht einfach so aufrufen sollst sondern das Ergebnis StartCoroutine übergeben musst. Ich hab auch mal einwenig im Internet geschaut, aber scheinbar gibt es keinen einfacheren Weg eine bestimmte Zeit zu warten.
Eine Alternativlösung wäre das du nicht eine bestimmte Anzahl an Sekunden wartest sondern das der Nutzer einmal Klicken muss um sich den nächsten Text anzeigen zu lassen.
Hinweis: Schön das du dir Unity selbst beibringen möchtest, aber es ist weitaus sinnvoller erst C# via Bücher oder Tutorials zu lernen anstatt gleich mit Unity durchzustarten.
lg Suiram1
Nach der If-Bedingung für Text1 musst du bei allen aderen else if anstelle von einem normalen If verwenden. Das muss dewegen so sein, weil wenn du nur if nimmst bei jedem Klick jede bedingung geprüft wird und in deinem Fall auch ausgeführt wird. else if sorgt dafür, dass pro durchgang nur eine der Bedingungen ausgeführt werden kann.
Übringens die Alternatividee ist sehr gut, ich werde dann die nehmen! Vielen Dank nochmal!
Vielen Dank! Ich habe tatsächlich schonmal was mit C# gemacht, und zwar Visual Studio Programmentwicklung und auch sogar Mods für GTA5 erstellt, aber C# in Unity ist da bisschen anders...
Hey ich bin es nochmal. Ich habe es jetzt versucht umzusetzen (also deine Alternatividee), aber irgendwie macht er wenn man beim ersten mal klick direkt Text2 und Text3 sichtrbar, und beim zweiten mal macht er es alles unsichtbar. Er soll aber logischerweise erst Text2, dann Text3 und dann erst alles unsichtbar machen. Hier der Codeauszug:
``
if (IsEnabled == true)
{
if (Input.GetKeyDown(KeyCode.Mouse0) & val == 0)
{
Text2.SetActive(true);
val = 1;
}
if (Input.GetKeyDown(KeyCode.Mouse0) & val == 1)
{
Text3.SetActive(true);
StartText.GetComponent<Text>().text = "Click to start";
val = 2;
}
if (Input.GetKeyDown(KeyCode.Mouse0) & val == 2)
{
Intro.SetActive(false);
IsEnabled = false;
val = 3;
}
}
``