1. 개요 2. Transform, Rigidbody 방식 차이 3. Transform 방식으로 포물선 운동 구현
3.1 Tween 3.2 단순 함수 3.3 떨어지는 방향 보도록 하기
4. Rigidbody 방식으로 포물선 운동 구현
4.1 포물선 운동 물리 공식 이해 4.2 도착지점 알고 발사 각도 알 때 4.3 도착 시간 알고 각도 알 때 4.4 Rigidbody 방식의 한계 - 중력이 정해져 있다 4.5 중력가속도를 바꿔서 투사체마다 다른 발사 방식 적용하기 4.6 떨어지는 방향 보도록 하기
5. 결론과 요약
1. 개요
유니티로 게임을 만드는 사람이라면 한번쯤은 접해보고 포물선 운동 공식을 찾아보고 뭔개소리지 하며 절망했을만한 주제에 대해서 다뤄보도록 하겠다.
다양한 포물선 운동을 나타내는 방식과 코드에 대해서 작성해보았다. 나도 배워가는 단계라서 충분히 부족하지만 그나마 어느정도 이해는 한 상태로서 처음부터 배우고자 하는 사람에게 도움이 되고자 글을 써본다.
포물선 운동에 관한 포괄적인 내용정리를 목표로 글을 써봤다.
2. Transform, Rigidbody 방식 차이
그 전에 먼저 유니티의 물리 엔진을 사용한다는 것에 대해서 이해를 해야한다.
유니티에서 게임 오브젝트를 이동하는 방식은 크게 두 가지가 있다.
첫번째는 Transform을 기반으로 움직이는 방식
transform.poisiton=transform.poisiton + Vector3.one; 을 행하게 되면 오브젝트가 순간이동을 하게 된다. 이를 반복적으로 행하면 연속적으로 이동하는 것 처럼 보이는데 그 원리를 이용하여 오브젝트를 움직이는 것 이다. 이런 방식을 Transform 기반으로 움직인다고 칭한다.
두 번째는 Rigidbody를 이용해서 움직이는 것이다.
오늘의 주제인 유니티 엔진의 물리를 이용해서 움직인다고 생각하면 된다.
Rigidbody.addforce(Vector3.one); 을 행하게 되면 물체가 물리작용을 받아서 움직이게 된다.
두 방식은 작게 봤을때는 기호의 차이처럼 보이지만 상당한 차이를 가지고 있으며 여기서 어떠한 방식으로 접근하냐에 따라 추후에 문제가 발생할 수도 있고, 발생한 문제를 해결해나가는 양상은 전혀 다르게 전개된다.(즉 여기서 내가 어떤 방식을 써야하는지 잘 골라라 이말이야)
간단한 예를들어 아래 글은 유니티 트레일 작동 방식에 대한 글 인데 Transform 이동방식과 Rigidbody 이동방식 차이에 따라 트레일이 생성되냐 안되냐 차이가 생긴다.
Transform 방식으로 오브젝트를 움직이는 방식으로 이동하는 경우에 대해서 살펴보고 특징과 어떤 코드를 사용해야 포물선 움직임을 구현할 수 있는지 알아보자.
특징 1 : 유니티 물리엔진인 Rigidbody를 사용하지 않고 직접 움직이면 유니티 엔진의 한계없이 게임을 만들 수 있다.(여기서 말하는 한계란 유니티 물리 엔진을 활용하기 시작하면 복잡한 구현을 할 때마다 더욱 큰 난관에 부딪힌다는 말이다. 만약에 움직임을 addforce로 구현한다고 생각해보자, 이후 공기저항에 따른 이동속도 감소, 회전을 줘야할때 자체적인 스크립트가 아닌 유니티 Rigidbody 방식에서 해결하려면 미세한 컨트롤이 힘들어진다.)
특징 2 :이동 단위(속도)가 큰 경우 충돌 판정이 정상적으로 이뤄지지 않음, 일반적으로 생각하는 물리적 결과와는 다른 결과가 나올 수 있음,트리거 Enter 및 Collision 이벤트가 정상적으로 작동하지 않을 수 있음.
왼쪽과 오른쪽은 단순히 translate 해주는 크기의 차이(속도)로 인해서 발생하는 문제다.
둘다 텔레포트 하느 방식으로 이동하다보니 벽보다 이동속도가 빠른 경우 벽을 뚫고 지나가 버리는 경우가 허다하다.
이런 경우는 자체적으로 Collision 및 Enter를 판별하기 위하여 이동할때마다 물체간의 좌표에 대한 정보를 확인하여 해당 이벤트를 스스로 처리하는 시스템을 구현해야한다.
3.1 Tween
Transfom 이동방식중 한가지인 Tween 방식이다.
Tween을 모르는 분을 위해서 간단히 설명하자면 iTween, Dotween과 같은 라이브러리가 있는데 흔히 오브젝트를 부드럽게 이동하는 것을 구현하기 위해 IEnumerator를 위치를 이동해주는 것을 구현해주는데 그런 기능을 코드 한줄로 구현할 수 있도록 도와주는 유틸리티다.
그리고 Tween에는 보통 포물선 운동을 구현할 수 있는 함수가 내장되어있다.
Dotween의 경우 DOPath라는 함수를 사용하여 포물선 운동을 시각적으로 표현할 수 있다.
Error: Cannot find module 'ejs' Require stack: - C:\Users\user\Desktop\workspace\node_modules\express\lib\view.js - C:\Users\user\Desktop\workspace\node_modules\express\lib\application.js - C:\Users\user\Desktop\workspace\node_modules\express\lib\express.js - C:\Users\user\Desktop\workspace\node_modules\express\index.js - C:\Users\user\Desktop\workspace\ForkCraneServer\app.js at Function.Module._resolveFilename (internal/modules/cjs/loader.js:980:15) at Function.Module._load (internal/modules/cjs/loader.js:862:27) at Module.require (internal/modules/cjs/loader.js:1042:19) at require (internal/modules/cjs/helpers.js:77:18) at new View (C:\Users\user\Desktop\workspace\node_modules\express\lib\view.js:81:14) at Function.render (C:\Users\user\Desktop\workspace\node_modules\express\lib\application.js:570:12) at ServerResponse.render (C:\Users\user\Desktop\workspace\node_modules\express\lib\response.js:1012:7) at C:\Users\user\Desktop\workspace\ForkCraneServer\app.js:39:9 at Layer.handle [as handle_request] (C:\Users\user\Desktop\workspace\node_modules\express\lib\router\layer.js:95:5) at next (C:\Users\user\Desktop\workspace\node_modules\express\lib\router\route.js:137:13)