본문 바로가기
유니티5 독학 & 게임 제작

유니티5 독학하기 그 77번째 걸음-이제서야 제대로 성공한 부스터의 구현

by 인터넷떠돌이 2018. 8. 26.
반응형

안녕하세요?


지난번 포스팅에서 부스터를 만들기는 만들었는데, 이게 원하는 타이밍-a키에서 손을 떼면 부스터가 적용되지 말아야 하는데 그게 안 되어서 이래저래 고생이었습니다. 이번 포스팅에서는 어떻게 해서 Speed를 나타내는 방법을 사용하였으며, 여기서는 그 속도표시를 보고서 제대로 부스터가 구현되었다는 것을 알 수 있었습니다.


일단 FixedUpdate()라는 것에 대해서 인터넷상에서 한번 찾아보도록 했습니다. 여기서는 Update()에 넣으면 제대로 rigidbody에 가해지는 힘이 제대로 적용되지 않을 수 있다는 것을 일단 알아보았습니다.



그리고 나서 유니티5에서 Edit>Project Settings>Time이라는 것으로 타임 매니저(Time Manager)를 불러올 수 있다고 하는데, 일단 여기서 문제가 있는 것이 아닌가 하는 생각이 들었습니다. 왜냐하면 저 시간동안 바뀐 runningSpeed가 적용되지 않았을 수도 있다고 생각해서 입니다.



그런데 유니티5상에서 실제로 열어보니, 시간의 간격이 상당히 짧은 0.02초라고 봐야 할듯 합니다. 이렇게 보면, 절대로 시간의 간격이 길어서 뭐가 안되는 것은 아니라는 것을 알 수 있었습니다.



그래서 아무리 생각해도 이 시간을 0.01초로 줄여도 아무런 변화가 일어나지 않아서, 이제는 스크립트에 문제가 있을 것이라는 생각이 들었습니다.



그래서 PlayerController.cs를 방문하도록 합니다.



일단 먼저 a키를 눌러서 부스터를 켜는 코드는 일단 주석처리를 하였습니다.



그리고 이번에는 FixedUpdate()에 이 코드를 복서해서 넣도록 합니다.




그래서 이게 제대로 적용되고 있는지, 현재 스피드를 알 수 있는 속도를 알 수 있는 내용을 만들고자 합니다.



InGameCanvas에서 Score를 복사해서 Speed라고 이름을 바꾸도록 합니다.



그리고 ViewInGame.cs라는 스크립트에 이제 코딩을 할 시간입니다.



여기서 이전에 없던 speedLabel이라는 변수를 만들고, 그 내용은 PlayerController.cs에 있는 runningSpeed의 값을 가지고 와서 ToString()으로 문자열로 변환하라는 코드를 추가했습니다.



이제 다시 Speed게임 오브젝트를 유니티5상에 있는 계층뷰에서 선택하도록 합니다.



그리고 기존의 score와 겹치는데, Y포지션을 아래로 내리도록 합니다.



이번에는 InGameCanvas를 계층뷰에서 선택하도록 합니다.




그리고 이 speedLabel을 드레그 앤 드롭으로 끌어다가 놓도록 합니다.



이제 게임뷰에서 SPEED가 나오는 것을 볼 수 있습니다. 일단 이게 제대로 작동하지 않는 것을 볼 수 있었습니다.



먼저 속도가 원래는 9이상은 나오면 안되는데, 부스터를 연타하다 보니 15까지 올라가는 것을 볼 수 있었습니다. 그래서 10이하일 때만, runningSpeed를 Vector2에 적용하라는 내용입니다. 원래 여기는 runningSpeed항목이 들어가야 하는데, 문제는 rigidbody.velocity.x가 runningSpeed보다 더 커지는 상황이 나와서 더 이상은 속도가 적용되지 않았던 것 입니다.



그리고 이번에는 어쩌다 보니 -3이라는 숫자가 나오는 상황이 벌어져서, 이를 방지하기 위한 작업을 추가로 해 보기로 했습니다. 하지만, 제 의도와는 다르게 뒷걸음질을 치는 현상까지 발생하는 것을 볼 수 있었습니다.



그래서 아예 rigidBody의 x축 속도가 마이너스가 되면, 강제로 3.0f가 되라고 하는 것입니다.



그리고 일단 boostSpeed는 기본적으로 0.0f;라고 첫 머리에 지정을 하도록 합니다.



그리고 a키를 누르면 순간적으로 boostSpeed가 6.0f가 되었다가 떼면 0이 되고, 다음으로 runningSpeed에 더하는 방식으로 코드를 수정했습니다.




이번에는 유니티5로 돌아와서, 계층뷰에서 Player게임 오브젝트를 선택하도록 합니다.



제 아무리 코드에서 바꾸어도 유니티5의 인스펙트 뷰에서 BoostSpeed를 0으로 다시 돌려 놓아서 스크립트에서 건드릴 수 있도록 합니다.



그리고 이제 게임뷰에서 제대로 속도가 표시되지 않는 문제가 발생했습니다. 아무래도 runningSpeed의 값은 고정되어 있다 보니, 하는 수 없이 public형식의 실수형 변수 currentSpeed라는 광역 변수를 선언하도록 합니다.



그리고 currentSpeed는 Update()메소드 안에서 항상 runningSpeed와 boostSpeed의 합계로 정의해 줍니다.



마지막으로 ViewInGame.cs 스크립트를 선택하도록 합니다.



이제 runningSpeed가 있던 자리에다가 currentSpeed라는 변수를 집어 넣어서 움직이도록 합니다.



이 부스터가 그간 구현이 제대로 되지 않았던 원인이 어디에 있었냐고 하면, 확실히 if(rigidBody.velocity.x<runningSpeed)에 문제가 있었습니다. 왜내하면 설정된 runningSpeed 9보다 실제로 플레이어 케릭터가 움직이는 속도가 15가 되어 버리는 말 그대로 폭주 기관차가 되어 버리는 것 이었습니다. 이걸 몰라서 30개의 이미지를 써 가면서 이러저러한 삽질을 하였지만, 그래도 일단 부스터가 미완이라지만 기본적인 골격은 완성이 되었습니다. 

반응형