본문 바로가기
프로그래밍 이야기/GameDev

[게임이론] 힘과 가속도의 활용

by Mulder5 2021. 1. 14.
반응형

[게임이론]힘과 가속도에서 학습한 내용을 Unity에 적용해본다.

Unity에서 힘과 가속도 관련된 속성들은 다음과 같이 네가지 이다.

ForceMode.Force
ForceMode.Impulse
ForceMode.VelocityChange
ForceMode.Acceleration

위의 속성들의 특징은 크게 질량에 영향을 받는지 안받는지로 구분된다.
* 질량의 영향을 받는 속성 : Force, Impulse
* 질량과 무관하게 힘을 가하는 속성 : VelocityChange, Acceleration

그리고 Impulse, VelocityChange는 순간적인 힘을 가할 때 사용되며, Force와 Acceleration은 지속적으로 힘을 가할 때 사용된다.

아래의 코드는 이와 관련된 구현 예제이다.

public class ForceController : MonoBehaviour
{
    private Rigidbody boxRigidbody;
    private float movePower = 5f;
    void Start()
    {
        boxRigidbody = GetComponent<Rigidbody>();
    }
    private void FixedUpdate()
    {
        //Debug.Log(boxRigidbody2D.velocity);

        // impulse, force는 모두 질량에 영향을 받는다. F = m * a

        // impulse : 순간적인 힘을 가할 때
        // force : 지속적으로 힘을 가할 때
        if (Input.GetKeyDown(KeyCode.A))
        {
            // impulse는 1초동안 가해진 힘의 합.
            // FixedUpdate 0.02s 1초-50번   ::   [Edit] - [Project Seettings] - [FixedTimeStep]
            // 1초동안 힘을 50번 가해주는 것 ( Force * 50 )
            // Force / Fiexed TimeStep

            // 동일한 코드
            //boxRigidbody.AddForce(transform.right * movePower / Time.fixedDeltaTime, ForceMode.Force);
            boxRigidbody.AddForce(transform.right * movePower, ForceMode.Impulse);
        }

        else if (Input.GetKey(KeyCode.S))
            boxRigidbody.AddForce(transform.right * movePower, ForceMode.Force);

        // VelocityChange, Acceleration는 질량과 무관하게 힘을 가한다. 

        // VelocityChange : 순간적인 힘을 가할 때
        // Acceleration : 지속적으로 힘을 가할 때
        else if (Input.GetKeyDown(KeyCode.D))
        {
            // 동일한 코드
            //boxRigidbody.AddForce(transform.right * movePower * Time.fixedDeltaTime, ForceMode.Acceleration);
            boxRigidbody.AddForce(transform.right * movePower, ForceMode.VelocityChange);

            // 가속도가 쌓이면 속도의 변화
        }
        else if (Input.GetKey(KeyCode.F))
            boxRigidbody.AddForce(transform.right * movePower, ForceMode.Acceleration);
    }
}

 

반응형