protected override void OnStart() { base.OnStart(); if (FollowTarget != null) { followTargetController = FollowTarget.GetComponent <SceneObjController>(); } m_CheckAroundController = GetComponent <CheckAroundEntityController>(); if (m_CheckAroundController == null) { m_CheckAroundController = gameObject.AddComponent <CheckAroundEntityController>(); } m_MoveSpeed_Max = 0.1f; m_ForceSteer_Max = 1f; m_StopRadius = 0.5f; m_SlowingRadius = 1f; m_CurrentVelocity = Vector2.zero; m_TempMass = 1; m_Steering = new SteeringManager(this); m_PathfindingRequested = false; InitAnimComponent(); }
public void Separate(CheckAroundEntityController pawn, List <CheckAroundEntityController> neighbors) { if (pawn == null || neighbors.Count <= 0) { return; } Steering += DoSparate(pawn, neighbors); }
public float comfortDistance = 1; //可接受距离 Vector2 DoSparate(CheckAroundEntityController pawn, List <CheckAroundEntityController> 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); }