본문 바로가기

UNITY

UNITY_20231024[float와 int의 사용, 실전 프로젝트-기획] 게임 개발자가 C#에서 가장 많이 사용하는 숫자형 데이터 두개? 당연히 float와 int일 것이다. 이 두 데이터 형식의 가장 큰 차이는 무엇일까? 가장 먼저, float는 실수형 데이터이고, int는 정수형 데이터다. 즉 float는 int보다 더 많은 숫자 데이터를 표현할 수 있다. 10/23부터 8주간의 실전 프로젝트를 진행한다. 팀 내에서 "다함께 차차차for kakao", "드래곤 플라이트" 등을 레퍼런스로 한 2D 차량 주행 게임을 제작하기로 했다. 장르는 "종스크린 러닝 액션"이다. 사실은,, 개발에 주어진 기간에 비해 게임의 깊이나 복잡도가 너무 얕은 느낌이다. 내가 처음 제안한 개발 방향은 3D 쿼터뷰 게임에, 현실적 교통상황을 적용한 플레이 환경의 조성이었다. 아마 내가 제안한 방안은.. 더보기
UNITY_20231023[디자인 패턴-싱글톤] 싱글톤 패턴은 객체의 인스턴스를 오직 하나만 생성할 수 있도록 제약 환경을 만드는 패턴이다. 이 패턴을 사용함으로써 해당 객체는 다른 객체에서 전역적으로 접근할 수 있게 된다. 싱글톤 패턴을 MANAGER급 객체에 적용시키면 다른 오브젝트에서 이 MANAGER클래스의 요소를 쉽게 호출, 접근할 수 있다. 이때까지 진행한 프로젝트에 싱글톤 패턴을 적용하지 않은 경우는 한번도 없었을 정도로 아주 편리한 패턴이다. 처음에는 아래와 같이 싱글턴 패턴 코드를 작성했다. sing System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class GameManager .. 더보기
UNITY_20231020[Ray in UNITY3D] 또 슈팅 게임 얘기로 시작한다. 슈팅 게임을 하다 보면, 게임 내에서 총알이 발사되는 방식을 2가지로 구분할 수 있다. 하나는 직접 투사체 오브젝트를 날려서 이것과의 충돌 이벤트를 일으키는 PROJECTILE 방식. 다른 하나는 발사 지점으로부터 일정한 길이의 레이저(쉽게 표현했다)를 생성해 이 레이저가 특정 오브젝트와 충돌을 일으키게 하는 HITSCAN방식. 두 방법 모두 현재 슈팅게임에 활발히 적용되고 있는 방식이고, 각각의 쓰임새가 있다. 이 중 HITSCAN방식에 사용되는 RAY기능에 대해 알아본다. RAY, 광선, 즉 빛이다. 발사와 동시에 충돌반응을 일으킬 수 있다는 말이다. 유니티에서 RAY변수는 Ray 클래스에 의해 생성되고, 기본적으로 원점origin과 방향direction요소를 포함하고.. 더보기
UNITY_20231019[팀 과제, 오브젝트의 리깅] 팀 프로젝트에서 구현된 플레이어 오브젝트는 아래와 같은 모델링을 갖고 있다. 사실, 싱글 플레이 FPS에서 이런 오브젝트를 굳이 채택할 필요는 없다. 플레이어가 자신의 모습을 볼 경우가 아예 없기 때문이다.(게임 내에 거울같은 모습이 비치는 오브젝트가 없는 한) 이런 자세한 리깅이 돼있는 오브젝트(대표적으로 인간형)는 다양하고 역동적인 애니메이션을 추가할 수 있다는 점에서 UX를 대폭 향상시킨다는 장점을 갖고 있다. FPS에서 인간형 다관절 3D 오브젝트(인간형 오브젝트라고 부르겠다)의 이동은 어떻게 설정하면 좋을까? 회전은 어떻게 처리할까? 우선 오브젝트의 이동은 기존 방법과 거의 차이가 없다. WASD 누르면 그 방향대로 움직이면 된다. FPS니까 측방/후방 이동 시에 오브젝트가 회전하면 안된다. 게.. 더보기
UNITY_20231018[팀 과제, Object Pool] 팀 프로젝트 진행 중 일정한 수의 오브젝트를 지속적으로 생성, 소멸해야 하는 기능이 필요했다. 이럴 때 사용하는 로직이 Object Pooling이다. 총에서 발사하는 총알 오브젝트를 예로 든다. 대부분의 상황에서는 총에서 총알이 무한정으로 생성되야 한다. 그럼 어떻게 해야할까? 단순하다. 총구 위치에서 총알을 "생성"하고, 생성된 총알이 자신의 코드에 맞게 직진하다가 특정 물체와 충돌하거나 일정 진행 거리를 초과하면 파괴된다. 볼트액션 저격총, 단발 소총이라면,, 그냥 위 순서대로 만들거도 상관 없을 것이다. 하지만, 분당 3000발의 미니건이라면..? 하다못해 3시간 동안 저격총으로 2000발 소비하는 게임이라면..? 총알-오브젝트의 "생성"과 "파괴"는 유니티 런타임에서는 그냥 생겼다 사라지는 것 .. 더보기
UNITY_20231017[팀 과제, ProBuilders] 나사빠진 정신상태가 계속되는 가운데, 팀 과제의 담당 부분인 맵 작성 과정을 마쳤다. 기획서에서 제안된 LowPoly 오브젝트 에셋을 맵에 적용하려고 보니, 미리 고안한 맵 환경과 조화되지 않는 구조가 너무 많았기에, 재의논 후 해당 에셋 사용안은 폐기했다. 아래는 작성한 맵이다. 맵이 아니라 환경이라고 표현하는게 맞았다. ProBuilders 패키지 Unity에서도 자유로운 3D 모델링을 할 수 있는 ProBuilders 패키지가 마련돼 있다. Cube, Plane, Stair, Arch, PolyShape 등 다양한 3D 오브젝트를 작성, 수정할 수 있다. 만, ...만! 썩어도 준치라고 설계를 업으로 하기도 했고, 3D모델링 툴을 다뤄본 경험이 있는 나에게 Unity ProBuilder는 그 기능이.. 더보기
UNITY_20231013[팀 과제, Ray in UNITY3D] 팀 과제가 발제되고, 이번에는 FPS 슈팅 시뮬레이션을 제작하기로 결정했다. 내 아이디어가 통과됐다. 말 그대로 시뮬레이션으로, 적/전투와 같은 플레이어/NPC간의 연속적인 상호작용은 없다. 여러 지형지물 오브젝트와 과녁으로 구성된 공간 안에서 플레이어가 이동, 조준, 사격을 반복하며 과녁을 맞추는 게임이다. 이번에도 나는 맵 제작을 담당했다. 이전 과정에서는 특이한 알고리즘을 이용해 맵을 자동생성하는 기능을 구현했는데, 이번 프로젝트에서 만들 맵은 그런 알고리즘을 사용할 수 있는 배경이 아닌 듯하다. 따라서 이번 맵 생성 과정은 3D 오브젝트를 직접 생성하고, 플레이어의 이동/타 오브젝트와의 간섭/UX를 고려해 배치하는 과정이 될 것이다. 까놓고 말하자면 단순작업이다. 스크립트를 건드리는 일은 거의 없.. 더보기
UNITY_20231012[개인과제 완료] 오늘 부로 개인과제 작업을 제출까지 완료했다. 요 근래 공휴일이 연속으로 걸쳐서 덩달아 신나게 놀고 나서, 막상 다시 유니티를 잡으려니 의욕이 바닥을 쳤다. 강의도 산더미처럼 밀렸는데 사실 큰일이다. 이번 과제에서 건졌다고 할 만한 내용은 InputSystem의 InvokeUnityEvents, 미로 만들기 알고리즘이다. InputSystem-InvokeUnityEvents InputSystem의 Behavior 기본값은 SendMessages다. 이것을 InvokeUnityEvents로 변경하고, 지정된 InputAction의 입력 키를 누르면 그에 맞는 값을 InputAction.CallbackContext 클래스의 인자로 받아 바로 사용할 수 있다. 아래는 InputSystem의 상세와 이를 사용한.. 더보기