Playmaker Forum

PlayMaker Updates & Downloads => Share New Actions => Topic started by: jeanfabre on January 02, 2012, 03:25:03 AM

Title: get distance with axis ignore flags
Post by: jeanfabre on January 02, 2012, 03:25:03 AM
Hi,

 following Withthewicked request http://hutonggames.com/playmakerforum/index.php?topic=974.msg4006#msg4006 (http://hutonggames.com/playmakerforum/index.php?topic=974.msg4006#msg4006)

 Here is a more flexible version of GetDistance action that accepts flags to ignore x y or z axis ( workd coordinates reference).

 With these flags you can obtain the following information:

if x axis is ignored only: you get the distance on the world YZ plane

if Y and Z axis are ignored, you get the distance on the world x axis

 You can then deduce the different combinations of flags from this. warning, ignoring all axis obvioulsy will give you a distance of 0...

possible improvements: instead of using global axis, we could have this action using the ownergameObject for the axis reference thus giving us the ability to get for the example the "x" distance FROM the gameObject coordinates not from a world coordinate point of view.

 
Code: [Select]
// (c) Copyright HutongGames, LLC 2010-2011. All rights reserved.

using UnityEngine;

namespace HutongGames.PlayMaker.Actions
{
[ActionCategory(ActionCategory.GameObject)]
[Tooltip("Measures the Distance betweens 2 Game Objects and stores the result in a Float Variable. \nOptionaly ignore axis to obtain planar distance axis distance. \nExample: ignore the y axis only to obtain the distance on the YZ plane. \nExample: ignore Y and Z to obtain the distance on the x axis.")]
public class GetWorldDistance : FsmStateAction
{
[RequiredField]
[Tooltip("The Game Object to work with")]
public FsmOwnerDefault gameObject;

[RequiredField]
[Tooltip("The target Game Object to work with")]
public FsmGameObject target;

[RequiredField]
[Tooltip("Store the distance between the gameObject and the target")]
[UIHint(UIHint.Variable)]
public FsmFloat storeResult;

[Tooltip("The world x axis is ignored")]
public bool ignoreX;

[Tooltip("The world y axis is ignored")]
public bool ignoreY;

[Tooltip("The world z axis is ignored")]
public bool ignoreZ;


public bool everyFrame;


public override void Reset()
{
gameObject = null;
target = null;
storeResult = null;

ignoreX = false;
ignoreY = false;
ignoreZ = false;

everyFrame = true;
}

public override void OnEnter()
{
DoGetDistance();

if (!everyFrame)
Finish();
}
public override void OnUpdate()
{
DoGetDistance();
}

void DoGetDistance()
{
GameObject go = gameObject.OwnerOption == OwnerDefaultOption.UseOwner ? Owner : gameObject.GameObject.Value;

if (go == null || target.Value == null || storeResult == null)
return;



if (!ignoreX && !ignoreY && ! ignoreZ)
{
storeResult.Value = Vector3.Distance(go.transform.position, target.Value.transform.position);
}else{

Vector3 vector = target.Value.transform.position - go.transform.position;
if (ignoreX)
{
vector.x = 0;
}
if (ignoreY)
{
vector.y = 0;
}
if(ignoreZ)
{
vector.z = 0;
}

storeResult.Value = vector.magnitude;
}

}

}
}

Comment and questions welcome :)

 Bye,

 Jean
Title: Re: get distance with axis ignore flags
Post by: Andrew.Lukasik on January 02, 2012, 12:06:22 PM
Nice. I'm sure this will help me with something very soon.
Thanks Jeanfabre!
Title: Re: get distance with axis ignore flags
Post by: tobbeo on January 03, 2012, 12:49:17 AM
I like this one a lot too, thanks Jean!
Title: Re: get distance with axis ignore flags
Post by: WitchTheWicked on January 07, 2012, 01:58:32 AM
I love this alot!