内容纲要

Rigibody里面的Is Kinematic勾选上只能触发碰撞检测。
Repeat Forever:永久循环

抵御者行为树

夺旗战,抵御者行为,行为树切换,添加碰撞行为,添加巡逻敌人插图
判断是否看到抢夺者,在Can See Object里面设置参数,Object Layer Mask为Offense是判断抢夺者,设置速度角度距离。
Defend:抵御抢夺者,设置里面的速度角度,距离,以及玩家对象Target
Seek:设置速度,角度,以及站岗的位置
夺旗战,抵御者行为,行为树切换,添加碰撞行为,添加巡逻敌人插图(1)
设置变量,局部和全局的,Stand Target要用Transform.transform,用的是后面小箭头选择Flag,3,Transform,transform

夺旗战,抵御者行为,行为树切换,添加碰撞行为,添加巡逻敌人插图(2)
旗子被夺走后,追击旗子,设置参数,Target Transform设置成旗帜

行为树切换

public class CTFGameManager : MonoBehaviour {
    //制作单例模式
    private static CTFGameManager _instance;
    public static CTFGameManager Instance
    {
        get
        {
            return _instance;
        }
    }
    //把行为树存在集合里面
    private List<BehaviorTree> flagNotTakenBehaviorTrees = new List<BehaviorTree>();
    private List<BehaviorTree> flagTakenBehaviorTrees = new List<BehaviorTree>();
    private void Awake()//赋值
    {
        _instance = this;
    }
    // Use this for initialization
    void Start () {
        BehaviorTree[] bts = FindObjectsOfType<BehaviorTree>();//得到场景中所有的行为树,通过类型找到
        foreach(var bt in bts)
        {
            if (bt.Group == 1)
            {
                flagNotTakenBehaviorTrees.Add(bt);//区分行为树
            }
            else
            {
                flagTakenBehaviorTrees.Add(bt);//区分行为树
            }
        }
    }
    public void TakeFlag()//捡起旗帜
    {
        foreach(var bt in flagNotTakenBehaviorTrees)
        {
            if (BehaviorManager.instance.IsBehaviorEnabled(bt))//判断行为树是否启用
            {
                bt.DisableBehavior();//禁用自身
            }

        }
        foreach (var bt in flagTakenBehaviorTrees)
        {
            if (BehaviorManager.instance.IsBehaviorEnabled(bt) == false)
            {
                bt.EnableBehavior();//启用自身
            }
        }
    }
    public void DropFlag()
    {
        foreach (var bt in flagNotTakenBehaviorTrees)
        {
            if (BehaviorManager.instance.IsBehaviorEnabled(bt)==false)//判断行为树是否启用
            {
                bt.EnableBehavior();//启用自身
            }

        }
        foreach (var bt in flagTakenBehaviorTrees)
        {
            if (BehaviorManager.instance.IsBehaviorEnabled(bt))
            {
                bt.DisableBehavior();//禁用自身
            }
        }
}

添加玩家与敌人的碰撞

 public bool hasFlag = false;
    private Vector3 startPosition;
    private Quaternion startRoation;

    private void Start()
    {
        startPosition = transform.position;
        startRoation = transform.rotation;
    }
    public void OnCollisionEnter(Collision other)
    {
        if (other.collider.tag == "Defense")
        {
            if (hasFlag)
            {
                hasFlag = false;
                CTFGameManager.Instance.DropFlag();
                if (transform.childCount > 0)//拥有旗帜判断
                {
                    Transform flagTrans = transform.GetChild(0);//得到0号儿子就是旗帜
                    flagTrans.GetComponent<Flag>().owner = null;
                    flagTrans.parent = null;//旗帜拿下来
                }
            }

            transform.position = startPosition;
            transform.rotation = startRoation;
        }
    }

先记录坐标,判断碰撞的是否是敌人,拥有旗帜情况下发生碰撞,把旗帜放下来。记录坐标

旗子脚本


 public Offense owner;
    public void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Offense")
        {
            if (owner == null)//防止重复调用两个抢旗帜
            {
                CTFGameManager.Instance.TakeFlag();
            }
            if (owner != null)
            {
                owner.hasFlag = false;
            }
            other.GetComponent<Offense>().hasFlag = true;
            transform.parent = other.transform;
            owner = other.GetComponent<Offense>();

        }
    }

判断碰撞是否为玩家,如果是玩家,has flag就被设置为True。并且owner要作为全局变量,方便碰撞时调用。

敌人巡逻行为树

夺旗战,抵御者行为,行为树切换,添加碰撞行为,添加巡逻敌人插图(3)
用Repeater使得巡逻于四个点,勾选Repeat Forever无限循环
用Sequence使得在发现玩家时,巡逻被打断,对玩家进行追击。(用Lower Priority)
如果玩家拿到旗帜,直接对玩家进行追击。

1 对 “夺旗战,抵御者行为,行为树切换,添加碰撞行为,添加巡逻敌人”的想法;

  1. Pingback: buy viagra

发表评论