// Copyright (c) Pixel Crushers. All rights reserved. using UnityEngine; using UnityEngine.EventSystems; namespace PixelCrushers.DialogueSystem { /// /// Response button for use with Standard Dialogue UI. Add this component to every /// response button in the dialogue UI. /// [AddComponentMenu("")] // Use wrapper. public class StandardUIResponseButton : MonoBehaviour, ISelectHandler { [HelpBox("If Button's OnClick() event is empty, this Standard UI Response Button component will automatically assign its OnClick method at runtime. If Button's OnClick() event has other elements, you *must* manually assign the StandardUIResponseButton.OnClick method to it.", HelpBoxMessageType.Info)] public UnityEngine.UI.Button button; [Tooltip("Text element to display response text.")] public UITextField label; [Tooltip("Apply emphasis tag colors to button text.")] public bool setLabelColor = true; [Tooltip("Set button's text to this color by default.")] public Color defaultColor = Color.white; /// /// Gets or sets the response text element. /// public virtual string text { get { return label.text; } set { label.text = UITools.StripRPGMakerCodes(value); UITools.SendTextChangeMessage(label); } } /// /// Indicates whether the button is an allowable response. /// public virtual bool isClickable { get { return (button != null) && button.interactable; } set { if (button != null) button.interactable = value; } } /// /// Indicates whether the button is shown or not. /// public virtual bool isVisible { get; set; } /// /// Gets or sets the response associated with this button. If the player clicks this /// button, this response is sent back to the dialogue system. /// public virtual Response response { get; set; } /// /// Gets or sets the target that will receive click notifications. /// public virtual Transform target { get; set; } /// /// Clears the button. /// public virtual void Reset() { isClickable = false; isVisible = false; response = null; if (label != null) { label.text = string.Empty; SetColor(defaultColor); } } public virtual void Awake() { if (button == null) button = GetComponent(); if (button == null) Debug.LogWarning("Dialogue System: Response button '" + name + "' is missing a Unity UI Button component!", this); } public virtual void Start() { if (button != null && button.onClick.GetPersistentEventCount() == 0) { button.onClick.AddListener(OnClick); } } /// /// Sets the button's text using the specified formatted text. /// public virtual void SetFormattedText(FormattedText formattedText) { if (formattedText == null) return; text = UITools.GetUIFormattedText(formattedText); SetColor((formattedText.emphases.Length > 0) ? formattedText.emphases[0].color : defaultColor); } /// /// Sets the button's text using plain text. /// public virtual void SetUnformattedText(string unformattedText) { text = unformattedText; SetColor(defaultColor); } protected virtual void SetColor(Color currentColor) { if (setLabelColor) label.color = currentColor; } /// /// Handles a button click by calling the response handler. /// public virtual void OnClick() { if (target != null) { SetCurrentResponse(); target.SendMessage("OnClick", response, SendMessageOptions.RequireReceiver); } } public virtual void OnSelect(BaseEventData eventData) { SetCurrentResponse(); } protected virtual void SetCurrentResponse() { if (DialogueManager.instance.conversationController != null) { DialogueManager.instance.conversationController.SetCurrentResponse(response); } } } }