92 lines
3.4 KiB
C#
92 lines
3.4 KiB
C#
|
|
using System.Collections.Generic;
|
|||
|
|
using Opsive.BehaviorDesigner.Runtime.Tasks;
|
|||
|
|
using Opsive.GraphDesigner.Runtime;
|
|||
|
|
using Opsive.GraphDesigner.Runtime.Variables;
|
|||
|
|
using Opsive.Shared.Utility;
|
|||
|
|
using UnityEngine;
|
|||
|
|
|
|||
|
|
namespace Cielonos.MainGame.Characters.AI
|
|||
|
|
{
|
|||
|
|
[Description("向指定的目标(或自身)派发一个上下文事件(ContextEvent),以便其行为树中的 HasReceivedContextEvent 节点能够响应。")]
|
|||
|
|
[NodeIcon("Assets/Sprites/Icon/Megaphone.png")]
|
|||
|
|
[Category("Cielonos/Events")]
|
|||
|
|
public class DispatchContextEvent : AutomataActionBase
|
|||
|
|
{
|
|||
|
|
[Tooltip("派发的目标列表。如果留空或未指定,则默认派发给 AI 自己。目标 GameObject 必须含有 BehaviorSubcontroller 组件。")]
|
|||
|
|
public List<SharedVariable<GameObject>> targetList;
|
|||
|
|
|
|||
|
|
[Tooltip("派发的事件名称")]
|
|||
|
|
public SharedVariable<string> eventName;
|
|||
|
|
|
|||
|
|
[Tooltip("(额外数据)参数1")]
|
|||
|
|
public SharedVariable arg1;
|
|||
|
|
[Tooltip("(额外数据)参数2")]
|
|||
|
|
public SharedVariable arg2;
|
|||
|
|
[Tooltip("(额外数据)参数3")]
|
|||
|
|
public SharedVariable arg3;
|
|||
|
|
|
|||
|
|
public override TaskStatus OnUpdate()
|
|||
|
|
{
|
|||
|
|
if (eventName == null || string.IsNullOrEmpty(eventName.Value))
|
|||
|
|
{
|
|||
|
|
Debug.LogWarning("[DispatchContextEvent] 未指定事件名称,派发失败。");
|
|||
|
|
return TaskStatus.Failure;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
object val1 = GetValueSafe(arg1);
|
|||
|
|
object val2 = GetValueSafe(arg2);
|
|||
|
|
object val3 = GetValueSafe(arg3);
|
|||
|
|
|
|||
|
|
if (targetList != null && targetList.Count > 0)
|
|||
|
|
{
|
|||
|
|
// 发送给目标列表中的所有单位
|
|||
|
|
foreach (SharedVariable<GameObject> targetGo in targetList)
|
|||
|
|
{
|
|||
|
|
if (targetGo != null)
|
|||
|
|
{
|
|||
|
|
var bSc = targetGo.Value.GetComponent<BehaviorSubcontroller>();
|
|||
|
|
if (bSc != null)
|
|||
|
|
{
|
|||
|
|
bSc.DispatchContextEvent(eventName.Value, val1, val2, val3);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// 尝试向其子节点的对象发送
|
|||
|
|
var charBase = targetGo.Value.GetComponent<CharacterBase>();
|
|||
|
|
if (charBase != null && charBase is Automata automata && automata.behaviorSc != null)
|
|||
|
|
{
|
|||
|
|
automata.behaviorSc.DispatchContextEvent(eventName.Value, val1, val2, val3);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// 列表为空,默认发给自己
|
|||
|
|
if (behaviorSc != null)
|
|||
|
|
{
|
|||
|
|
behaviorSc.DispatchContextEvent(eventName.Value, val1, val2, val3);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return TaskStatus.Success;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private object GetValueSafe(SharedVariable sharedVar)
|
|||
|
|
{
|
|||
|
|
return sharedVar?.GetValue() == null ? null : sharedVar.GetValue();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override void Reset()
|
|||
|
|
{
|
|||
|
|
base.Reset();
|
|||
|
|
eventName = "";
|
|||
|
|
targetList = null;
|
|||
|
|
arg1 = null;
|
|||
|
|
arg2 = null;
|
|||
|
|
arg3 = null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|