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

125 lines
3.0 KiB
C#

// (c) Copyright HutongGames, LLC 2010-2013. All rights reserved.
using UnityEngine;
namespace HutongGames.PlayMaker.Actions
{
[ActionCategory(ActionCategory.Input)]
[ActionTarget(typeof(GameObject),"GameObject")]
[Tooltip("Sends Events based on mouse interactions with a Game Object: MouseOver, MouseDown, MouseUp, MouseOff. Use Ray Distance to set how close the camera must be to pick the object.\n\nNOTE: Picking uses the Main Camera.")]
public class MousePickEvent : FsmStateAction
{
[CheckForComponent(typeof(Collider))]
public FsmOwnerDefault GameObject;
[Tooltip("Length of the ray to cast from the camera.")]
public FsmFloat rayDistance = 100f;
[Tooltip("Event to send when the mouse is over the GameObject.")]
public FsmEvent mouseOver;
[Tooltip("Event to send when the mouse is pressed while over the GameObject.")]
public FsmEvent mouseDown;
[Tooltip("Event to send when the mouse is released while over the GameObject.")]
public FsmEvent mouseUp;
[Tooltip("Event to send when the mouse moves off the GameObject.")]
public FsmEvent mouseOff;
[Tooltip("Pick only from these layers.")]
[UIHint(UIHint.Layer)]
public FsmInt[] layerMask;
[Tooltip("Invert the mask, so you pick from all layers except those defined above.")]
public FsmBool invertMask;
[Tooltip("Repeat every frame.")]
public bool everyFrame;
public override void Reset()
{
GameObject = null;
rayDistance = 100f;
mouseOver = null;
mouseDown = null;
mouseUp = null;
mouseOff = null;
layerMask = new FsmInt[0];
invertMask = false;
everyFrame = true;
}
public override void OnEnter()
{
DoMousePickEvent();
if (!everyFrame)
{
Finish();
}
}
public override void OnUpdate()
{
DoMousePickEvent();
}
void DoMousePickEvent()
{
// Do the raycast
bool isMouseOver = DoRaycast();
// Store mouse pick info so it can be seen by Get Raycast Hit Info action
Fsm.RaycastHitInfo = ActionHelpers.mousePickInfo;
// Send events based on the raycast and mouse buttons
if (isMouseOver)
{
if (mouseDown != null && Input.GetMouseButtonDown(0))
{
Fsm.Event(mouseDown);
}
if (mouseOver != null)
{
Fsm.Event(mouseOver);
}
if (mouseUp != null &&Input.GetMouseButtonUp(0))
{
Fsm.Event(mouseUp);
}
}
else
{
if (mouseOff != null)
{
Fsm.Event(mouseOff);
}
}
}
bool DoRaycast()
{
var testObject = GameObject.OwnerOption == OwnerDefaultOption.UseOwner ? Owner : GameObject.GameObject.Value;
// ActionHelpers uses a cache to try and minimize Raycasts
return ActionHelpers.IsMouseOver(testObject, rayDistance.Value, ActionHelpers.LayerArrayToLayerMask(layerMask, invertMask.Value));
}
public override string ErrorCheck()
{
string errorString = "";
errorString += ActionHelpers.CheckRayDistance(rayDistance.Value);
errorString += ActionHelpers.CheckPhysicsSetup(Fsm.GetOwnerDefaultTarget(GameObject));
return errorString;
}
}
}