public override void StartImpact(ImpactLogicInfo logicInfo)
        {
            GeneralStartImpact(logicInfo);
            SetGfxStateFlag(logicInfo.Target, Operate_Type.OT_AddBit, GfxCharacterState_Type.HitFly);
            float        crossFadeTime = UnityEngine.Mathf.Abs(logicInfo.Velocity.y / m_Gravity);
            HitFlyParams param         = GetHitFlyParams(logicInfo);

            param.ImpactState  = HitFlyState.Rising;
            param.OnGroundTime = logicInfo.ConfigData.OnGroundTime;
            if (logicInfo.ConfigData.FallDownTime > 0)
            {
                param.FallDownTime  = logicInfo.ConfigData.FallDownTime;
                param.FallDownSpeed = GetAnimationLenthByType(logicInfo.Target, Animation_Type.AT_FlyDownGround) / param.FallDownTime;
            }
            else
            {
                param.FallDownTime  = GetAnimationLenthByType(logicInfo.Target, Animation_Type.AT_FlyDownGround);
                param.FallDownSpeed = 1.0f;
            }
            if (logicInfo.ConfigData.GetUpTime > 0)
            {
                param.GetUpTime  = logicInfo.ConfigData.GetUpTime;
                param.GetUpSpeed = GetAnimationLenthByType(logicInfo.Target, Animation_Type.AT_GetUp1) / param.GetUpTime;
            }
            else
            {
                param.GetUpTime  = GetAnimationLenthByType(logicInfo.Target, Animation_Type.AT_GetUp1);
                param.GetUpSpeed = 1.0f;
            }
            if (crossFadeTime < m_MinCrossfadeTime)
            {
                crossFadeTime = m_MinCrossfadeTime;
            }
            CrossFadeAnimation(logicInfo.Target, Animation_Type.AT_FlyUp, crossFadeTime);
        }
        private HitFlyParams GetHitFlyParams(ImpactLogicInfo logicInfo)
        {
            HitFlyParams result = logicInfo.CustomDatas.GetData <HitFlyParams>();

            if (null == result)
            {
                result = new HitFlyParams();
                logicInfo.CustomDatas.AddData <HitFlyParams>(result);
            }
            return(result);
        }
        public override bool OnOtherImpact(int logicId, ImpactLogicInfo logicInfo, bool isSameImpact)
        {
            HitFlyParams param  = GetHitFlyParams(logicInfo);
            bool         result = false;

            switch (logicId)
            {
            case (int)GfxImpactLogicManager.GfxImpactLogicId.GfxImpactLogic_Default:
                break;

            case (int)GfxImpactLogicManager.GfxImpactLogicId.GfxImpactLogic_HitFly:
                if (HitFlyState.Falling == param.ImpactState || HitFlyState.Rising == param.ImpactState)
                {
                    PlayAnimation(logicInfo.Target, Animation_Type.AT_Hurt0, 1.0f, UnityEngine.AnimationBlendMode.Additive);
                }
                if (!isSameImpact)
                {
                    StopImpact(logicInfo);
                }
                else
                {
                }
                result = true;
                break;

            case (int)GfxImpactLogicManager.GfxImpactLogicId.GfxImpactLogic_KnockDown:
                break;

            case (int)GfxImpactLogicManager.GfxImpactLogicId.GfxImpactLogic_Stiffness:
                if (HitFlyState.StandUp == param.ImpactState)
                {
                    StopImpact(logicInfo);
                    result = true;
                }
                else if (HitFlyState.Falling == param.ImpactState || HitFlyState.Rising == param.ImpactState)
                {
                    PlayAnimation(logicInfo.Target, Animation_Type.AT_Hurt0, 1.0f, UnityEngine.AnimationBlendMode.Additive);
                }
                break;

            case (int)GfxImpactLogicManager.GfxImpactLogicId.GfxImpactLogic_Grab:
                StopImpact(logicInfo);
                result = true;
                break;
            }
            return(result);
        }
 protected override void UpdateMovement(ImpactLogicInfo info, float deltaTime)
 {
     // update virtical
     if (null != info.ConfigData && null != info.Target)
     {
         HitFlyParams param         = GetHitFlyParams(info);
         float        virticalSpeed = info.Velocity.y;
         info.Velocity = info.MoveDir * info.MovementInfo.GetSpeedByTime(Time.time - info.StartTime, -30);
         UnityEngine.Vector3 motion = UnityEngine.Vector3.zero;
         if (HitFlyState.Rising == param.ImpactState || HitFlyState.Falling == param.ImpactState)
         {
             info.Velocity = new UnityEngine.Vector3(info.Velocity.x, info.Velocity.y, info.Velocity.z);
         }
         else
         {
             info.Velocity = new UnityEngine.Vector3(info.Velocity.x, 0.0f, info.Velocity.z);
         }
         motion          = info.Velocity * deltaTime;
         info.NormalPos += motion;
         motion          = GfxImpactSystem.Instance.GetAdjustPoint(info.NormalPos - info.OrignalPos, info) + info.OrignalPos - info.Target.transform.position;
         Move(info.Target, motion);
         LogicSystem.NotifyGfxUpdatePosition(info.Target, info.Target.transform.position.x, info.Target.transform.position.y, info.Target.transform.position.z, 0, info.Target.transform.rotation.eulerAngles.y * UnityEngine.Mathf.PI / 180f, 0);
     }
 }
        public override void Tick(ImpactLogicInfo logicInfo)
        {
            try
            {
                Profiler.BeginSample("GfxImpactLogic_HitFly.Tick");
                UpdateMovement(logicInfo, Time.deltaTime);
                UpdateEffect(logicInfo);
                GameObject   target = logicInfo.Target;
                HitFlyParams param  = GetHitFlyParams(logicInfo);
                switch (param.ImpactState)
                {
                case HitFlyState.Rising:
                    if (logicInfo.Velocity.y <= 0)
                    {
                        param.ImpactState = HitFlyState.Falling;
                        float crossFadeTime = UnityEngine.Mathf.Abs((target.transform.position.y - GetTerrainHeight(target.transform.position)) / m_Gravity);
                        if (crossFadeTime < m_MinCrossfadeTime)
                        {
                            crossFadeTime = m_MinCrossfadeTime;
                        }
                        CrossFadeAnimation(logicInfo.Target, Animation_Type.AT_FlyDown, crossFadeTime);
                    }
                    break;

                case HitFlyState.Falling:
                    CharacterController cc = target.GetComponent <CharacterController>();
                    if (cc.isGrounded)
                    {
                        // 落地尘土
                        logicInfo.Target.SendMessage("OnHitGround", UnityEngine.SendMessageOptions.DontRequireReceiver);
                        param.ImpactState   = HitFlyState.OnGround;
                        param.HitGroundTime = Time.time;
                        PlayAnimation(target, Animation_Type.AT_FlyDownGround, param.FallDownSpeed);
                        SetGfxStateFlag(logicInfo.Target, Operate_Type.OT_RemoveBit, GfxCharacterState_Type.HitFly);
                        SetGfxStateFlag(logicInfo.Target, Operate_Type.OT_AddBit, GfxCharacterState_Type.KnockDown);
                    }
                    break;

                case HitFlyState.OnGround:
                    if (IsLogicDead(target))
                    {
                        SetGfxDead(target, true);
                        StopImpact(logicInfo);
                        CrossFadeAnimation(target, Animation_Type.AT_OnGround);
                    }
                    if (Time.time > param.HitGroundTime + param.FallDownTime + logicInfo.ConfigData.OnGroundTime)
                    {
                        // 倒地时间
                        PlayAnimation(target, Animation_Type.AT_GetUp1, param.GetUpSpeed);
                        param.ImpactState = HitFlyState.StandUp;
                        SetGfxStateFlag(logicInfo.Target, Operate_Type.OT_RemoveBit, GfxCharacterState_Type.KnockDown);
                        SetGfxStateFlag(logicInfo.Target, Operate_Type.OT_AddBit, GfxCharacterState_Type.GetUp);
                    }
                    break;

                case HitFlyState.StandUp:
                    if (Time.time > param.HitGroundTime + param.FallDownTime + logicInfo.ConfigData.OnGroundTime + param.GetUpTime)
                    {
                        SetGfxStateFlag(logicInfo.Target, Operate_Type.OT_RemoveBit, GfxCharacterState_Type.GetUp);
                        StopImpact(logicInfo);
                    }
                    break;
                }
            }
            finally
            {
                Profiler.EndSample();
            }
        }