using UnityEngine; using System; using System.Collections; using Fungus; namespace Fungus { /** * Button click handler class for making sprites clickable. * When the user taps on the sprite, an Action delegate method is called */ [RequireComponent (typeof (SpriteRenderer))] public class Button : MonoBehaviour { /** * Delegate method to call when the player clicks the button. */ public Action buttonAction; /** * Automatically hides the button when displaying story text/options or waiting. */ public bool autoHide; /** * Automatically hides the button when the specified game value is set (i.e. not equal to zero). */ public string hideOnSetValue; float targetAlpha; bool showButton; /** * Set visibility of a button object and set the delegate method to call when clicked. * If the object does not already have a Collider2D component, then a BoxCollider2D is added. * @param _visible Setting this to true makes the button visible, unless overridden by property settings * @param _buttonAction An Action delegate method to call when the player clicks on the button */ public void Show(bool _visible, Action _buttonAction) { SpriteRenderer spriteRenderer = renderer as SpriteRenderer; if (spriteRenderer == null) { Debug.LogError("Sprite renderer must not be null"); return; } // Add a BoxCollider2d if none currently exists if (collider2D == null) { gameObject.AddComponent(); } showButton = _visible; buttonAction = _buttonAction; if (_visible) { targetAlpha = 1f; } else { targetAlpha = 0f; } UpdateTargetAlpha(); } public void SetAlpha(float alpha) { SpriteRenderer spriteRenderer = renderer as SpriteRenderer; Color color = spriteRenderer.color; color.a = alpha; spriteRenderer.color = color; } void UpdateTargetAlpha() { // Automatically display button when game is in idle state (not displaying story text/options or waiting) if (autoHide) { if (showButton && Game.GetInstance().ShowAutoButtons()) { targetAlpha = 1f; } else { targetAlpha = 0f; } } // Hide the button if the specified game value is non-zero if (hideOnSetValue.Length > 0 && Game.GetInstance().GetGameValue(hideOnSetValue) != 0) { targetAlpha = 0f; } } void Update() { UpdateTargetAlpha(); SpriteRenderer spriteRenderer = renderer as SpriteRenderer; float fadeSpeed = (1f / Game.GetInstance().buttonFadeDuration); float alpha = Mathf.MoveTowards(spriteRenderer.color.a, targetAlpha, Time.deltaTime * fadeSpeed);; // Set alpha for this sprite and any child sprites SpriteRenderer[] children = spriteRenderer.gameObject.GetComponentsInChildren(); foreach (SpriteRenderer child in children) { Color color = child.color; color.a = alpha; child.color = color; } } void OnMouseUpAsButton() { SpriteRenderer spriteRenderer = renderer as SpriteRenderer; // Ignore button press if sprite is not fully visible or // if the game is not in an idle state if (spriteRenderer.color.a != 1f || !Game.GetInstance().ShowAutoButtons()) { return; } // Sound effect Game.GetInstance().PlayButtonClick(); CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.CallCommandMethod(buttonAction); } } }