任务的生命周期
在类里右键选择快速操作和重构
点击生成重写
选择需要重写的函数
Seek任务
using BehaviorDesigner.Runtime;
using BehaviorDesigner.Runtime.Tasks;
using UnityEngine;
//动作任务
public class NNSeek : Action
{
//SharedGameObject 共享对象,绑定变量
public SharedGameObject target;//目标
public float speed;//速度
public float arriveDistance;//到达距离停止
public override TaskStatus OnUpdate()
{
//跟踪目标
//如果没有目标,返回false
if(target == null)
{
return TaskStatus.Failure;//失败
}
//朝向目标转动
transform.LookAt(target.Value.transform.position);//通过.Value返回GameObject对象
//朝着目标移动
//Vector3.MoveTowards插值计算,参数:1、自己的位置,2、目标的位置,3、速度
transform.position = Vector3.MoveTowards(transform.position,target.Value.transform.position,speed*Time.deltaTime);
//如果自己和目标的距离小于某个值,返回true
if ((target.Value.transform.position-transform.position).sqrMagnitude < arriveDistance)
{
return TaskStatus.Success;
}
return TaskStatus.Running;//正在运行
}
}
CanSeeObject任务
using BehaviorDesigner.Runtime;
using BehaviorDesigner.Runtime.Tasks;
using System.Collections.Generic;
using UnityEngine;
//条件任务
public class NNCanSeeObject : Conditional
{
public List<GameObject> targets;
public float distance;//视野距离
public float viewAngle;//视野角度
//SharedGameObject 共享对象,绑定变量
public SharedGameObject outTarget;//返回目标
public override TaskStatus OnUpdate()
{
//判断空
if(targets == null)
{
return TaskStatus.Failure;
}
//遍历所有的目标
foreach (var item in targets)
{
//先判断是否在距离之内
//然后再判断是否在方向之内
//如果找到,就返回成功
//计算距离
var dis = (item.transform.position - transform.position).magnitude;
//计算角度,参数:1、自己前方的向量,2、自己与目标点之间的向量
var angle = Vector3.Angle(transform.forward, item.transform.position - transform.position);
if(dis < distance && angle*2 < viewAngle)
{
//通过.Value返回GameObject对象
outTarget.Value = item;//返回目标
return TaskStatus.Success;
}
}
return TaskStatus.Failure;
}
}
添加创建的任务
创建公共变量Target
设置NNSeek的共享变量
设置NNCanSeeObject的共享变量