版权声明:本文为博主原创文章,未经博主允许不得转载。 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 () {
}
}