[Unity]힘과 가속도의 관계와 AddForce를 활용한 게임 구현하기

728x90

Addforce를 활용한 게임 요소 구현하기

  • 충격력(Force) : 질량 * 거리 / 시간^2
  • 충격량(Impulse) : 질량 * 거리 / 시간

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ForceController : MonoBehaviour
{
    private Rigidbody boxRigidbody;
    private float movePower = 5f;
    void Start()
    {
        boxRigidbody = GetComponent<Rigidbody>();
    }
    private void FixedUpdate()
    {
        //Impulse는 1초동안 가해진 힘의 합
        //FixedUpdate의 경우 0.02초동안 스텝(1초동안 50번 업데이트)
        //1초 동안 힘을 50번 가함, Force * 50
        //Force / Fixed Timestep

        //Debug.Log(boxRigidbody2D.velocity);
        if (Input.GetKeyDown(KeyCode.A))
            boxRigidbody.AddForce(transform.right * movePower, ForceMode.Impulse);
            //boxRigidbody.AddForce(transform.right * movePower/Time.fixedDeltaTime.ForceMode.Force);와 같음
        else if (Input.GetKey(KeyCode.S))
            boxRigidbody.AddForce(transform.right * movePower, ForceMode.Force);
        //Impulse와 Force는 모두 질량에 영향을 받는다.  F = ma
        //Impulse 게임에서는 순간적인 힘을 가할 때
        //Force 게임에서는 지속적으로 힘을 가할 때
        else if (Input.GetKeyDown(KeyCode.D))
            boxRigidbody.AddForce(transform.right * movePower, ForceMode.VelocityChange);
            //boxRigidbody.AddForce(transform.right * movePower/Time.fixedDeltaTime.ForceMode.Acceleration);와 같음
        else if (Input.GetKey(KeyCode.F))
            boxRigidbody.AddForce(transform.right * movePower, ForceMode.Acceleration);
        //VelocityChange와 Acceleration은 질량과 무관하게 힘을 가한다.
        //VelocityChange 게임에서는 순간적인 힘을 가할 때
        //Acceleration 게임에서는 지속적으로 힘을 가할 때
    }
}

 

1번 상황

boxRigidbody.AddForce(transform.right * movePower, ForceMode.Impulse);
            //boxRigidbody.AddForce(transform.right * movePower/Time.fixedDeltaTime.ForceMode.Force)

 

2번 상황

boxRigidbody.AddForce(transform.right * movePower, ForceMode.Force);

 

3번 상황

boxRigidbody.AddForce(transform.right * movePower, ForceMode.VelocityChange);
            //boxRigidbody.AddForce(transform.right * movePower/Time.fixedDeltaTime.ForceMode.Acceleration);

 

4번 상황

boxRigidbody.AddForce(transform.right * movePower, ForceMode.Acceleration);

 

728x90