개발일지

241016(수) [AddForce 함수]

게임 프로그래머 2024. 10. 16. 22:26

수준별 실습 과정에서 Addforce 함수를 사용하여 로켓을 쏘아 올리는 문제가 있었다.

그렇다면 Addforce 함수가 뭘까?

 

 

Addforce 함수에 마우스 커서를 갖다대면 이렇게 나온다.

 

언뜻보면 Rigidbody2D라는 강체에 물리적인 힘(Force)을 더해주는(Add) 함수인 것 같았다.

 

처음 코드 작성은 rb.AddForce(Vector2.up * SPEED)로 했다. (방향*스피드)

 

그러나 문제가 발생했다.

로켓이 올라가지 않았다. (정확히는 올라가지 않는 것처럼 보였다)

 

이유를 알기 위해 튜터님에게 질문했고

 

Addforce 함수, Vector2에 대해 학습이 필요할 것 같다고 조언해주셨다.


Addforce 함수에 대해 알아보기

Addforce 함수에 관 확인해 본 결과 Addforce는 처음 생각한 것처럼 

 

강체에 물리적인 힘(Force)을 더해줘서(Add) 오브젝트를 이동시키는 함수가 맞았고

필수 매개변수, 선택 매개변수가 있었다.

 

필수 매개변수(Vector2 force) 부분은 벡터의 방향과 크기로 힘을 주는 부분으로

 

여기서 힘을 주는 부분에는 Rigidbody의 다양한 요소도 영향을 끼칠 수 있다.

(무게, 저항, 중력 등...)

Rigidbody 2D


문제점 알아보기

로켓이 날라가지 않는 것처럼 보이니 원인이 무엇일까 생각해봤다.

 

질량이 기본값이므로 이것은 영향이 없다고 보여져서 스피드를 높히니까

(기본 5 → 500) 올라 갔는데

 

기본으로 선언된 변수(SPEED)에 5라는 값이 저장되어 있고 이것을 수정하라는 말도 없어서

 

다른 방법을 확인해봤다. 여러가지 영상과 블로그 글을 확인해본 결과

 

Vector2.up에 원인이 있었다.

 

Vector2.up에 마우스 커서를 올려보면 Vector2.up은 (0, 1)를 반환한다. 

 

여기에다 SPEED 값인 5를 곱했으니 (0, 5) 이런식으로 조금씩 올라가고 있었기에

 

올라가지만 올라가지 않는것처럼 보이는 것이었다.

 

값을 변경하지 않고 Addforce 함수만을 이용하여 올라가는 효과를 내기 위해서

 

선택 매개변수(ForceMode2D mode)의 종류에는

 

어떤 종류가 있는지 어떤것을 활용해야 하는지 알 필요가 있었다.

 

선택 매개변수(ForceMode2D mode)의 역할은

 

Unity 공식 문서에서 확인해 볼 수 있었다.

 

https://docs.unity3d.com/ScriptReference/ForceMode.html

 

Unity - Scripting API: ForceMode

The AddForce function impacts how your GameObject moves by allowing you to define your own force vector, as well as choosing how to apply this force to the GameObject (this GameObject must have a Rigidbody component attached). ForceMode allows you to choos

docs.unity3d.com

 

정리표

Force 강체의 질량을 사용하여 강체에 연속적인 힘을 추가합니다.
Acceleration 강체의 질량을 무시하고, 강체에 연속 가속도를 추가합니다.
Impulse 강체의 질량을 사용하여 강체에 즉각적인 힘 충격을 추가합니다.
VelocityChange 강체의 질량을 무시하고 강체에 즉각적인 속도 변화를 추가합니다.

 


처음 작성한 코드인 rb.AddForce(Vector2.up * SPEED)는 선택 매개변수가

생략된 형태로 생략하면 기본적으로 Force가 사용된다.

 

연속적으로 힘을 더해가는 방식으로 5씩 더한다면 5, 10, 15... 이런식으로 증가한다.

 

로켓을 쏘아 올리는 경우는 더해가는 게 아닌 짧은 순간에 힘을 주어야 하니 Impulse를 사용했다.

rb.AddForce(Vector2.up * SPEED,ForceMode2D.Impulse);

 

Impulse를 사용했더니 로켓이 잘 올라가는 모습이 확인됐다.

 


정리

1) Addforce(Vector2 force, ForceMode2d mode) 함수는

Rigidbody2D라는 강체에 물리적인 힘(Force)을 더해(Add) 오브젝트를 이동시키는 함수다.

2) Addforce 함수는 필수 매개변수(Vector2 force)와 선택 매개변수(ForceMode2d mode)가 있고

방향 * 힘의 값에 mode를 상황에 맞게 선택하여 사용할 수 있다.

 

모르는 코드가 있을 때 무턱대고 사용하기보다 블로그, 영상 또는 공식 문서를 통해

학습하여 사용하면 좀 더 실력 향상에 도움이 될 것 같다.