// Copyright (c) 2015 - 2023 Doozy Entertainment. All Rights Reserved. // This code can only be used under the standard Unity Asset Store End User License Agreement // A Copy of the EULA APPENDIX 1 is available at http://unity3d.com/company/legal/as_terms using System; using System.Text; using UnityEngine; using UnityEngine.UI; namespace Doozy.Runtime.Reactor.Targets.ProgressTargets { [AddComponentMenu("Doozy/Reactor/Targets/Text Progress Target")] public class TextProgressTarget : MetaProgressTarget { [SerializeField] private bool WholeNumbers = true; /// Should the target variable value get rounded to the nearest integer? public bool wholeNumbers { get => WholeNumbers; set => WholeNumbers = value; } [SerializeField] private bool UseMultiplier = true; /// Should the target variable value have a multiplier applied? public bool useMultiplier { get => UseMultiplier; set => UseMultiplier = value; } [SerializeField] private float Multiplier = 100; /// /// If UseMultiplier is TRUE, the target variable value will be multiplied by this value. /// Useful if you want to convert the Progress from 0.5 to 50% for example. /// public float multiplier { get => Multiplier; set => Multiplier = value; } [SerializeField] private string Prefix; /// Text added before the converted string value public string prefix { get => Prefix; set => Prefix = value; } [SerializeField] private string Suffix = "%"; /// Text added after the converted string value public string suffix { get => Suffix; set => Suffix = value; } /// Internal variable used to keep track if this progress target's variables have been initialized private bool m_Initialized; /// Internal variable used to get the updated target value private float m_TargetValue; /// Internal variable used to lower the string operations memory allocations private StringBuilder m_StringBuilder = new StringBuilder(); #if UNITY_EDITOR private void Reset() { Target = Target ? Target : GetComponent(); if (!Enum.IsDefined(typeof(Mode), targetMode)) targetMode = Mode.Value; } private void OnValidate() { if (!Enum.IsDefined(typeof(Mode), targetMode)) targetMode = Mode.Value; } #endif public override void UpdateTarget(Progressor progressor) { if (!m_Initialized) Init(); if (target == null) return; if (!Enum.IsDefined(typeof(Mode), targetMode)) targetMode = Mode.Value; m_TargetValue = 0; switch (targetMode) { case Mode.Progress: m_TargetValue = progressor.progress; break; case Mode.Value: m_TargetValue = progressor.currentValue; break; default: throw new ArgumentOutOfRangeException(); } if (UseMultiplier) m_TargetValue *= Multiplier; if (WholeNumbers) m_TargetValue = Mathf.Round(m_TargetValue); target.text = m_StringBuilder .Remove(0, m_StringBuilder.Length) .Append(Prefix) .Append(m_TargetValue) .Append(Suffix) .ToString(); } public override void UpdateTarget(ProgressorGroup progressorGroup) { if (!m_Initialized) Init(); if (target == null) return; if (!Enum.IsDefined(typeof(Mode), targetMode)) targetMode = Mode.Progress; targetMode = Mode.Progress; //force the target mode to be Progress m_TargetValue = progressorGroup.progress; if (UseMultiplier) m_TargetValue *= Multiplier; if (WholeNumbers) m_TargetValue = Mathf.Round(m_TargetValue); target.text = m_StringBuilder .Remove(0, m_StringBuilder.Length) .Append(Prefix) .Append(m_TargetValue) .Append(Suffix) .ToString(); } private void Init() { m_StringBuilder ??= new StringBuilder(); m_Initialized = true; } } }