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

유니티5 독학하기 그 74번째 걸음-랜덤한 위치에 나오는 동전만들기

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

안녕하세요?


이제는 만들고 있는 미완성의 연습게임에 새로운 기능을 추가하는 작업을 해야 하는데, 이번 포스팅에서는 될 수 있으면 유저가 예상하지 못한 위치에서 동전이 나타나도록 만들고자 합니다. 그런데 작업이 어느정도 되기는 되었는데, 3가지 후속과제가 발생하였습니다.



먼저 LevelGenerator.cs를 가지고서 한번 작업을 해보고자 하기 위해서 코딩하러 가 봅니다.



처음에는 위 스크린샷에 있는 AddPiece()메소드를 응용해서 어떻게 하고자 한번 시도를 해 보았습니다.



그래서 일단 유니티5의 계층뷰에서 LevelPieceBasic에서 Coin을 모두 지우도록 하고, 다음으로는 따로 Coin이라는 게임 오브젝트를 만들어 주도록 합니다.



그리고 나서 이번에는 CoinClone이라는 C# 스크립트를 생성하도록 합니다.



그리고 나서 이번에는 LevelPiece.cs의 흉내를 내도록 해 보겠습니다.



그리고 이제 방금전에 생성을 하였는 Coin이라는 게임 오브젝트를 선택하도록 합니다.



그런데 여기서 부터 한가지 예기치 못한 에러가 발생하는 것을 볼 수 있었습니다. 우선 이미 스크립트가 붙어 있었기 때문에, 또 다른 스크립트가 들어갈 자리가 없는 것이였습니다.




먼저 위 스크린샷처럼 LevelGenerator.cs에 배열을 다음과 같이 선언을 해 주었습니다.



그리고 나서 어떻게 할 수 있는 것이 없는지 살펴 보니까, 지금까지 했는 것이 잘못된 것을 알 수 있었습니다. 즉, 이렇게 일일히 동전을 나오게 하려면, 이게 그냥은 안되고, 크게 전체의 일정 패턴중에서 선택하게 하는 유형이었습니다. 즉 제 생각대로 움직이지 않아서, 하는 수 없이 다시 작업을 처음부터 시작해야 했습니다.



그래서 하는 수 없이 이전에 지웠던 Coin을 다시 Floor블록의 자식 오브젝트로 추가해야 했습니다.



그래서 찾아보니까 게임 오브젝트의 좌표를 바꿀 수 있는 코드가 있다는 것을 알았고, 한번 작업을 해 보고자 합니다. 이번에는 X축의 좌표를 어떻게 할 수는 없으니, 하는 수 없이 Y축의 좌표를 랜덤으로 만들어 보자고 하는 것 입니다.



그리고 나서 위 스크린샷처럼 Collectable.cs에서 코딩을 하였는데, 무언가 잘못되어 간다는 것을 알 수 있었습니다.



일단 그래도 Collectable.cs를 조작하러 갑니다.



다음의 시도는 Vector3형식의 변수와 Transform형식의 변수를 선언해 주도록 합니다. 그리고 나서 아랫쪽 박스의 내용처럼 랜덤한 Y좌표의 값이 될 float형식의 변수를 생성하도록 하고, 다음으로는  Vector3형식의 변수.set(3차원 좌표);의 형식으로 Vector3형식의 변수에 들어가 있는 좌표값을 바꾸도록 합니다.



다음은 실험을 위해서 우선 Coin하나를 선택하도록 해 봅니다.




그리고 보면, 이전에는 없던 항목이 생긴것을 볼 수 있습니다.



여기다가 Coin의 게임 오브젝트를 드레그 앤 드롭으로 붙여 주도록 합니다.



하지만 여전히 CoinPosition이라는 좌표는 여전히 (0,0,0) 이라고만 되어 있습니다.



그리고 유니티5에서 Play버튼을 눌러서 Coin에서 동전이 생성되면, 한번 클릭해 보았습니다.



일단 Play버튼을 누르고 나서는 CoinPosition은 그대로 나오는 것을 볼 수 있는데.....



이 에러메세지가 무슨 뜻이냐 했더니, CoinPrefabs에 집어넣은 게임 오브젝트가 없어서 생기는 것이였습니다. 그런데 이 시점에서 아직 저는 그걸 몰라서 이제 삽질을 하기 시작합니다.



그래서 하는 수 없이 Transfrom형식으로 되어 있는 coinPrefabs를 GameObject형식으로 바꾸도록 합니다.



다음으로는 CoinPosition()이라는 메소드를 따로 만들어 주도록 하고, 시작할 때 CoinPosition()을 실행하도록 했습니다. 여기서 게임 오브젝트에 직접 Vector3의 좌표를 입력할 수는 없으니, 하는 수 없이 이런 형식을 사용 했습니다.


게임오브젝트.transform.position = Vector3형식의 변수;


이런식의 코드가 사용이 되었습니다.




일단 이번에는 무언가 랜덤으로 나오는 것 같기는 한 것 같기는 하지만, 이번에는 너무 동전이 높이 있다는 문제가 발생했습니다.



그래서 하는 수 없이 LevelPieceBasic에서 동전의 Y축 좌표를 아래로 내리도록 합니다.



그래도 여전히 이렇게 높이 떠 있는 것을 볼 수 있었습니다.



일단 유니티5의 Play가 켜진 상태에서 위 스크린샷처럼 Transform은 생성이 되는 것을 볼 수 있으며



Collectable.cs는 위 스크린샷과 같이 나온다는 것을 알 수 있었습니다.



결국 하는 수 없이 Random.Range의 범위값을 줄이도록 해 보았습니다.



일단 LevelPieceBasic만을 나오도록 조정을 해서, 동전을 생성하였는데 Y축-높이가 제멋대로가 되는 것을 볼 수 있습니다. 하지만, 여전히 문제가 있으니........



이렇게 높이를 극단적으로 낮추어도 여전히 닿지 않는 높이의 동전이 나온다는 것 입니다. 이를 어떻게 해결해야 할지 모르겠는데, 이러니 저러니 해도 이번 작업으로 3가지 추가적인 해결해야 할 과제가 나왔습니다.

1번, 처음 타이틀 화면에서 이상하게 많은 동전이 생성이 된다.

2번, 어찌된 셈인지 동전이 생성되는 Y축의 높이를 제대로 컨트롤 할 수 없다.

3번, 이미 생성된 동전이 사라지지 않고 남아서 메모리를 계속 잡아먹을 우려가 있다.

반응형