cvr-props/Assets/ABI.CCK/Components/AnimatorDriver.cs

212 lines
6.9 KiB
C#
Raw Permalink Normal View History

2023-07-30 01:20:46 +02:00
using System.Collections.Generic;
using UnityEngine;
namespace ABI.CCK.Components
{
[HelpURL("https://developers.abinteractive.net/cck/")]
public class AnimatorDriver : StateMachineBehaviour, ICCK_Component
2023-07-30 01:20:46 +02:00
{
public List<AnimatorDriverTask> EnterTasks = new List<AnimatorDriverTask>();
public List<AnimatorDriverTask> ExitTasks = new List<AnimatorDriverTask>();
public bool localOnly = false;
2023-07-30 01:20:46 +02:00
public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
foreach (var task in EnterTasks)
{
task.Execute(animator);
}
}
public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
foreach (var task in ExitTasks)
{
task.Execute(animator);
}
}
}
[System.Serializable]
public class AnimatorDriverTask
{
public enum Operator
{
Set,
Addition,
Subtraction,
Multiplication,
Division,
Modulo,
Power,
Log,
Equal,
NotEqual,
LessThen,
LessEqual,
MoreThen,
MoreEqual
}
public enum SourceType
{
Static,
Parameter,
Random
}
public enum ParameterType
{
None,
Float,
Int,
Bool,
Trigger
}
public ParameterType targetType = ParameterType.None;
public string targetName = "";
public Operator op = Operator.Set;
public SourceType aType = SourceType.Static;
public float aValue = 0f;
public float aMax = 1f;
public ParameterType aParamType;
public string aName = "";
public SourceType bType = SourceType.Static;
public float bValue = 0f;
public float bMax = 1f;
public ParameterType bParamType;
public string bName = "";
public void Execute(Animator animator)
{
float valA = 0f;
float valB = 0f;
float res = 0f;
switch (aType)
{
case SourceType.Static:
valA = aValue;
break;
case SourceType.Random:
valA = Random.Range(aValue, aMax);
break;
case SourceType.Parameter:
switch (aParamType)
{
default:
valA = 0f;
break;
case ParameterType.Bool:
valA = animator.GetBool(aName) ? 1f : 0f;
break;
case ParameterType.Float:
valA = animator.GetFloat(aName);
break;
case ParameterType.Int:
valA = animator.GetInteger(aName);
break;
}
break;
}
if (op == Operator.Set)
{
res = valA;
}
else
{
switch (bType)
{
case SourceType.Static:
valB = bValue;
break;
case SourceType.Random:
valB = Random.Range(bValue, bMax);
2023-07-30 01:20:46 +02:00
break;
case SourceType.Parameter:
switch (bParamType)
2023-07-30 01:20:46 +02:00
{
default:
valB = 0f;
break;
case ParameterType.Bool:
valB = animator.GetBool(bName) ? 1f : 0f;
break;
case ParameterType.Float:
valB = animator.GetFloat(bName);
break;
case ParameterType.Int:
valB = animator.GetInteger(bName);
break;
}
break;
}
switch (op)
{
case Operator.Addition:
res = valA + valB;
break;
case Operator.Subtraction:
res = valA - valB;
break;
case Operator.Multiplication:
res = valA * valB;
break;
case Operator.Division:
res = valA / valB;
break;
case Operator.Modulo:
res = valA % valB;
break;
case Operator.Power:
res = Mathf.Pow(valA, valB);
break;
case Operator.Log:
res = Mathf.Log(valA, valB);
break;
case Operator.Equal:
res = valA == valB ? 1f : 0f;
break;
case Operator.NotEqual:
res = valA != valB ? 1f : 0f;
break;
case Operator.LessThen:
res = valA < valB ? 1f : 0f;
break;
case Operator.LessEqual:
res = valA <= valB ? 1f : 0f;
break;
case Operator.MoreThen:
res = valA > valB ? 1f : 0f;
break;
case Operator.MoreEqual:
res = valA >= valB ? 1f : 0f;
break;
}
}
switch (targetType)
{
case ParameterType.Bool:
animator.SetBool(targetName, res >= 0.5f);
break;
case ParameterType.Trigger:
if (res >= 0.5f) animator.SetTrigger(targetName);
break;
case ParameterType.Float:
animator.SetFloat(targetName, res);
break;
case ParameterType.Int:
animator.SetInteger(targetName, Mathf.RoundToInt(res));
2023-07-30 01:20:46 +02:00
break;
}
}
}
}