public float comfortDistance = 1; //可接受距离 Vector2 DoSparate(PawnCheckTeammateController pawn, List <PawnCheckTeammateController> neighbors) { Vector2 force = new Vector2(0, 0); //遍历全部邻居 foreach (var n in neighbors) { //检测排除当前entity if ((n != null) && (n.Entity != pawn.Entity)) { //计算当前角色和邻居之间的距离 Vector2 toNeighbor = pawn.Entity.GetPosition() - n.Entity.GetPosition(); float length = toNeighbor.magnitude; //计算这个邻居引起的操控力(排斥力) 大小和距离成反比 force += toNeighbor.normalized / length; //如果二者之间距离大于可接受的范围,排斥力再乘以一个限制距离 if (length < comfortDistance) { force *= multiplierInsideDistance; } } } return(force); }
public void Separate(PawnCheckTeammateController pawn, List <PawnCheckTeammateController> neighbors) { Steering += DoSparate(pawn, neighbors); }