„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:
