FGames

Game Development Services

„Zeitstrahl“ – Devlog #2

This is the History System for the Project Zeitstrahl – History System

Structure

Programming Pattern: Observer Pattern

Prefab structure & example:

The HistoryController is a MonoBehaviour that contains a list of HistoryObjects, which get spawned as objects at the start of the game:

public class HistoryController : MonoBehaviour
{
[SerializeField] private List<HistoryBaseObjectData> GameEvents = new List<HistoryBaseObjectData>(); // set in inspector, notiz für mich: create editor interface for inspector, to create events 

[SerializeField] private GameObject prefab;
[SerializeField] private Transform container;

[SerializeField] private int currentYear;

private void Start()
{
    InitializeHistory(); // todo : initialize when year reaches specific date.
}

private HistoryObject CreateHistoryObject(HistoryBaseObjectData eventData, HistoryBaseObjectUI uiData)
{
    HistoryObject obj = new HistoryObject(eventData, uiData);
    return obj;
}

private void InitializeHistory()
{
    foreach (HistoryBaseObjectData eventData in GameEvents) {
        HistoryBaseObjectUI ui = Instantiate(prefab, container).GetComponent<HistoryBaseObjectUI>();
        HistoryObject newObj = CreateHistoryObject(eventData, ui);
    }
}

A HistoryObject contains:

  • HistoryBaseObjectData (container for data only)
  • HistoryBaseObjectUI (container for UI only)
public class HistoryObject
{
    public HistoryBaseObjectData Data;
    public HistoryBaseObjectUI UI;

    public HistoryObject(HistoryBaseObjectData data, HistoryBaseObjectUI ui)
    {
        ui.Initialize(data);

        this.Data = data;
        this.UI = ui;
    }
}

Data class:

public class HistoryBaseObjectData
{
    public Sprite Icon;
    public string Title = "Title";
    public string SubTitle = "SubTitle";
    public string Description = "Description";
    public int Year = 1900;
    public bool Collected = false;
    public string ID = "E";

    public bool IsEmpty()
    {
        if (Icon == null) { Debug.Log($"History Object Year f{Year}: Missing Icon-Sprite"); return false; }
        else return true;
    }

    public void Collect() => Collected = true;

}

UI Monobehaviour:

public class HistoryBaseObjectUI : MonoBehaviour
{
    [SerializeField] private Image iconIMG;
    [SerializeField] private TMP_Text titleTMP;
    [SerializeField] private TMP_Text subTitleTMP;
    [SerializeField] private TMP_Text descriptionTMP;

    [Header("Read-Only")]
    [SerializeField, ReadOnly] private HistoryBaseObjectData historyBaseObjectData; //read-only


    public void Initialize(HistoryBaseObjectData data)
    {

        if (data != null)
        {
            titleTMP.text = data.Title;
            descriptionTMP.text = data.Description;
            iconIMG.sprite = data.Icon;
            subTitleTMP.text = data.SubTitle;

            historyBaseObjectData = data;
        }

        gameObject.name = "Object " + " (" + data.ID + "): " + data.Title;
        gameObject.SetActive(false);


    }

}

Planning:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Pflichtfelder sind mit * gekennzeichnet.

*
*