Exemple #1
0
    // 매 프레임 실행.
    private void    chain_execute()
    {
        // 선두 블록.

        this.chain.velocity += this.chain.move_direction * 4.0f * Time.deltaTime;
        this.chain.omega    += 360.0f * Time.deltaTime;

        LeaveBlockControl trailer = this.blocks[0];

        trailer.transform.Translate(this.chain.velocity * Time.deltaTime);

        if (trailer.color == Block.COLOR.NECO)
        {
            trailer.setNecoRotation(this.chain.velocity);
        }
        else
        {
            trailer.getModelsRoot().transform.Rotate(Vector3.up, this.chain.omega * Time.deltaTime);
        }

        // 2회째 이후의 블록.
        // 이전 블록에 끌어당겨지듯 이동한다.

        float omega = this.chain.omega * 0.75f;

        float prev_velocity = this.chain.velocity.magnitude;

        for (int i = 1; i < this.blocks.Count; i++)
        {
            LeaveBlockControl prev = this.blocks[i - 1];
            LeaveBlockControl crnt = this.blocks[i];

            // 위치 이동.

            Vector3 distance_vector = crnt.transform.position - prev.transform.position;

            float distance_limit = 1.0f;
            float distance       = distance_vector.magnitude;

            if (distance > distance_limit)
            {
                float velocity = prev_velocity + (distance - distance_limit) * 0.1f;

                if (distance - velocity * Time.deltaTime < distance_limit)
                {
                    velocity = (distance - distance_limit) / Time.deltaTime;
                }

                distance -= velocity * Time.deltaTime;

                distance_vector.Normalize();
                distance_vector *= distance;

                crnt.transform.position = prev.transform.position + distance_vector;

                prev_velocity = velocity;
            }

            // 회전.
            if (trailer.color == Block.COLOR.NECO)
            {
                crnt.setNecoRotation(-distance_vector);
            }
            else
            {
                crnt.getModelsRoot().transform.Rotate(Vector3.up, omega * Time.deltaTime);
            }

            omega *= 0.75f;
        }
    }