You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/Feel/MMFeedbacks/MMFeedbacksForThirdParty/MMTools/Feedbacks/MMF_FloatingText.cs

157 lines
7.4 KiB
C#

using MoreMountains.Tools;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace MoreMountains.Feedbacks
{
/// <summary>
/// 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.
/// </summary>
[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;
/// <summary>
/// On play we ask the spawner on the specified channel to spawn a new floating text
/// </summary>
/// <param name="position"></param>
/// <param name="feedbacksIntensity"></param>
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;
}
}
}