Unity3D 人工智能(一)群组行为

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36848370/article/details/78055790

1,群组行为的介绍,不使用群组行为算法的样子

导入一个乌鸦模型  乌鸦模型 。。链接: https://pan.baidu.com/s/1kV9TPY3 密码: zg7u

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Crow : MonoBehaviour {
    public Transform target; //向目标飞行
    public float speed = 1;
    //1, public Vector3 velocity = Vector3.forward; //向前方
    public  float animRandmTime=2f;
    private Animation anim;
    private IEnumerator Start()
    {
        target = GameObject.Find("target").transform;
        anim = GetComponentInChildren<Animation>();
        yield return new WaitForSeconds(Random.Range(0, animRandmTime) );
        Debug.Log(Random.Range(0, animRandmTime));
        anim.Play();
    }
	void Update () {
        // 1, transform.Translate(velocity * Time.deltaTime, Space.World);
        transform.LookAt(target.position);

        transform.Translate(target.position*Time.deltaTime*speed);

	}
}

2, 分离 队列 聚集 

分离: 鸟A和鸟B靠太近(靠近不能超过最近的距离)会分开 

队列: 鸟群正在飞行。 意思就是跟着大部队走

扫描二维码关注公众号,回复: 3365201 查看本文章

聚集:  既不能脱离部队太远又不能靠的太近

如图所示

所有的实现都是通过力的方式

3,牛顿第二定律

1,速度v

2,加速度a   (例: 3m/s²   最开始是2m , 5m,8m)

3,质量m 

4,牛顿第二定律F=m*a  (反推 a=F/m)

   F为受到的力(就是上面的三种分离,队列,聚集)

反推 a=F/m      

m是固定不变的 可以暂时忽略掉    a =F

4,得到最近的乌鸦 游戏物体的集合

1 现在每个乌鸦身上添加collider  然后吧之前的Crow代码个去掉 新建一个CrowAI脚本

2 用代码获得 附近乌鸦的集合,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CrowAI : MonoBehaviour {
    /// <summary>
    /// 距离我们三米内的乌鸦 就会跟其他乌鸦进行分离
    /// </summary>
    [Header("距离我们三米内的乌鸦 就会跟其他乌鸦进行分离")]
    public float separationDistance = 3;

    [Header("要添加的 3米附近的乌鸦集合 ")] 
    public List<GameObject> seaprationNeighbors = new List<GameObject>();

    /// <summary>
    /// 综合的力
    /// </summary>
    [Header("综合的力")]
    public Vector3 sumForce = Vector3.zero;
    /// <summary>
    /// 分离的力
    /// </summary>
    [Header("分离的力")]
    public Vector3 separationFirce = Vector3.zero;
    /// <summary>
    /// 队列的力
    /// </summary>
    [Header("队列的力")]
    public Vector3 alignmentForce = Vector3.zero;
    /// <summary>
    /// 聚集的力
    /// </summary>
    [Header("聚集的力")]
    public Vector3 cohesionForce = Vector3.zero;

    /// <summary>
    /// 检查的时间间隔 (一秒计算五次)
    /// </summary>
    [Header("检查的时间间隔")]
    public float chechInterval = 0.2f;

	void Start () {
        InvokeRepeating("CalcForce", 0, chechInterval);
	}
	void CalcForce()
    {
        seaprationNeighbors.Clear();
      Collider[] colliders=  Physics.OverlapSphere(this.transform.position, separationDistance);

        foreach (Collider item in colliders)
        {
            if (item != null && item.gameObject != this.gameObject)
            {
                seaprationNeighbors.Add(item.gameObject);
            }
        }
        //int i = 0;
        //while (i<colliders.Length)
        //{
        //    if (colliders!=null&& colliders[i].gameObject!=this.gameObject)
        //    { 
        //        seaprationNeighbors.Add(colliders[i].gameObject);
        //    }
        //    i++;
        //} 
        print(seaprationNeighbors.Count);
    }
	// Update is called once per frame
	void Update () {
		
	}
}

5,将分离的力用在乌鸦身上

猜你喜欢

转载自blog.csdn.net/qq_36848370/article/details/78055790