示例#1
0
 public void AddCollisionEffectAgent(CollisionEffectAgent agent)
 {
     _collisionEffectAgents.Add(agent);
 }
示例#2
0
 public void RemoveCollisionEffectAgent(CollisionEffectAgent agent)
 {
     _collisionEffectAgents.Remove(agent);
 }
示例#3
0
        /* 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);
                    }
                }
            }
        }