Unity人工智能学习—简单的集群运动算法

一、介绍

本篇的主要内容是解决大量物体运动时候不发生相互碰撞和重叠等的算法,本篇使用的Unity2018.2.14,算法的脚本主要就两个,一个创建大量鱼并进行初始化的脚本,还有一个就是核心的鱼集群运动的算法。效果如图所示


二、实现

1、首先,需要再指定的区域随机的创建大量的鱼,代码如下,其中goalPos会再集群运动的单个鱼中会用到,这里只是再随机的时间里随机的改变其值。

2、然后是集群运动的单个鱼的控制,在初始化的时候先让其运动的速度和游动的动画速度随机。

public override void Init()
{
    base.Init();
    parentPos = Global_FlockManage.M_Instance.transform.position;
    moveSpeed = Random.Range(1f, 2);
    Animation tempAnim = GetComponent<Animation>();
    tempAnim[moveAnimName].speed = Random.Range(0f, 1.0f);
}

然后,其转弯的逻辑上做两种处理,第一种是鱼和边界之间,如果当前鱼游动的位置超过了预定的边界,则立马掉头

    protected override void Update_State()
    {
        //如果距离母物体的距离超过了指定的范围就设置开始掉头为true;
        float tempDis2ParentPos = Vector3.Distance(transform.position, parentPos);
        turning = (Global_FlockManage.M_Instance.M_SizeArea <= tempDis2ParentPos);
 
        if(turning)
        {
            Vector3 tempDir = parentPos - transform.position;
            transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(tempDir), rotationSpeed * Time.deltaTime);
            moveSpeed = Random.Range(0.5f, 1);
        }
        transform.Translate(0, 0, Time.deltaTime * moveSpeed);
    }

还有一种是鱼和鱼之间,其基本思路就是鱼和其他所有的鱼的位置进行计算,如果有其他鱼的位置在设定的范围内,则将其和当前控制鱼的位置计算方向向量。让后将所有的这个方向向量进行相加,就可以得到它应该去到所有其他在需要规避范围内的鱼的位置的中心点,该中心点和鱼当前位置的向量为向量1,向量1再和总控中的goalPos位置与当前鱼位置的方向向量2,组成方向向量3,然后在计算控制鱼与其他鱼的相反向量为向量4,最后向量4和向量3计算当前鱼的转动方向。其运动的速度取所有范围内的鱼的平均值。

完整代码如下:

3、最后还有一个我自己写的基类代码BaseGameObj

三、总结

1、真的模型的大小没有考虑,在模型的大小和它们应该规避的最小距离之间没有进行处理

2、运动的随机性比较符合预期

来源:CSDN,作者:凯尔八阿哥,转载此文目的在于传递更多信息,版权归原作者所有。
原文:https://blog.csdn.net/zhangxiao13627093203/article/details/96306402
版权声明:本文为博主原创文章,转载请附上博文链接!

推荐阅读