编写自定义动作执行器
在 MonoBehaviour 上实现 IConvaiActionExecutor,以将自定义移动、库存、UI 或物理行为连接到 Convai 动作管线。
最后更新于
这有帮助吗?
这有帮助吗?
GameObject targetGo = invocation.ResolvedTarget?.GameObjectReference;while (!arrived)
{
cancellationToken.ThrowIfCancellationRequested();
// 前进一步
await Task.Yield();
}try
{
await SomeAsyncOperation(cancellationToken);
}
catch (OperationCanceledException)
{
return ConvaiActionExecutionResult.Canceled();
}using System.Threading;
using System.Threading.Tasks;
using Convai.Runtime.Actions;
using UnityEngine;
[AddComponentMenu("MyProject/Actions/高亮对象执行器")]
public sealed class HighlightObjectExecutor : MonoBehaviour, IConvaiActionExecutor
{
[SerializeField] private float _highlightDuration = 3f;
public async Task<ConvaiActionExecutionResult> ExecuteAsync(
ConvaiActionInvocation invocation,
CancellationToken cancellationToken)
{
// 1. 获取目标
GameObject targetGo = invocation.ResolvedTarget?.GameObjectReference;
if (targetGo == null)
return ConvaiActionExecutionResult.Failed("高亮动作未解析到目标。");
// 2. 查找所需组件
var outline = targetGo.GetComponent<OutlineEffect>();
if (outline == null)
return ConvaiActionExecutionResult.Failed(
$"目标 '{invocation.ResolvedTarget.Name}' 没有 OutlineEffect 组件。");
// 3. 执行行为
outline.enabled = true;
try
{
// 4. 等待,同时尊重取消
await Task.Delay(
(int)(_highlightDuration * 1000),
cancellationToken);
}
catch (OperationCanceledException)
{
// 在取消时清理
if (outline != null)
outline.enabled = false;
return ConvaiActionExecutionResult.Canceled();
}
// 5. 清理并返回成功
if (outline != null)
outline.enabled = false;
return ConvaiActionExecutionResult.Succeeded();
}
}public async Task<ConvaiActionExecutionResult> ExecuteAsync(
ConvaiActionInvocation invocation,
CancellationToken cancellationToken)
{
// 阶段 1:导航
ConvaiActionExecutionResult moveResult =
await _mover.ExecuteAsync(invocation, cancellationToken);
if (moveResult.Status != ConvaiActionExecutionStatus.Succeeded)
return moveResult;
// 阶段 2:交互
cancellationToken.ThrowIfCancellationRequested();
_animator.SetTrigger("Interact");
// 阶段 3:等待动画
await Task.Delay(1200, cancellationToken);
// 阶段 4:应用效果
ApplyInteractionEffect(invocation.ResolvedTarget?.GameObjectReference);
return ConvaiActionExecutionResult.Succeeded();
}