开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1631

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 449|回复: 0

[云图] behave行为树学习使用第四天

[复制链接]  [移动端链接]
抢楼 抢楼 本帖为抢楼帖,欢迎抢楼! 
排名
365
昨日变化
1

43

主题

351

帖子

3896

积分

Rank: 9Rank: 9Rank: 9

UID
42814
好友
32
蛮牛币
5887
威望
0
注册时间
2014-8-31
在线时间
1184 小时
最后登录
2017-3-29

专栏作家

QQ
发表于 2015-11-22 19:12:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
大家好,这次给大家继续带来behave行为树的第四个内容,选择节点。
   选择节点就像嵌套一个if语句,子节点会从左到右依次执行,和顺序节点不同的是,选择节点的子节点返回成功,则整个节点返回成功,如果子节点返回失败,
则运行右边的一个子节点,并继续运行,一直到运行到子节点的末尾一个,则返回失败,下一次选择节点再被触发的时候,又从最左边 第一个节点开始运行。
3-1.png   添加选择节点,如图 。 我们添加了一个巡逻,攻击,和空闲三个状态。

然后我们到脚本中创建3个类,命名规则和以往一样。
[C#] 纯文本查看 复制代码
 private int enemyDistance = 200;
    private int enemyHealth = 100;

    public BehaveResult TickPatrolAction(Tree sender)
    {
        if (enemyDistance > 100)
        {
            enemyDistance -= 10;
            Debug.Log("接近敌人"+enemyDistance.ToString());
            return BehaveResult.Running;
        }
        else
        {
            Debug.Log("已经足够接近敌人");
            return BehaveResult.Failure;
        }
    }

    public BehaveResult TickAttackAction(Tree sender)
    {
        enemyHealth -= 5;
        Debug.Log("攻击敌人,敌人还剩余血量"+enemyHealth.ToString());
        if (enemyHealth <= 0)
        {
            Debug.Log("敌人已经死亡");
            return BehaveResult.Failure;
        }
        else
        {
            return BehaveResult.Running;
        }
    }

    public BehaveResult TickIdleAction(Tree sender)
    {
        enemyHealth = 100;
        enemyDistance = 200;
        Debug.Log("空闲状态");
        return BehaveResult.Success;
    }


在巡逻方法中,我们递减了敌人距离的变量,检查是否足够接近,不够接近返回running,继续运行该子节点,如果距离足够接近,则返回失败,运行下一个,
也就是攻击节点。  在攻击方法中,我们递减敌人生命值,如果敌人血量还足够多,我们则返回running继续运行,如果敌人血量小于等于0,则返回失败,
继续运行下一个 也就是空闲方法。 在空闲方法中我们重新恢复敌人距离和血量,然后返回成功,则整个节点返回成功,重新又执行一遍,下面是运行状态
3-2.png
ok,选择节点和顺序节点是不是差不多,只是逻辑不一样呢。代码也不多,我重新写了一个类,所以也不提供下载了,直接贴上代码,好了,今天的内容就是 选择节点

[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
using Behave.Runtime;
using Tree = Behave.Runtime.Tree;
public class patrolttackIdle : MonoBehaviour, IAgent
{
    Tree m_Tree;
    IEnumerator Start()
    {
        m_Tree = BLAgentBehaveLib.InstantiateTree(BLAgentBehaveLib.TreeType.NewCollection1_xuanze, this);

        while (Application.isPlaying && m_Tree != null)
        {
            yield return new WaitForSeconds(1.0f / m_Tree.Frequency);
            AIUpdate();
        }
    }
    void AIUpdate()
    {
        m_Tree.Tick();
    }
    public void Reset(Tree sender)
    {
        //先啥也不干
    }
    public int SelectTopPriority(Tree sender, params int[] IDs)
    {
        return 0;
    }
    public BehaveResult Tick(Tree sender, bool init)
    {
        Debug.Log("调用系统的Tick方法");
        return BehaveResult.Success;
    }

    private int enemyDistance = 200;
    private int enemyHealth = 100;

    public BehaveResult TickPatrolAction(Tree sender)
    {
        if (enemyDistance > 100)
        {
            enemyDistance -= 10;
            Debug.Log("接近敌人"+enemyDistance.ToString());
            return BehaveResult.Running;
        }
        else
        {
            Debug.Log("已经足够接近敌人");
            return BehaveResult.Failure;
        }
    }

    public BehaveResult TickAttackAction(Tree sender)
    {
        enemyHealth -= 5;
        Debug.Log("攻击敌人,敌人还剩余血量"+enemyHealth.ToString());
        if (enemyHealth <= 0)
        {
            Debug.Log("敌人已经死亡");
            return BehaveResult.Failure;
        }
        else
        {
            return BehaveResult.Running;
        }
    }

    public BehaveResult TickIdleAction(Tree sender)
    {
        enemyHealth = 100;
        enemyDistance = 200;
        Debug.Log("空闲状态");
        return BehaveResult.Success;
    }
}



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表