나의 첫 게임

정혜창·2024년 12월 20일
1

내일배움캠프

목록 보기
9/43
post-thumbnail

오늘은 첫날부터 오늘까지 5일간 배운 경험을 바탕으로 드디어 인생 첫게임을 만들었다! 정말 꿈만 꾸던 순간부터 오늘 만들게되기까지.. 비록 여전히 배움은 적어 초라한 게임이지만 고생했던 노력의 '첫 결실'이였기 때문에 만족한다. 일단 오늘도 정말 많이 배웠기 때문에 정리한 뒤 만들었던 게임의 제출자료를 올려야겠다.


우선 오늘은 액터의 회전, 트리거볼륨을 통한 액터 visiblility, 그리고 플레이어를 변수로 승격시켜서 캐릭터 무브먼트를 이용한 빙판장판 만들기, 액터의 collision, 충돌시 튕겨나가는걸 하기위한 Lanch character 등을 하였다. 이렇게 보니 정말 많을 것을 배웠구나 싶다.



액터의 회전

우선 액터의 회전을 위한 블루프린트부터 살펴보자.

우선 위치설정은 Target은 원하는 액터로 값을 설정하고 Get Actor Location에서 백터로 갈때 우리는 이 Power Car를 350만큼 띄어서 빙빙돌게 할 생각이므로 플루트 변수 Radius를 설정하고 Radius에 350.0 값을 주었다. 또한 실제로 z축의 이동은 없고 차를

이런식으로 배치를 하였으므로 x쪽에만 반지름 길이만큼 값을 더해준 뒤 백터의 값으로 주었다.(만약 모두 0,0,0 으로 설정하면 제자리에서 빙빙돔) 이제 중심점에서 일정거리 벌리고 빙빙 돌 수 있도록 설정했으니 속도를 줘야한다.

Event Tick 같은경우 프레임마다 이벤트를 발생하는 노드로 안의 'Delta Second' 같은 경우 프레임 사이마다의 시간이라고 생각하면 된다. 속도는 시간 * 거리 이므로리 이므로 Event Tick과 내가 원하는 속력(150.0)을 곱하게 해주었다. 그리고 Power Car은 회전에서 Yaw방향으로 운동하므로 Delta Rotation Z값으로 값을 넣어주었다. (아래사진은 적용한뒤 차가 계속 돌고 있는 모습




트러거볼륨을 이용한 액터 Visibility

셔터에 가까이가면 셔터가 자동으로 열리는 것을 하기위해 셔터 앞에 트리거 볼륨을 설치해준다. 설치해주고 이제 작동시키기위해 블루프린트에서 로직을 그려보았다.

우선 레벨 블루프린트에서 작성을 해주었는데 캐릭터가 중첩되었을 때 작동이 시작되어야 하므로
On Actor Begin Overlap (TriggerVolume) 노드를 불러왔다. 그리고 실제로 없어져야하는 것은 '문'이라는 스태틱매쉬 이므로 해당 매쉬인 'RollDoor01_A'를 불러와서 보여주는것과 관련된 함수인 'Set Visibility'와 사라지고나면 충돌을 하지 않아야하므로 충돌관련 함수인 'Set Collistion Enabled'의 타겟을 RollDoor01_A'로 설정한다. 이제 적용된걸 실행해보면

이렇게 문이 사라진 것을 알 수 있다. 다음은 여기서 응용해서 캐릭터가 트리거 볼륨에서 나왔을때, 문이 생성되게 해보았다.

문 사라지는 노드와 동일 하지만 함수 안의 값이 다른걸 볼 수 있다. 아래 사진은 문이 다시 생성된 모습.




캐릭터 무브먼트를 이용한 빙판장판

우리가 게임을 하다보면 캐릭터가 미끌리는 경우가 종종 있다. 분명 마찰과 제동이 관련되어 있을텐데... 하고 막연히 생각만 해보았지 어떤식으로 구현되는지 알 수가 없었다. 하지만 운이 좋게도 나는 이번기회를 통해 어떤식으로 구현되는지 알 수 있었다.

우선 블루프린트 액터를 생성하고 적당한 스태틱매쉬를 불러왔다. 이제 빙판장판을 위해서는 콜리전기능이 필요한데, 'Box' 명명되어있고 스태틱매쉬를 감싼 직육면체 큐브같은 것이 콜리전박스이다. 이제 이렇게 설정한 후 진짜 미끄러지게 설정하기 위해 블루프린트로 가서 로직을 그렸다.

우선 박스에 다가가서 캐릭터와 중첩이 되면 이벤트를 발생시키는 'On Component Begin Overlap (Box)노드를 불러왔다. 여기서 중요한데, 이제 플레이어 캐릭만 미끄러지게 하기위해 "박스외의 액터 'Other Actor'와 플레이어 캐릭인 'BP NBC Character'과 같으면" 이라는 조건을 만들어 준다. 하지만 잠깐, 원래는 플레이어의 값을 통상적으로 변수로 설정할 수가 없지만 우리는 변수로 값을 가져와야 하므로 사전에 변수로 승격시켜주는 과정이 필요하다.

플레이어 (player 0)가 변수로 "Set As BP NBC Character로 설정되었다.
이제 다시 앞의 그림으로 돌아가서 조건이 만약 같으면 마찰이 0이 되고 걷기제동은 100정로 낮춘 값이 실행 되도록 로직을 설정한다. 마찰과 걷기제동의 두기능 모두 타깃은 BP NBC Character의 Character Movement컴포넌트 이다. 저렇게 설정하면 캐릭터가 해당 바닥으로 이동하면 매우 잘 미끌린다. 이제 바닥에서 나가면 다시 마찰과 제동이 정상적으로 돌아오도록 로직을 설정해준다.






Lanch character

충돌했을 때 튕겨져 나가는 것을 구현하기 위한 로직은 생각보다 간단하였다. 위 사진은 아까 만들었던 Rotate Car과 부딪혔을 때 튕겨나가게 하기 위한 로직이다. 값을 - 로 음수로 설정한 이유는 충돌하면 해당 오브젝트와 반대 방향으로 튕기기 때문에 음수로 설정해주었다. 솔직히 Hit Normal과 설정한 변수가 곱해졌을 때, 튕겨져 나오는 값으로 나오는 건지는 정확한 식은 수학적으로 잘 알지는 못하지만 우선 개념을 돕기위해서 아래의 사진을 보면 Hit Normal은 충돌면의 수직방향이라는 것을 알 수 있다.

사진 출처 : https://stackoverflow.com/questions/61703527/unity3d-what-is-linecast-hit-normal

이렇게 곱한 값은 그대로 Lanch Character (캐릭터발사?)함수에 들어간다. 타겟은 플레이어이다.




액터의 이동

이 부분은 괜찮은 게임을 구현하기 위해서 공부한 내용이다. 점프게임에서는 적정한 난이도를 위해서는 움직이는 발판이 거의 필수이다. 따라서 액터의 이동에 관해 인터넷을 서칭하게 되었고 공부하였다. 참고한 곳은 유튜브 영상이다.

참고영상 : https://www.youtube.com/watch?v=APYmODALghQ&list=PLZyXxrcKUJC9HBOuwhD8cOao0nOYxReKo&index=6

이 영상을 토대로 구현한 블루프린트이다.

먼저 시작 위치값을 Get Actor Location을 통해 변수 Set Start Location에 값을 준다. 이제 다음으로는 왔다갔다 하는 이동을 구현하기 위해 타임라인 노드를 추가하고 루프설정을 해준 것이다.

타임라인을 설정한 모습이다. 여기서 나온 값들이 마지막 New Location 값에 변화를 주므로 시간에 따라 값을 준 모습을 그래프로 그렸다. 이 값들은 최종위치를 구하기 위한 시간에 따라 변화하는 계수라고 생각하면 된다. 이제 New Location을 구해보자. 먼저 계수에 원하는 거리값을 곱해주어 거리를 설정해주고, 애로우 컴포는트로 설정한 방향의 백터값을 곱해주어서 액터의 방향을 마찬가지로 설정해준다. 이제 총 이동한거리와, 방향은 아니깐 처음위치를 더해주면 최종위치의 값을 알 수 있다. New Location에 연결해주면 끝.

설정완료한 액터를 배치한 모습이다. 애로우 방향을 다르게 하게하면 방향이 바뀌고 변수 Move Distace를 바꾸면 이동거리가 조정이 된다. 급격한 이동이나, 다른느낌을 주는 이동을 표현하려면 타임라인의 그래프를 조정해주면 된다.




Spawn Actor

마지막으로 Spawn Actor를 알아보았다. 이것은 대포에서 나가는 총알을 구현하기위해 내가 배운것으로 마찬가지로 유튜브영상을 통해 배우게 되었다.

참고 영상 : https://www.youtube.com/watch?v=K7MDHT5Qzgk&list=LL&index=5&t=45s

하나의 액터에서 다른액터가 나오는 것이기 때문에 Spawn Actor 함수를 쓴다. 우선 Fire 함수를 정의 해준다.

해당 블루프린트는 대포의 이벤트 그래프이다. (총알의 이벤트 그래프 X) 사출하는 방향은 애로우 컴포넌트를 활용해서 값을 주고 클래스 설정은 스폰을 하고싶은 총알로 설정해준다.

반복해서 대포를 쏘는걸 원하므로 Event Tick을 활용 하였고 2초마다 쏘기위해서 Delay 함수를 주었다. 이렇게 하지 않고 레벨 블루포인트를 안쓰고 대포의 이벤트의 그래프에 그냥 모든결 해결하게끔 로직을 짜보았다.

이렇게 설정해도 작동이 잘 된다. 이제 대포에서 총알이 스폰되는 것은 설정했으므로 총알 액터의 설정을 통해 속도, 중력, 콜리전등을 설정해 주어야 한다.

우선 앞서 말한 설정을 하기 위해 '발사체 무스먼트' 컴포넌트를 추가해준다



발사체 총알의 설정을 해준 사진들이다. 발사체가 수직으로 쭈욱 나아가도록 중력을 0, 스폰된 뒤 일정시간 뒤에 사라지도록 수명을 지정해주었는데 액터 root 클래스에서 설정이 가능하다.




내가 만든 첫 번째 게임

아직 배운게 많지는 않지만 나름의 노력을 하여 나의 첫 작품을 만들어 보았다. 부끄럽지만 오늘의 감격을 잊지 않기위해 영상을 남겼고 유튜브에 올려보았다. (절대 과제를 위해서가 아님!!ㅋㅋ) 밑의 사진은 레벨디자인을 공책에 그린 것이고 아래 영상링크는 그것을 구현한 것을 업로드한 나의 유튜브 주소이다.

https://www.youtube.com/watch?v=IhNaZ6jFpsU

회고

게임을 만들어 본 첫 소감은 '어려웠다.' 게임에서 캐릭터의 동작하나하나가 이렇게 손이 많이 가는 작업인지도 몰랐고, 원했던 기능이 구현이 안될 때마다 왜이렇게 컴퓨터는 멍청한가 (내가 멍청한 것이다) 원망할 때도 있었다. 에셋을 배치하는 것은 매우 고된 작업이였고, 공부하지 않은 기능을 직접 공부하여 구현한다는 것은 쉬운 일이 아니였다. 그러나 확실하게 알았다. 난 게임을 만드는 것을 매우 좋아한다는 것. 심지어 새벽 4시까지 공부를 하는데도 얼른 구현해보고 싶은 마음에 피곤함 보다는 행복했었다. 그리고 첫 작품이 완성되었을 땐, 짜릿했다.

기쁜 나머지 오늘 발표회에서 200명 가량의 동기앞에서 내가 완성한 게임을 자랑도 해보았다. 어마어마한 고수 동기들이 많이 존재하고, 많은 노력을 쏟아부은 것은 동기들도 마찬가지 였기때문에 내 작품이 그리 특출나게 보이진 않고 평범해 보이긴했지만 내 안에서는 앞으로의 모티베이션과 자산이 될 소중한 존재이다. 오늘의 이 감정을 잊지 않도록 좋은 개발자가 되도록 다시 다짐해본다.

profile
Unreal 1기

0개의 댓글

관련 채용 정보