hi all , I am recently use more playmaker on a project i am on ( almost exclusively)
and wanted to share a little action..XD
i use that often with animated stuff , etc..may not super optimized or perfect for all fit ...
simple enough 0 no constrain 1 full constrain and you can eventually put whatever number you want in the both vector.
here we go >
using UnityEngine;
namespace HutongGames.PlayMaker.Actions
{
[ActionCategory(ActionCategory.Transform)]
[Tooltip("Constrain position and rotation to any other object, 0 for no constrain, 1 for full constrain")]
public class Constrain : FsmStateAction
{
[RequiredField]
public FsmOwnerDefault gameObject;
[RequiredField]
[UIHint(UIHint.FsmGameObject)]
public FsmGameObject target;
public FsmBool doRotation;
public FsmVector3 rotationConstrain;
public FsmBool doPosition;
public FsmVector3 positionConstrain;
public FsmVector3 offsetPosition;
public bool everyFrame;
public override void Reset ()
{
gameObject = null;
target = null;
doRotation = null;
doPosition = null;
rotationConstrain = null;
positionConstrain = null;
offsetPosition = null;
everyFrame = false;
}
public override void OnEnter ()
{
DoConstrain();
if (!everyFrame)
Finish();
}
public override void OnUpdate ()
{
DoConstrain();
}
void DoConstrain()
{
var go = Fsm.GetOwnerDefaultTarget(gameObject);
if (go == null)
return;
var tr = target.Value.transform;
if(tr == null)
return;
// perform constraining
var wantedPosition = tr.TransformPoint(offsetPosition.Value);
// calculate position
if(doPosition.Value == true)
{
wantedPosition = new Vector3( wantedPosition.x * positionConstrain.Value.x,
wantedPosition.y * positionConstrain.Value.y,
wantedPosition.z * positionConstrain.Value.z);
go.transform.position = wantedPosition;
}
// calculate rotation
go.transform.eulerAngles = new Vector3( tr.eulerAngles.x * rotationConstrain.Value.x,
tr.eulerAngles.y * rotationConstrain.Value.y,
tr.eulerAngles.z * rotationConstrain.Value.z);
}
}
}