protected void execCharge(float deltaTime)
    {
        // 일정 거리를 이동했으면 돌격 종료.
        if ((transform.position - chargeStartPoisition).magnitude > CHARGE_DISTANCE)
        {
            finishedCharging();
            return;
        }

        // ---------------------------------------------------------------- //
        // 이동(위치 좌표 보간).

        Vector3 position        = this.getPosition();
        float   rotateAlpha     = 1.0f;                 // 어느 정도 강력하게 진로를 바꾸는가. 속도가 오르면 방향을 바꾸기 어려워진다.
        float   currentMaxSpeed = maxSpeed * getMaxSpeedModifier();

        velocity += acceleration * deltaTime;
        velocity  = Mathf.Clamp(velocity, 0.0f, maxSpeed * getMaxSpeedModifier());
        float speed_per_frame = velocity * Time.deltaTime;

        Vector3 move_vector = this.transform.forward;

        position += move_vector * speed_per_frame * velocity;

        position.y = floorY;

        this.cmdSetPosition(position);

        // 스피드가 나오지 않은 동안은 타깃 방향으로 향한다.
        rotateAlpha = 1.0f - velocity / currentMaxSpeed;
        updateDesiredDir(targetToCharge);
        exec_rotate(deltaTime, rotateAlpha);

        //  연출 처리.

        // 발 연기 처리.
        footSmokeRespawnTimer += deltaTime;
        if (footSmokeRespawnTimer >= chargeFootSmokeRespawnDuration)
        {
            footSmokeRespawnTimer = 0.0f;
            // 여기 랜덤은 연출용.
            createFootSmoke(transform.rotation * Quaternion.AngleAxis(Random.Range(-30.0f, 30.0f), Vector3.up) * Vector3.back * 5.0f);
        }

        // FIXME. 어쨌든 오라는 최고속이 되고 난 후에 나온다.
        if (chargeAura == null && Mathf.Abs(velocity - maxSpeed * getMaxSpeedModifier()) <= float.Epsilon)
        {
            // 오라 처리.
            chargeAura = EffectRoot.getInstance().createChargeAura();
            chargeAura.transform.parent        = transform;
            chargeAura.transform.localPosition = new Vector3(0.0f, 3.6f, 5.0f);
            chargeAura.transform.localRotation = Quaternion.identity;

            // 대신에 콧김은 이제 내뿜지 않는다.
            enableSpawnSnortEffects = false;
        }

        float speed_rate = velocity / currentMaxSpeed;

        foreach (var result in this.collision_results)
        {
            if (result.object1 == null)
            {
                continue;
            }

            GameObject other = result.object1;

            // 충돌한 플레이어에게 대미지를 준다.
            if (other.tag == "Player")
            {
                chrBehaviorPlayer player = chrBehaviorBase.getBehaviorFromGameObject <chrBehaviorPlayer>(other);

                if (player == null)
                {
                    continue;
                }
                if (this.tackled_players.Contains(player))
                {
                    continue;
                }
                if (speed_rate < 0.5f)
                {
                    continue;
                }

                if (player.isLocal())
                {
                    player.control.causeDamage(this.vital.getAttackPower(), -1);
                    player.beginBlowOutSide(this.getPosition(), 3.0f * this.getScale(), this.transform.forward);
                }

                this.tackled_players.Add(player);

                finishedCharging();
                break;
            }
        }
    }