IndieGame/client/Assets/ParadoxNotion/NodeCanvas/Tasks/Actions/Utility/ShoutEvent.cs
DOBEST\zhaoyingjie f242607587 初始化工程
2024-10-11 10:12:15 +08:00

56 lines
1.9 KiB
C#

using UnityEngine;
using System.Collections.Generic;
using NodeCanvas.Framework;
using ParadoxNotion.Design;
namespace NodeCanvas.Tasks.Actions
{
[Category("✫ Utility")]
[Description("Sends an event to all GraphOwners within range of the agent and over time like a shockwave.")]
public class ShoutEvent : ActionTask<Transform>
{
[RequiredField]
public BBParameter<string> eventName;
public BBParameter<float> shoutRange = 10;
public BBParameter<float> completionTime = 1;
private GraphOwner[] owners;
private bool[] receivedOwners;
private float traveledDistance;
protected override string info {
get { return string.Format("Shout Event [{0}]", eventName.ToString()); }
}
protected override void OnExecute() {
owners = Object.FindObjectsByType<GraphOwner>(FindObjectsSortMode.None);
receivedOwners = new bool[owners.Length];
}
protected override void OnUpdate() {
traveledDistance = Mathf.Lerp(0, shoutRange.value, elapsedTime / completionTime.value);
for ( var i = 0; i < owners.Length; i++ ) {
var owner = owners[i];
var distance = ( agent.position - owner.transform.position ).magnitude;
if ( distance <= traveledDistance && receivedOwners[i] == false ) {
owner.SendEvent(eventName.value, null, this);
receivedOwners[i] = true;
}
}
if ( elapsedTime >= completionTime.value ) {
EndAction();
}
}
public override void OnDrawGizmosSelected() {
if ( agent != null ) {
Gizmos.color = new Color(1, 1, 1, 0.2f);
Gizmos.DrawWireSphere(agent.position, traveledDistance);
Gizmos.DrawWireSphere(agent.position, shoutRange.value);
}
}
}
}