private void InitializeKnockdownLoop()
    {
        string animName = Owner.AnimSet.GetKnockdowAnim(KnockdownState.Loop, Owner.BlackBoard.weaponSelected);

        CrossFade(animName, 0.05f);;
        EndOfStateTime = KnockdownEndTime;
        _status        = KnockdownStatus.LOOP;
    }
    void InitializeGetUp()
    {
        string animName = Agent.AnimSet.GetKnockdowAnim(KnockdownState.Up, Agent.BlackBoard.weaponSelected);

        Phenix.Unity.Utilities.Tools.PlayAnimation(Agent.AnimEngine, animName, 0.05f);
        _endOfStateTime = Time.timeSinceLevelLoad + Agent.AnimEngine[animName].length * 0.9f;
        _status         = KnockdownStatus.GET_UP;
        Agent.EnableCollisions();
    }
    void InitializeLying()
    {
        string animName = Agent.AnimSet.GetKnockdowAnim(KnockdownState.Loop, Agent.BlackBoard.weaponSelected);

        Phenix.Unity.Utilities.Tools.PlayAnimation(Agent.AnimEngine, animName, 0.05f);
        _endOfStateTime = _lyingEndTime;
        _status         = KnockdownStatus.LYING;
        Agent.DisableCollisions();
    }
    void InitializeDeath()
    {
        string animName = Agent.AnimSet.GetKnockdowAnim(KnockdownState.Fatality, Agent.BlackBoard.weaponSelected);

        Phenix.Unity.Utilities.Tools.PlayAnimation(Agent.AnimEngine, animName, 0.1f);
        _endOfStateTime             = Time.timeSinceLevelLoad + Agent.AnimEngine[animName].length * 0.9f;
        _status                     = KnockdownStatus.DEATH;
        Agent.BlackBoard.motionType = MotionType.DEATH;
    }
    private void InitializeKnockdownUp()
    {
        string animName = Owner.AnimSet.GetKnockdowAnim(KnockdownState.Up, Owner.BlackBoard.weaponSelected);

        CrossFade(animName, 0.05f);

        EndOfStateTime = Time.timeSinceLevelLoad + Owner.AnimEngine[animName].length * 0.9f;

        _status = KnockdownStatus.END;
    }
    private void InitializeDeath()
    {
        string animName = Owner.AnimSet.GetKnockdowAnim(KnockdownState.Fatality, Owner.BlackBoard.weaponSelected);

        CrossFade(animName, 0.1f);

        EndOfStateTime = Time.timeSinceLevelLoad + Owner.AnimEngine[animName].length * 0.9f;
        _status        = KnockdownStatus.DEATH;
        Owner.BlackBoard.motionType = MotionType.DEATH;
    }
    protected override void Initialize(AgentAction action)
    {
        base.Initialize(action);
        _agentAction = Owner.BlackBoard.curAction as AgentActionKnockdown;

        string animName = Owner.AnimSet.GetKnockdowAnim(KnockdownState.Down, Owner.BlackBoard.weaponSelected);

        StartRotation = Owner.Transform.rotation;
        StartPosition = Owner.Transform.position;

        Vector3 dir   = _agentAction.attacker.Position - Owner.Transform.position;
        float   angle = 0;

        if (dir.sqrMagnitude > 0.1f * 0.1f)
        {
            dir.Normalize();
            angle = Vector3.Angle(Owner.Transform.forward, dir);
        }
        else
        {
            dir = Owner.Transform.forward;
        }


        FinalRotation.SetLookRotation(dir);
        RotationTime  = angle / 500.0f;
        FinalPosition = StartPosition + _agentAction.impuls;
        MoveTime      = Owner.AnimEngine[animName].length * 0.4f;

        RotationOk = RotationTime == 0;
        PositionOK = MoveTime == 0;

        CurrentRotationTime = 0;
        CurrentMoveTime     = 0;

        CrossFade(animName, 0.05f);

        EndOfStateTime   = Time.timeSinceLevelLoad + Owner.AnimEngine[animName].length * 0.9f;
        KnockdownEndTime = EndOfStateTime + _agentAction.time;

        _status = KnockdownStatus.START;
    }
    protected override void Initialize(FSMEvent ev = null)
    {
        _eventKnockDown = ev as AnimFSMEventKnockDown;

        string animName = Agent.AnimSet.GetKnockdowAnim(KnockdownState.Down, Agent.BlackBoard.weaponSelected);

        _startRotation = Agent.Transform.rotation;
        _startPosition = Agent.Transform.position;
        Vector3 dir   = _eventKnockDown.attacker.Position - Agent.Transform.position;
        float   angle = 0;

        if (dir.sqrMagnitude > 0.1f * 0.1f)
        {
            dir.Normalize();
            angle = Vector3.Angle(Agent.Transform.forward, dir);
        }
        else
        {
            dir = Agent.Transform.forward;
        }

        _finalRotation.SetLookRotation(dir);
        _rotationTime  = angle / 500.0f;
        _finalPosition = _startPosition + _eventKnockDown.impuls;
        _moveTime      = Agent.AnimEngine[animName].length * 0.4f;

        _rotationOk      = (_rotationTime == 0);
        _positionOK      = (_moveTime == 0);
        _curRotationTime = 0;
        _curMoveTime     = 0;

        Phenix.Unity.Utilities.Tools.PlayAnimation(Agent.AnimEngine, animName, 0.05f);

        _endOfStateTime = Time.timeSinceLevelLoad + Agent.AnimEngine[animName].length * 0.9f;
        _lyingEndTime   = _endOfStateTime + _eventKnockDown.lyingTime;

        _status = KnockdownStatus.FALL_DOWN;
    }