U3d_人工智能[二]之鸟群行为

本文介绍了在Unity3D中实现鸟群行为的关键要素,包括分离力、队列力和聚集力。通过这三种力的组合应用,模拟出逼真的鸟群动态效果。
摘要由CSDN通过智能技术生成

1. 鸟群行为,三个力为重点

    鸟群向着一个方向移动,在游戏中会给它们一个目标点,在朝着目标点飞行的时候,如果代码仅仅是让鸟群朝向目标点,然后向前移动,就会导致鸟群拥挤,特别是到达目标点之后鸟群会聚集在一起.
    我们要实现的效果是:
    1.鸟群不会聚集到一起(分离力)
    2.鸟群每个个体的方向不会一模一样,但是总体方向是向目标点移动的(队列力)
    3.个体鸟不会离大队伍太远(聚集力)
    以及一些其他的行为.
    既然是用力来影响速度,那就要用到牛顿第二定律:F=ma;在这里m是我们自己定义大小且不会改变,所以F与a成正比.三个力为分力,最终影响鸟的是这三个力的合力

2. 分离力

    public Vector3 velocity=Vector3.forward;//当前速度
    public Vector3 sumForce=Vector3.zero;//合力
    public float m = 1;//质量

    public List<GameObject> separationNeighbors = new List<GameObject> ();//用来存储范围内需要作用分离力的游戏物体
    public float separationDistion=3;//分离力检查范围
    public Vector3 separationForce=Vector3.zero;//分离力
    public float separationWeight = 1;//分离力的权重
    分离力由自身与周围鸟的距离决定其大小,方向则是与其它鸟相对方向的反方向.
    首先,检查出一定范围内的的鸟有哪些
Collider[] colliders = Physics.OverlapSphere(transform.position, separationDistion);//以第一个参数为球心,以第二个参数为半径发射一个球,返回碰撞到的所有collider
        //将获得的所有collider的游戏物体放到列表里面
        foreach (Collider c in colliders)
        {
            if (c != null && c.gameObject != this.gameObject)
            {
                separationNeighbors.Add(c.gameObject);
            }
        }
    获取到自身周围的鸟之后,每个鸟与自身的距离越小则分离力越大,方向就是又检测到的鸟指向本鸟
        //列表里的所有物体都给thisGameObject一个力
        foreach (GameObject neighbor in separationNeighbors)
        {
            Vector3 dir = transform.position - neighbor.transform.position;//此处获取的是一个向量,由目标鸟指向本鸟,长度为两鸟的距离
            separationForce += dir.normalized / dir.magnitude;//dir.normalized是将方向归一化(就是方向不变,长度变为1),dir.magnitude就是获取这个向量的长度
        }
        //分离力改变合力
        if (separationNeighbors.Count > 0)
        {
            separationForce *= separationWeight;
            
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值