public Projectile SetChaser(float p_Duration, Vector3 p_ChaseTarget,
                                Action <CommomActionArgs, ProjectileAnimationEventArgs> p_InitAction = null, Action <CommomActionArgs, ProjectileAnimationEventArgs> p_ExpiredAction = null
                                , Func <float, float, float, float, float> p_LerpFunction            = null)
    {
        p_ExpiredAction += (customArgs, projectileAnimationEventArgs) =>
        {
            var proj = (Projectile)customArgs.MorphObject;
            var cnt  = projectileAnimationEventArgs.NumberToReadQueue;
            while (cnt > 0)
            {
                proj._moveActionSequenceValueSet.RemoveAt(0);
                cnt--;
            }
        };

        SetEnqueuePoint(p_ChaseTarget)
        .SetUpdateAction((customArgs, projectileAnimationEventArgs, lerpFunction) =>
        {
            var proj             = (Projectile)customArgs.MorphObject;
            var elapsed          = proj._currentMoveActionCumulativeTime - ElapsedTime;
            var reversedDuration = 1f / proj._currentMoveAction.AnimationDuration;

            if (p_LerpFunction == null)
            {
                return(K514MathManager.LinearLerp(proj.Transform.position, proj._moveActionSequenceValueSet[0],
                                                  elapsed, reversedDuration));
            }
            else
            {
                var p_From   = proj.Transform.position;
                var p_To     = proj._moveActionSequenceValueSet[0];
                var distance = p_To - p_From;
                return(new Vector3(
                           p_LerpFunction(p_From.x, distance.x, elapsed, reversedDuration),
                           p_LerpFunction(p_From.y, distance.y, elapsed, reversedDuration),
                           p_LerpFunction(p_From.z, distance.z, elapsed, reversedDuration)
                           ));
            }
        }
                         , p_Duration
                         , 1
                         , false
                         , p_InitAction
                         , p_ExpiredAction
                         , p_LerpFunction);

        return(this);
    }
    public Projectile SetChaser(float p_Duration, Transform p_ChaseTarget,
                                Action <CommomActionArgs, ProjectileAnimationEventArgs> p_InitAction = null, Action <CommomActionArgs, ProjectileAnimationEventArgs> p_ExpiredAction = null
                                , Func <float, float, float, float, float> p_LerpFunction            = null)
    {
        SetChaseTarget(p_ChaseTarget).
        SetUpdateAction((customArgs, projectileAnimationEventArgs, lerpFunction) =>
        {
            var proj             = (Projectile)customArgs.MorphObject;
            var elapsed          = proj._currentMoveActionCumulativeTime - ElapsedTime;
            var reversedDuration = 1f / proj._currentMoveAction.AnimationDuration;

            if (p_LerpFunction == null)
            {
                return(K514MathManager.LinearLerp(proj.Transform.position, proj._chasingTarget.position,
                                                  elapsed, reversedDuration));
            }
            else
            {
                var p_From   = proj.Transform.position;
                var p_To     = proj._chasingTarget.position;
                var distance = p_To - p_From;
                return(new Vector3(
                           p_LerpFunction(p_From.x, distance.x, elapsed, reversedDuration),
                           p_LerpFunction(p_From.y, distance.y, elapsed, reversedDuration),
                           p_LerpFunction(p_From.z, distance.z, elapsed, reversedDuration)
                           ));
            }
        }
                        , p_Duration
                        , 0
                        , false
                        , p_InitAction
                        , p_ExpiredAction
                        , p_LerpFunction);

        return(this);
    }