Fortschrittsbalken: Varianten durch Vererbung

Kommen Eigenschaften nur in manchen Objekten vor, können diese durch abgeleitete Klassen realisiert werden. Dadurch reduzieren sich Speicher und Verwaltung auf das tatsächlich Nötigste.

Script ableiten

  • Klicke mit in Project und wähle CreateC#-Script, um ein neues Script zu erzeugen.
  • Nenne das Script ObjektMitTitelUndFortschritt.
  • Doppelklicke auf dieses neue Script, um es in Visual Studio zu öffnen.
  • Ändere ObjektMitTitelUndFortschritt.cs wie folgt:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjektMitTitelUndFortschritt : ObjektMitTitel
{
    public float fortschritt = 0f;
}

Instanz austauschen

  • Wähle das Restaurant-Objekt in der Hierarchy aus.
  • Ziehe das Script ObjektMitTitelUndFortschritt aus Project in den Inspector, so dass das Script unterhalb des bisherigen Scripts ObjektMitTitel platziert wird.
  • Kopiere im Inspector die Werte für Titel und Icon aus ObjektMitTitel in die gleichnamigen Eigenschaften des ObjektMitTitelUndFortschritt.
  • Setze zudem Fortschritt = 0.3.
  • Klicke im Inspector mit auf den Titeltext ObjektMitTitel und wähle Remove Component.
  • Drücke Strg+P, um das Projekt zu starten und prüfe, dass alles funktioniert wie bisher.

Fortschrittsbalken im UI anlegen

  • Wähle das Canvas-Objekt in der Hierarchy aus und füge über Game ObjectUIRaw Image ein Bild der Szene hinzu.
  • Nenne das neue Objekt um zu Fortschrittsbalken.
  • Verwende das Rect Tool (Taste T ), um den Balken in Größe und Position anzupassen.
  • Füge über Game ObjectUIRaw Image ein weiteres Bildobjekt hinzu und ändere den Namen zu Fortschritt.
  • Ziehe in der Hierarchy das Objekt Fortschritt auf das Objekt Fortschrittsbalken, um es unterzuordnen.
  • Ändere im Inspector die Werte im Abschnitt ▾Rect Transformwie folgt:
    • ▾ Anchors Min X = 0 und Min Y = 0, sowie Max X = 1 und Max Y = 1
    • Pivot X = 0 und Y = 0.5
    • Left = 0, Top = 0, Right = 0 und Bottom = 0

Hinweis: Die Beschriftung der Positions- und Größen-Felder ändert sich eventuell beim Ändern der Anchor- und Pivot-Werte.

Mit diesem Aufbau kannst Du nun sehr bequem den Scale X-Wert nutzen, um die Prozentdarstellung des Balkens relativ zum Layout zu steuern.

Fortschrittsbalken im Code einbauen

  • Füge in EigenschaftenZeichner.cs folgende Felder ein:
public RawImage fortschritt;
public RawImage fortschrittsBalken;

Prozentwert setzen, mit Typ-Prüfung und Type-Cast

  • Ändere in EigenschaftenZeichner.cs zudem die zeichneObjekt -Methode wie folgt:
   public void zeichneObjekt(ObjektMitTitel dasObjekt)
    {
        if (dasObjekt == null) // Kein Objekt -> leerer Text
        {
            textName.text = "";
            icon.enabled = false;
            fortschrittsBalken.gameObject.SetActive(false);
        }
        else // Konkretes Objekt -> dessen Eigenschaften zeichnen
        {
            textName.text = dasObjekt.titel;
            icon.texture = dasObjekt.icon;
            icon.enabled = (dasObjekt.icon != null);

            if (dasObjekt.GetType() == typeof(ObjektMitTitelUndFortschritt))
            {
                Vector3 neueGroesse = new Vector3(1f,1f,1f);
                neueGroesse.x = ((ObjektMitTitelUndFortschritt)dasObjekt).fortschritt;
                fortschritt.GetComponent<RectTransform>().localScale = neueGroesse;
                fortschrittsBalken.gameObject.SetActive(true);
            }
            else //kein ObjektMitTitelUndFortschritt
            {
                fortschrittsBalken.gameObject.SetActive(false);
            }
        }
    }

Szenenobjekte zuweisen

  • Wähle das Restaurant-Objekt in der Hierarchy aus und setze im Inspectorden Wert ▾ObjektMitTitelUndFortschritt Fortschritt = 0.5.
  • Wähle das Canvas-Objekt in der Hierarchy aus und setze im Inspectorden Wert ▾Eigenschaftenzeichner Fortschritt auf das Fortschrittobjekt der Szene.
  • Wähle das Canvas-Objekt in der Hierarchy aus und setze im Inspectorden Wert ▾Eigenschaftenzeichner Fortschritts Balken auf das Fortschrittsbalkenobjekt der Szene.

Ergänzung: Zu Beginn alles Verstecken

  • Erweitere in EigenschaftenZeichner.cs das Awake-Ereignis:
    public void Awake()
    {
        zeichneObjekt(null); //zu Beginn alles ausblenden
        EventBus.bus.beiObjektMitTitelAenderung += zeichneObjekt; // Im Eventbus registrieren, dass die oben definierte Funktion zeichneObjekt aufgerufen wird.
    }

Anhänge

Die hier gezeigten Lektionen sind eine Auswahl von Inhalten aus mehreren verschiedenen kostenpflichtigen Kursen. Um alle Inhalte zu sehen, müssen mehrere Kurse gekauft werden. Änderungen und Aktualisierungen der Kursinhalte werden auf dieser Seite möglicherweise nicht oder nicht sofort dargestellt. Die kostenpflichtigen Udemy-Kurse enthalten neben den Videos auch Übungen, Textartikel, weitere Materialien, sowie ein Support-Forum für Fragen. Vereinzelt kann eine Lektion im mehreren Kursen gleichzeitig enthalten sein. Wenn etwas unklar ist, stelle Deine Frage per E-Mail an rene@gamedev-profi.de .