using MoreMountains.Tools; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace MoreMountains.Feedbacks { /// /// This feedback will request the spawn of a floating text, usually to signify damage, but not necessarily /// This requires that a MMFloatingTextSpawner be correctly setup in the scene, otherwise nothing will happen. /// To do so, create a new empty object, add a MMFloatingTextSpawner to it. Drag (at least) one MMFloatingText prefab into its PooledSimpleMMFloatingText slot. /// You'll find such prefabs already made in the MMTools/Tools/MMFloatingText/Prefabs folder, but feel free to create your own. /// Using that feedback will always spawn the same text. While this may be what you want, if you're using the Corgi Engine or TopDown Engine, you'll find dedicated versions /// directly hooked to the Health component, letting you display damage taken. /// [AddComponentMenu("")] [FeedbackHelp("This feedback will request the spawn of a floating text, usually to signify damage, but not necessarily. " + "This requires that a MMFloatingTextSpawner be correctly setup in the scene, otherwise nothing will happen. " + "To do so, create a new empty object, add a MMFloatingTextSpawner to it. Drag (at least) one MMFloatingText prefab into its PooledSimpleMMFloatingText slot. " + "You'll find such prefabs already made in the MMTools/Tools/MMFloatingText/Prefabs folder, but feel free to create your own. " + "Using that feedback will always spawn the same text. While this may be what you want, if you're using the Corgi Engine or TopDown Engine, you'll find dedicated versions " + "directly hooked to the Health component, letting you display damage taken.")] [FeedbackPath("UI/Floating Text")] public class MMF_FloatingText : MMF_Feedback { /// a static bool used to disable all feedbacks of this type at once public static bool FeedbackTypeAuthorized = true; /// sets the inspector color for this feedback #if UNITY_EDITOR public override Color FeedbackColor { get { return MMFeedbacksInspectorColors.UIColor; } } #endif /// the duration of this feedback is a fixed value or the lifetime public override float FeedbackDuration { get { return ApplyTimeMultiplier(Lifetime); } set { Lifetime = value; } } public override bool HasChannel => true; public override bool HasRandomness => true; /// the possible places where the floating text should spawn at public enum PositionModes { TargetTransform, FeedbackPosition, PlayPosition } [MMFInspectorGroup("Floating Text", true, 64)] /// the Intensity to spawn this text with, will act as a lifetime/movement/scale multiplier based on the spawner's settings [Tooltip("the Intensity to spawn this text with, will act as a lifetime/movement/scale multiplier based on the spawner's settings")] public float Intensity = 1f; /// the value to display when spawning this text [Tooltip("the value to display when spawning this text")] public string Value = "100"; /// if this is true, the intensity passed to this feedback will be the value displayed [Tooltip("if this is true, the intensity passed to this feedback will be the value displayed")] public bool UseIntensityAsValue = false; /// the possible methods that can be applied to the output value (when using intensity as the output value, string values won't get rounded) public enum RoundingMethods { NoRounding, Round, Ceil, Floor } /// the rounding methods to apply to the output value (when using intensity as the output value, string values won't get rounded) [Tooltip("the rounding methods to apply to the output value (when using intensity as the output value, string values won't get rounded)")] [MMFInspectorGroup("Rounding", true, 68)] public RoundingMethods RoundingMethod = RoundingMethods.NoRounding; [MMFInspectorGroup("Color", true, 65)] /// whether or not to force a color on the new text, if not, the default colors of the spawner will be used [Tooltip("whether or not to force a color on the new text, if not, the default colors of the spawner will be used")] public bool ForceColor = false; /// the gradient to apply over the lifetime of the text [Tooltip("the gradient to apply over the lifetime of the text")] [GradientUsage(true)] public Gradient AnimateColorGradient = new Gradient(); [MMFInspectorGroup("Lifetime", true, 66)] /// whether or not to force a lifetime on the new text, if not, the default colors of the spawner will be used [Tooltip("whether or not to force a lifetime on the new text, if not, the default colors of the spawner will be used")] public bool ForceLifetime = false; /// the forced lifetime for the spawned text [Tooltip("the forced lifetime for the spawned text")] [MMFCondition("ForceLifetime", true)] public float Lifetime = 0.5f; [MMFInspectorGroup("Position", true, 67)] /// where to spawn the new text (at the position of the feedback, or on a specified Transform) [Tooltip("where to spawn the new text (at the position of the feedback, or on a specified Transform)")] public PositionModes PositionMode = PositionModes.FeedbackPosition; /// in transform mode, the Transform on which to spawn the new floating text [Tooltip("in transform mode, the Transform on which to spawn the new floating text")] [MMFEnumCondition("PositionMode", (int)PositionModes.TargetTransform)] public Transform TargetTransform; /// the direction to apply to the new floating text (leave it to 0 to let the Spawner decide based on its settings) [Tooltip("the direction to apply to the new floating text (leave it to 0 to let the Spawner decide based on its settings)")] public Vector3 Direction = Vector3.zero; protected Vector3 _playPosition; protected string _value; /// /// On play we ask the spawner on the specified channel to spawn a new floating text /// /// /// protected override void CustomPlayFeedback(Vector3 position, float feedbacksIntensity = 1.0f) { if (!Active || !FeedbackTypeAuthorized) { return; } float intensityMultiplier = ComputeIntensity(feedbacksIntensity, position); switch (PositionMode) { case PositionModes.FeedbackPosition: _playPosition = Owner.transform.position; break; case PositionModes.PlayPosition: _playPosition = position; break; case PositionModes.TargetTransform: _playPosition = TargetTransform.position; break; } if (RoundingMethod != RoundingMethods.NoRounding) { switch (RoundingMethod) { case RoundingMethods.Ceil: break; } } feedbacksIntensity = ApplyRounding(feedbacksIntensity); _value = UseIntensityAsValue ? feedbacksIntensity.ToString() : Value; MMFloatingTextSpawnEvent.Trigger(ChannelData, _playPosition, _value, Direction, Intensity * intensityMultiplier, ForceLifetime, Lifetime, ForceColor, AnimateColorGradient, ComputedTimescaleMode == TimescaleModes.Unscaled); } protected virtual float ApplyRounding(float value) { if (RoundingMethod == RoundingMethods.NoRounding) { return value; } switch (RoundingMethod) { case RoundingMethods.Round: return Mathf.Round(value); case RoundingMethods.Ceil: return Mathf.Ceil(value); case RoundingMethods.Floor: return Mathf.Floor(value); } return value; } } }