// Copyright (c) Pixel Crushers. All rights reserved. using UnityEngine; using System.Collections.Generic; namespace PixelCrushers.DialogueSystem { /// /// This component hooks up the elements of a Standard UI quest track template, /// which is used by the Unity UI Quest Tracker. /// Add it to your quest track template and assign the properties. /// [AddComponentMenu("")] // Use wrapper. public class StandardUIQuestTrackTemplate : MonoBehaviour { [Header("Quest Heading")] [Tooltip("The heading - name or description depends on tracker setting")] public UITextField description; public StandardUIQuestTemplateAlternateDescriptions alternateDescriptions = new StandardUIQuestTemplateAlternateDescriptions(); [Header("Quest Entries")] [Tooltip("(Optional) If set, holds instantiated quest entries")] public Transform entryContainer; [Tooltip("Used for quest entries")] public UITextField entryDescription; public StandardUIQuestTemplateAlternateDescriptions alternateEntryDescriptions = new StandardUIQuestTemplateAlternateDescriptions(); protected List m_instances = null; public bool arePropertiesAssigned { get { return (description != null) && (entryDescription != null); } } protected int numEntries = 0; public virtual void Initialize() { description.SetActive(false); alternateDescriptions.SetActive(false); entryDescription.SetActive(false); alternateEntryDescriptions.SetActive(false); if (entryContainer != null) { entryContainer.gameObject.SetActive(false); if (m_instances != null) { for (int i = 0; i < m_instances.Count; i++) { if (m_instances[i] != null) Destroy(m_instances[i].gameObject); } } m_instances = new List(); } numEntries = 0; } public virtual void SetDescription(string text, QuestState questState) { if (text == null) return; switch (questState) { case QuestState.Active: case QuestState.ReturnToNPC: SetFirstValidTextElement(text, description); break; case QuestState.Success: SetFirstValidTextElement(text, alternateDescriptions.successDescription, description); break; case QuestState.Failure: SetFirstValidTextElement(text, alternateDescriptions.failureDescription, description); break; default: return; } } public virtual void AddEntryDescription(string text, QuestState entryState) { if (entryContainer == null) { // No container, so make entryDescription a big multi-line string: alternateEntryDescriptions.SetActive(false); if (entryDescription != null) { if (numEntries == 0) { entryDescription.SetActive(true); entryDescription.text = text; } else { entryDescription.text += "\n" + text; } } } else { // Instantiate into container: if (numEntries == 0) { entryContainer.gameObject.SetActive(true); if (entryDescription != null) entryDescription.gameObject.SetActive(false); alternateEntryDescriptions.SetActive(false); } switch (entryState) { case QuestState.Active: InstantiateFirstValidTextElement(text, entryContainer, entryDescription); break; case QuestState.Success: InstantiateFirstValidTextElement(text, entryContainer, alternateEntryDescriptions.successDescription, entryDescription); break; case QuestState.Failure: InstantiateFirstValidTextElement(text, entryContainer, alternateEntryDescriptions.failureDescription, entryDescription); break; } } numEntries++; } protected void SetFirstValidTextElement(string text, params UITextField[] textElements) { for (int i = 0; i < textElements.Length; i++) { if (textElements[i] != null && textElements[i].gameObject != null) { textElements[i].SetActive(true); textElements[i].text = text; return; } } } protected void InstantiateFirstValidTextElement(string text, Transform container, params UITextField[] textElements) { for (int i = 0; i < textElements.Length; i++) { if (textElements[i] != null && textElements[i].gameObject != null) { textElements[i].text = text; var go = Instantiate(textElements[i].gameObject) as GameObject; go.transform.SetParent(container.transform, false); go.SetActive(true); m_instances.Add(go); return; } } } } }