手写Seek任务和CanSeeObject

任务的生命周期

 

在类里右键选择快速操作和重构

点击生成重写

选择需要重写的函数

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的共享变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值