/* CollisionMoveBasicAgent Impl 相关 */ /// <summary> /// TODO /// </summary> /// <param name="effectAgents"></param> /// <returns></returns> public void CalculateEffectedDestination(List <CollisionEffectAgent> effectAgents) { bool needReturnPositionFlag = false; if (effectAgents == null || effectAgents.Count == 0 || (!_canEffected) || (_flockStatus == FlockStatusEnum.STAR)) { needReturnPositionFlag = true; } else { // basic position Vector2 refPosition = GetCollisionRefPosition(); CollisionEffectAgent targetAgent = null; // target position Vector2 targetPosition = new Vector2(); float distance = 1000f; for (int i = 0; i < effectAgents.Count; i++) { var item = effectAgents[i]; if (!item.IsEffective()) { continue; } else { Vector2 itemPosition = item.GetRefPosition(); float newDistance = Vector2.Distance(refPosition, itemPosition); if (newDistance < distance) { distance = newDistance; targetAgent = item; targetPosition = itemPosition; } } } float effectDistance; float w, h; if (targetAgent != null) { w = targetAgent.GetWidth(); h = targetAgent.GetHeight(); effectDistance = targetAgent.GetEffectDistance(); } else { w = 0; h = 0; effectDistance = 0; } // 获取差值,差值越大,则表明两个物体距离越近,MAX(offsest) = effectDistance float offset = effectDistance - distance; // 进入影响范围 if (offset >= 0) { //effectAgentName = targetAgent.GetName(); TurnOnHasMovedOffsetFlag(); var moveBehavior = targetAgent.GetMoveBehavior(); //targetPosition = targetAgent.GetRefPosition(); /// 受影响浮块具体实现 /// if (moveBehavior == null) { Debug.Log("target agent name : " + targetAgent.GetName()); } Vector2 to = moveBehavior.CalculatePosition(refPosition, targetPosition, distance, effectDistance, w, h, _manager); var toLocalPosition = TransformScreenPositionToRectPosition(to); ; SetNextPosition(toLocalPosition); float sc = moveBehavior.CalculateScale(refPosition, targetPosition, distance, effectDistance, w, h, _manager); // 获取缓动方法 Func <float, float> defaultEasingFunction = EasingFunction.Get(_manager.flockBehaviorConfig.CommonEaseEnum); float k = defaultEasingFunction(offset / effectDistance); GetComponent <RectTransform>()?.DOScale(sc, Time.deltaTime); } else { needReturnPositionFlag = true; } } if (needReturnPositionFlag) { if (_hasMoveOffset) { TurnOffHasMovedOffsetFlag(); RecoverPosition(); GetComponent <RectTransform>()?.DOScale(1, Time.deltaTime); } else { if (_hasChangedFlag) { _hasChangedFlag = false; SetNextPosition(_nextChangedPosition); } } } }