Skip to content

dingxiaowei/AIDemo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Behavior Designer 使用

  • Patrol 巡逻行为 基于NavMesh导航组件的行为

  • 巡逻如果发现目标并跟随

AbortType:LowerPriority会终止比自己优先级低的行为

AbortType:Self会终止自身的运行

AbortType:Both两种情况都会判定,情况是Seek过程中看到敌人并追随,但敌人走的比较快,还会终端自身的Seek,继续右边的Seek。

  • 自定义行为组件 MySeek

using BehaviorDesigner.Runtime.Tasks;

using UnityEngine;

// <summary>

// 控制游戏物体达到目标位置

// </summary>

public class MySeek : Action //任务的调用由Behavior Designer行为树控制的

{

    /// <summary>

    /// 要达到的目标位置

    /// </summary>

    public Transform Target;

    public float Speed;

    /// <summary>

    /// 到达目标位置的距离

    /// </summary>

    public float ArriveDistance = 0.1f;

    private float sqrArriveDistance;



    /// <summary>

    /// 每次重新进入的时候都会重新计算

    /// </summary>

    public override void OnStart()

    {

        sqrArriveDistance = ArriveDistance * ArriveDistance; 

    }



    ///当进入这个任务的时候,会一直调用这个方法,一直到任务结束 你返回一个成功或者失败状态 那么任务结束 如果返回一个running状态,那这个方法会一直继续调用

    public override TaskStatus OnUpdate()

    {

        if (Target == null)

            return TaskStatus.Failure;

        transform.LookAt(Target.position);

        transform.position = Vector3.MoveTowards(transform.position, Target.position, Speed * Time.deltaTime);

        //如果距离目标位置比较小则达到目标位置

        if ((Target.position - transform.position).sqrMagnitude < sqrArriveDistance)

        {

            return TaskStatus.Success;

        }

        return TaskStatus.Running;

    }

}

在行为组件里面会显示我们自定义的组件。

  • 自定义条件组件 MyCanSeeObject

using BehaviorDesigner.Runtime;

using BehaviorDesigner.Runtime.Tasks;

using UnityEngine;

/// <summary>

/// 判断目标是否在视野内

/// </summary>

public class MyCanSeeObject : Conditional

{

    /// <summary>

    /// 判断是否在视野内的目标

    /// </summary>

    public Transform[] Targets;

    /// <summary>

    /// 视野的角度范围

    /// </summary>

    public float FieldOfViewAngle = 90f;

    /// <summary>

    /// 视野距离

    /// </summary>

    public float ViewDistance = 7f;

    /// <summary>

    /// 不需要赋值,这个是共享找到的目标

    /// </summary>

    public SharedTransform Target;

    public override TaskStatus OnUpdate()

    {

        if (Targets == null)

            return TaskStatus.Failure;

        foreach(var target in Targets)

        {

            float distance = (target.position - transform.position).magnitude;

            float angle = Vector3.Angle(transform.forward, target.position - transform.position);

            if (distance < ViewDistance && angle < FieldOfViewAngle * 0.5f)

            {

                this.Target.Value = target;

                return TaskStatus.Success;

            }

        }

        return TaskStatus.Failure;

    }

}

  • 取反操作

  • 远离行为

About

基于Behavior Designer设计的行为树Demo

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages