134 lines
3.1 KiB
C#
134 lines
3.1 KiB
C#
// (c) Copyright HutongGames, LLC 2010-2013. All rights reserved.
|
|
|
|
using UnityEngine;
|
|
|
|
namespace HutongGames.PlayMaker.Actions
|
|
{
|
|
[ActionCategory(ActionCategory.Vector3)]
|
|
[Tooltip("Performs most possible operations on 2 Vector3: Dot product, Cross product, Distance, Angle, Project, Reflect, Add, Subtract, Multiply, Divide, Min, Max")]
|
|
public class Vector3Operator : FsmStateAction
|
|
{
|
|
public enum Vector3Operation
|
|
{
|
|
DotProduct,
|
|
CrossProduct,
|
|
Distance,
|
|
Angle,
|
|
Project,
|
|
Reflect,
|
|
Add,
|
|
Subtract,
|
|
Multiply,
|
|
Divide,
|
|
Min,
|
|
Max
|
|
}
|
|
|
|
[RequiredField]
|
|
public FsmVector3 vector1;
|
|
[RequiredField]
|
|
public FsmVector3 vector2;
|
|
public Vector3Operation operation = Vector3Operation.Add;
|
|
|
|
[UIHint(UIHint.Variable)]
|
|
public FsmVector3 storeVector3Result;
|
|
|
|
[UIHint(UIHint.Variable)]
|
|
public FsmFloat storeFloatResult;
|
|
|
|
public bool everyFrame;
|
|
|
|
public override void Reset()
|
|
{
|
|
vector1 = null;
|
|
vector2 = null;
|
|
operation = Vector3Operation.Add;
|
|
storeVector3Result = null;
|
|
storeFloatResult = null;
|
|
everyFrame = false;
|
|
}
|
|
|
|
public override void OnEnter()
|
|
{
|
|
DoVector3Operator();
|
|
|
|
if (!everyFrame)
|
|
{
|
|
Finish();
|
|
}
|
|
}
|
|
|
|
public override void OnUpdate()
|
|
{
|
|
DoVector3Operator();
|
|
}
|
|
|
|
void DoVector3Operator()
|
|
{
|
|
var v1 = vector1.Value;
|
|
var v2 = vector2.Value;
|
|
|
|
switch (operation)
|
|
{
|
|
case Vector3Operation.DotProduct:
|
|
storeFloatResult.Value = Vector3.Dot(v1, v2);
|
|
break;
|
|
|
|
case Vector3Operation.CrossProduct:
|
|
storeVector3Result.Value = Vector3.Cross(v1, v2);
|
|
break;
|
|
|
|
case Vector3Operation.Distance:
|
|
storeFloatResult.Value = Vector3.Distance(v1, v2);
|
|
break;
|
|
|
|
case Vector3Operation.Angle:
|
|
storeFloatResult.Value = Vector3.Angle(v1, v2);
|
|
break;
|
|
|
|
case Vector3Operation.Project:
|
|
storeVector3Result.Value = Vector3.Project(v1, v2);
|
|
break;
|
|
|
|
case Vector3Operation.Reflect:
|
|
storeVector3Result.Value = Vector3.Reflect(v1, v2);
|
|
break;
|
|
|
|
case Vector3Operation.Add:
|
|
storeVector3Result.Value = v1 + v2;
|
|
break;
|
|
|
|
case Vector3Operation.Subtract:
|
|
storeVector3Result.Value = v1 - v2;
|
|
break;
|
|
|
|
case Vector3Operation.Multiply:
|
|
// I know... this is a far reach and not useful in 99% of cases.
|
|
// I do use it when I use vector3 as arrays recipients holding something else than a position in space.
|
|
var multResult = Vector3.zero;
|
|
multResult.x = v1.x * v2.x;
|
|
multResult.y = v1.y * v2.y;
|
|
multResult.z = v1.z * v2.z;
|
|
storeVector3Result.Value = multResult;
|
|
break;
|
|
|
|
case Vector3Operation.Divide: // I know... this is a far reach and not useful in 99% of cases.
|
|
// I do use it when I use vector3 as arrays recipients holding something else than a position in space.
|
|
var divResult = Vector3.zero;
|
|
divResult.x = v1.x / v2.x;
|
|
divResult.y = v1.y / v2.y;
|
|
divResult.z = v1.z / v2.z;
|
|
storeVector3Result.Value = divResult;
|
|
break;
|
|
|
|
case Vector3Operation.Min:
|
|
storeVector3Result.Value = Vector3.Min(v1, v2);
|
|
break;
|
|
|
|
case Vector3Operation.Max:
|
|
storeVector3Result.Value = Vector3.Max(v1, v2);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
} |