Playmaker Forum
PlayMaker Updates & Downloads => Share New Actions => Topic started by: speedything on January 06, 2012, 10:20:10 PM
-
Following my theme of randomness, here's a new action. It allows you to find a random point within a transform, or at least it will for cubes and rectangles. Not so effective for circular objects...
using UnityEngine;
namespace HutongGames.PlayMaker.Actions
{
[ActionCategory(ActionCategory.Transform)]
[Tooltip("Gets a Random Position in a Transform")]
public class GetRandomPositionInTransform : FsmStateAction
{
[RequiredField]
public FsmOwnerDefault gameObject;
[UIHint(UIHint.Variable)]
public FsmVector3 vector;
[UIHint(UIHint.Variable)]
public FsmFloat x;
[UIHint(UIHint.Variable)]
public FsmFloat y;
[UIHint(UIHint.Variable)]
public FsmFloat z;
public Space space;
public bool everyFrame;
public override void Reset()
{
gameObject = null;
vector = null;
x = null;
y = null;
z = null;
space = Space.World;
everyFrame = false;
}
public override void OnEnter()
{
DoGetRandomPositionInTransform();
if (!everyFrame)
Finish();
}
public override void OnUpdate()
{
DoGetRandomPositionInTransform();
}
void DoGetRandomPositionInTransform()
{
GameObject go = Fsm.GetOwnerDefaultTarget(gameObject);
if (go == null) return;
Vector3 position;
if (space == Space.World)
{
position = go.transform.position;
}
else
{
position = go.transform.localPosition;
}
Vector3 scale;
if (space == Space.World)
{
scale = go.transform.lossyScale;
}
else
{
scale = go.transform.localScale;
}
var halfX = scale.x/2f;
var halfY = scale.y/2f;
var halfZ = scale.z/2f;
var randomX = Random.Range(-halfX, halfX);
var randomY = Random.Range(-halfY, halfY);
var randomZ = Random.Range(-halfZ, halfZ);
x.Value = position.x + randomX;
y.Value = position.y + randomY;
z.Value = position.z + randomZ;
Vector3 randomVector3;
randomVector3.x = x.Value;
randomVector3.y = y.Value;
randomVector3.z = z.Value;
vector.Value = randomVector3;
}
}
}
Personally I'm using this to give my AI people a variety of destinations within an area that I can simply bound by creating a rectangle object.
Bye,