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);
foreach (Collider c in colliders)
{
if (c != null && c.gameObject != this.gameObject)
{
separationNeighbors.Add(c.gameObject);
}
}
获取到自身周围的鸟之后,每个鸟与自身的距离越小则分离力越大,方向就是又检测到的鸟指向本鸟
foreach (GameObject neighbor in separationNeighbors)
{
Vector3 dir = transform.position - neighbor.transform.position;
separationForce += dir.normalized / dir.magnitude;
}
if (separationNeighbors.Count > 0)
{
separationForce *= separationWeight;