닷지 게임을 따라 만들어 보면서 게임 개발에 대한 안목과 실력 높이기
[ 닷지 게임 ]
1.Player가 움직일때, 관성 없이 즉시 이동하는 법
이전에는 AddForce를 이용해서 점프를 시켰는데 이동하는 법도 마찬가지로 AddForce를 이용하면 되는 것 아닌가? 또한 if문이 4개로 연달아 있으니 코드도 간결해 보이지 않는다.
그치만 AddForce로 하면 관성으로 인해 플레이어 조작이 굉장히 이상해 진다.
왜냐? AddForce는 가해지는 속도를 누적해서 힘을 증진 시킨다.
그렇다보니 방향 전환을 할때 누적된 속도가 방향이 틀어졌을때 틀어진 방향으로 속도를 내기까지 시간이 걸리는 것.
void Start()
{
playerRigidbody = GetComponent<Rigidbody>();
}
void Update()
{
//수평축의 입력값 감지
float xInput = Input.GetAxis("Horizontal");
//수직축의 입력값 감지
float zInput = Input.GetAxis("Vertical");
float xSpeed = xInput * speed;
float zSpeed = zInput * speed;
Vector3 newVelocity = new Vector3(xSpeed, 0f, zSpeed);
playerRigidbody.velocity = newVelocity;
}
GetAxis?
해당 인자에 Horizontal 축이 들어간 경우
A(or 왼쪽 방향키) 를 누를시 -1.0을 반환하고 D(or 오른쪽 방향키) 를 누를시 1.0을 반환한다.
Vertical축이 들어간 경우
S를 누를시 -1.0, W를 누를시 1.0
두 축다 아무것도 안 눌렀을땐 0 반환
그러면 저 Horizontal,Vertical은 이미 정의 돼있는 건가?
그렇다. Unity에서 Input Manager에서 지원 해주는 것이니까 잘 찾아보면 정보가 잘 나와있다
이제 Vector3는 원소 x,y,z를 가지고 위치,크기,속도,방향을 나타낼때 사용하는데
새로운 Vector3속도를 해서 player의 velocity 즉, Rigidbody의 velocity에 대입한다.
이는 관성이 들어나지 않는 이유다.
이전 속도를 지우고 새로운 속도를 사용 하는 것이기 때문에, 관성을 무시하고 속도가 즉시 변경된다.
2.C#스크립트에서 컴포넌트 및 오브젝트의 트랜스폼 제어
앞서 본 것과 같이 C#스크립트 자체에서 유니티의 컴포넌트와 오브젝트에 접근이 가능하다.
void Start()
{
playerRigidbody = GetComponent<Rigidbody>();
}
이것은 Rigidbody의 컴포넌트를 가져오는 것이다.
해당 컴포넌트를 가져와서 수행할 작업을 하고, 게임 오브젝트에 스크립트를 추가 해주면 된다
유니티에선 또 게임 오브젝트의 트랜스폼 컴포넌트를 바로 가져 올 수 있다.
transform.내가 원하는 메서드; 가 가능 함
//게임 오브젝트의 앞쪽 방향을 알 수 있음
transform.forward;
3.같은 게임 오브젝트를 만들때, 관리의 용이를 위한 프리팹
말 그대로다.
같은 게임 오브젝트를 계속 CTRL + D를 해서 만드는 것이 아니라
프리팹을 만들어서 관리하는 것이 좋다.
하면서도 굉장히 유용하다고 느꼈다.
4.트리거 콜라이더가 무엇이고, 이에 대한 사용법
우선, 이것을 말하기 전에 충돌 이벤트 메서드에 대해 말 할 필요성이 있다.
유니티에서 콜라이더를 가진 게임 오브젝트 A와 B는 자기들이 충돌해도 서로 충돌 했는지 모른다.
게임 오브젝트는 스스로 알 수 없어도, 충돌 했음을 알려주는 메시지가 A와 B에 보내진다.
충돌 메세지를 통해, 게임 오브젝트와 해당 게임 오브젝트에 추가된 컴포넌트들은 충돌 사실을 알게 되는 것이고, 이에 대응하는 메서드를 실행 하는 원리다.
게임 오브젝트와 컴포넌트는 충돌 종류에 따라 OnTriggerEnter 혹은 OnCollisionEnter 메시지를 받는다.
OnCollision은 일반 충돌이고 OnTrigger은 트리거 충돌인데,
이때 트리거 충돌을 활성화 하면 게임 오브젝트끼리 서로 지나간다.
void OnTrigger메서드가 자동으로 실행 되는데 이때, 부딪힌 다른 게임 오브젝트가 other이라는
이름으로 정보가 들어온다.
그래서 여러가지 구현이 가능하다.
( 이번 닷지 게임에서는 플레이어가 탄환을 맞고 탄환은 지나가고 플레이어는 죽는 것 처럼 )
5.Time.deltaTime의 기능과 사용법
Time.deltaTime이는 현재 프레임이 만약 60이면 1/60을 반환하는 메서드다.
프레임이 그럼 모든 컴퓨터가 60인가?
애시당초 프레임은 뭔가
사양에 따라 다른것인데, 1초에 60번 Update() 메서드를 실행 한다는 것이다.
이 Time.deltaTime을 사용 하지 않는다면 어떻게 될까
컴퓨터마다 프레임이 다를텐데, Time.deltaTime을 사용하지않으면 컴퓨터 재각기마다 오류천지에 난리 나지 않을까?
해당 닷지 게임에서 정확하게 이를 알아 낼 수 있다.
예를 들어서, Rotate를 한다고 하자. 1초에 Level을 60도만 회전 시키고 싶다.
Update에 Rotate 60도를 해버리면 Frame이 60인 컴퓨터면 1초에 60도를 60번 적용하기때문에
1초에 3600도 돌아간다.
여기서 오류가 생기는 것인데,
이러한 점을 해결 하기 위한 직관적인 방법은 이거다.
Roate하는 방법 * Time.deltaTime
이러한 방법을 수많은 곳에서 사용 해야 할 듯 하다..
이외에도, 여러가지 메서드들이나 스킬들을 알게 됐다.
그치만, 마지막 Time.deltaTime의 Frame 부분관련 헷갈리는 것이 있다.
속력에도 그러면 영향이 갈텐데 근데 왜 속력은 코드를 Rotate 방법을 해결 한 것처럼 하지 않았을까??
영향이 그다지 없는 수준인건가?
아직 잘 모르겠다.
유니티도 깊고 심도있는 공부가 필요한 듯 한데, 이 책을 얼른 끝내고 전문적인 서적을 사서 읽어보고 서칭을 해보는 것이 좋을 것 같다.