You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
3.3 KiB
94 lines
3.3 KiB
5 years ago
|
// This code is part of the Fungus library (https://github.com/snozbot/fungus)
|
||
|
// It is released for free under the MIT open source license (https://github.com/snozbot/fungus/blob/master/LICENSE)
|
||
|
|
||
|
using System.Collections.Generic;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace Fungus
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// Manages the UI aspects of the Narrative Log via EntryDisplay objects
|
||
|
///
|
||
|
/// Originally contributed by https://github.com/CG-Tespy
|
||
|
/// </summary>
|
||
|
public class NarrativeLogEntryUI : MonoBehaviour
|
||
|
{
|
||
|
[Tooltip("Contains the overall aesthetic of each entry.")]
|
||
|
[SerializeField] protected NarrativeLogEntryDisplay entryDisplayPrefab;
|
||
|
|
||
|
[SerializeField] protected RectTransform entryHolder;
|
||
|
protected CanvasGroup canvasGroup;
|
||
|
protected List<NarrativeLogEntryDisplay> entryDisplays = new List<NarrativeLogEntryDisplay>();
|
||
|
protected UnityEngine.UI.ScrollRect scrollRect;
|
||
|
|
||
|
protected virtual void Awake()
|
||
|
{
|
||
|
canvasGroup = GetComponent<CanvasGroup>();
|
||
|
var tmp = FungusManager.Instance.NarrativeLog;
|
||
|
// Make sure to update the UI when new entries are added to or
|
||
|
// cleared from the log.
|
||
|
//using the fungusmanager to ensure that the narrativeLog is inited
|
||
|
FungusManager.Instance.NarrativeLog.OnNarrativeAdded += OnNarrativeAdded;
|
||
|
FungusManager.Instance.NarrativeLog.OnNarrativeLogClear += Clear;
|
||
|
|
||
|
scrollRect = GetComponentInChildren<UnityEngine.UI.ScrollRect>();
|
||
|
}
|
||
|
|
||
|
public virtual void Clear()
|
||
|
{
|
||
|
for (int i = 0; i < entryDisplays.Count; i++)
|
||
|
{
|
||
|
var entryDisplay = entryDisplays[i];
|
||
|
Destroy(entryDisplay.gameObject);
|
||
|
}
|
||
|
|
||
|
entryDisplays.Clear();
|
||
|
}
|
||
|
|
||
|
public virtual void Open()
|
||
|
{
|
||
|
canvasGroup.alpha = 1;
|
||
|
canvasGroup.interactable = true;
|
||
|
canvasGroup.blocksRaycasts = true;
|
||
|
}
|
||
|
|
||
|
public virtual void Close()
|
||
|
{
|
||
|
canvasGroup.alpha = 0;
|
||
|
canvasGroup.interactable = false;
|
||
|
canvasGroup.blocksRaycasts = false;
|
||
|
}
|
||
|
|
||
|
protected virtual void OnNarrativeAdded(NarrativeLogEntry entryAdded)
|
||
|
{
|
||
|
// Create a display for the new entry, and have it show in the UI.
|
||
|
var newEntryDisplay = Instantiate(entryDisplayPrefab);
|
||
|
newEntryDisplay.transform.SetParent(entryHolder, false);
|
||
|
newEntryDisplay.ToDisplay = entryAdded;
|
||
|
entryDisplays.Add(newEntryDisplay);
|
||
|
StartCoroutine(ForceToBottom());
|
||
|
}
|
||
|
|
||
|
private System.Collections.IEnumerator ForceToBottom()
|
||
|
{
|
||
|
yield return null;
|
||
|
scrollRect.verticalNormalizedPosition = 0;
|
||
|
}
|
||
|
|
||
|
protected virtual void OnLogCleared()
|
||
|
{
|
||
|
Clear();
|
||
|
}
|
||
|
|
||
|
protected virtual void OnDestroy()
|
||
|
{
|
||
|
var fManInst = FungusManager.Instance;
|
||
|
// Avoid this responding to signals when being destroyed.
|
||
|
if (fManInst != null)
|
||
|
{
|
||
|
FungusManager.Instance.NarrativeLog.OnNarrativeAdded -= OnNarrativeAdded;
|
||
|
FungusManager.Instance.NarrativeLog.OnNarrativeLogClear -= Clear;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|