Files
2024-11-20 15:21:28 +01:00

126 lines
2.9 KiB
C#

// (c) Copyright HutongGames, LLC 2010-2016. All rights reserved.
using UnityEngine;
namespace HutongGames.PlayMaker.Actions
{
[ActionCategory(ActionCategory.Vector2)]
[Tooltip("Performs most possible operations on 2 Vector2: Dot product, Distance, Angle, Add, Subtract, Multiply, Divide, Min, Max")]
public class Vector2Operator : FsmStateAction
{
public enum Vector2Operation
{
DotProduct,
Distance,
Angle,
Add,
Subtract,
Multiply,
Divide,
Min,
Max
}
[RequiredField]
[Tooltip("The first vector")]
public FsmVector2 vector1;
[RequiredField]
[Tooltip("The second vector")]
public FsmVector2 vector2;
[Tooltip("The operation")]
public Vector2Operation operation = Vector2Operation.Add;
[UIHint(UIHint.Variable)]
[Tooltip("The Vector2 result when it applies.")]
public FsmVector2 storeVector2Result;
[UIHint(UIHint.Variable)]
[Tooltip("The float result when it applies")]
public FsmFloat storeFloatResult;
[Tooltip("Repeat every frame")]
public bool everyFrame;
public override void Reset()
{
vector1 = null;
vector2 = null;
operation = Vector2Operation.Add;
storeVector2Result = null;
storeFloatResult = null;
everyFrame = false;
}
public override void OnEnter()
{
DoVector2Operator();
if (!everyFrame)
{
Finish();
}
}
public override void OnUpdate()
{
DoVector2Operator();
}
void DoVector2Operator()
{
var v1 = vector1.Value;
var v2 = vector2.Value;
switch (operation)
{
case Vector2Operation.DotProduct:
storeFloatResult.Value = Vector2.Dot(v1, v2);
break;
case Vector2Operation.Distance:
storeFloatResult.Value = Vector2.Distance(v1, v2);
break;
case Vector2Operation.Angle:
storeFloatResult.Value = Vector2.Angle(v1, v2);
break;
case Vector2Operation.Add:
storeVector2Result.Value = v1 + v2;
break;
case Vector2Operation.Subtract:
storeVector2Result.Value = v1 - v2;
break;
case Vector2Operation.Multiply:
// I know... this is a far reach and not useful in 99% of cases.
// I do use it when I use vector2 as arrays recipients holding something else than a position in space.
var multResult = Vector2.zero;
multResult.x = v1.x * v2.x;
multResult.y = v1.y * v2.y;
storeVector2Result.Value = multResult;
break;
case Vector2Operation.Divide: // I know... this is a far reach and not useful in 99% of cases.
// I do use it when I use vector2 as arrays recipients holding something else than a position in space.
var divResult = Vector2.zero;
divResult.x = v1.x / v2.x;
divResult.y = v1.y / v2.y;
storeVector2Result.Value = divResult;
break;
case Vector2Operation.Min:
storeVector2Result.Value = Vector2.Min(v1, v2);
break;
case Vector2Operation.Max:
storeVector2Result.Value = Vector2.Max(v1, v2);
break;
}
}
}
}