뭐 작은 프로젝트 할 일이 있어서 사람 모이고 게임 뭐만들지 정하고 했는데

엔진 정할때 내가 언리얼 써보고 싶다고 밀어붙였음

그래서 개발 엔진으로 언리얼 결정


처음에는 아는게 없어서 그냥 유니티식으로 주먹구구 만들려고 했는데

이게 뭔가 유니티랑은 완전히 다른 차원의 엔진이었음

더 좋고 나쁘다 그런 말이 아니라 설계 사상 자체가 다름


예를 들어서 유니티에서는 게임오브젝트라는 객체에 우리가 만든 스크립트를 컴포넌트를 붙일 수 있고

게임오브젝트간의 트랜스폼 계층구조를 활용하기 쉽고, 프리팹이 있어서 객체의 재사용도 쉬운데


언리얼에서는 액터라는 객체에 스크립트를 컴포넌트로 붙일 수 있는건 유니티랑 같은데

내가 원하는 액터를 커스텀으로 새로 만들 수 있음 거기서부터 일단 혼동이 일어났고

컴포넌트간의 트랜스폼 계층구조가 존재함 물론 액터간의 트랜스폼 계층구조도 존재하는데

액터간의 계층구조는 뭔가 활용하기가 어려움 엔진 자체적으로도 이런 액터 계층 구조를 권장하지 않는 느낌


게다가 유니티의 프리팹에 해당하는 블루프린트는 (언리얼 2까지만 해도 이름이 프리팹이었다고 함)

액터로 계층 구조 만들어놓은거는 블루프린트화가 안됨

엄밀히 말하자면 되긴 되는데 구조가 좀 웃김

액터와 액터로 계층구조가 저장되는게 아니라

액터와 액터를 스폰해주는 컴포넌트로 계층구조가 저장이 되더라


간단히 말하자면 "블루프린트를 만든다 = 비주얼 스크립팅 가능한 커스텀 액터를 만든다" 임

근데 블루프린트의 비주얼 스크립팅은 정말 강력하더라

손꾸락으로 타이핑 하면서 코딩하는 것 보다는 생산성이 월등함 일단 프로토타이핑용으로 좋고

외국 유튜브 보니까 보통은 C++ 스크립트로 구조 짜놓고 그 위에 블루프린트로 재정의 해서 기능을 구현한다고 하더라


그리고 좀 빡치는점 있음 OnTriggerStay()랑 OnCollisionEnter(), OnCollisionExit()에 해당하는 함수가 없음

OnTriggerStay()는 뭐 쓸 일 많이 없고 직접 Update()에다 기능 구현하면 그만인데

OnCollisionEnter(), OnCollisionExit()가 없으니까 미치겠더라

그거 빼면 물리쪽은 정말 근사하게 작동함 물체가 너무 빨라서 벽 뚫는 그런거 없음


그리고 엔진 자체적으로 무슨무슨 매니저 같은거 극혐하는 분위기임

싱글톤 패턴 자체를 부정함 만드는게 가능하긴 한데

공식적으로 "너 싱글톤 패턴 쓸거야? 알겠어. 근데 나도 책임 안질거임" 이런 입장임

일단 엔진 내부적으로 무슨무슨 매니저가 대부분 구현되어있긴 하고, 그거 가져다 쓰면 되긴 함

굳이 싱글톤 같은 기능 필요하면 GameInstance 라는 클래스를 재정의 해서 거기에 올려놓고 쓰면 됨

GameInstance는 게임이 켜지고 꺼질때까지 삭제되지 않는, 개발자가 활용가능한 유일한 싱글톤 객체임


그리고 런타임에 어떤 액터나 컴포넌트, 객체를 삭제시키고 싶은 경우가 있을거임

유니티면 그냥 신경 안쓰고 Destroy() 함수에 인자값 넣으면 끝임

근데 언리얼은 신경써야 할게 좀 있음


일단 언리얼은 C++로 스크립팅을 하지만 언매니지드가 아님 언리얼 자체적인 GC가 있음

우리가 어떤 객체를 포인터로 관리를 하다가 놓치는 경우에 메모리 누수가 발생하는데

언리얼 엔진에서는 놀랍게도 포인터로 관리하는 객체는 앞에 UPROPERTY()라는 키워드를 붙여주기만 하면

자동적으로 관리됨 메모리 누수 그런거 없음


그런데! 여기서 언리얼의 GC로 관리중인 객체를 삭제할 때는 한가지 문제가 발생함

언리얼의 Destroy()함수로 객체를 삭제하게 되면 바로 즉시 삭제되는게 아님

내부적으로 PendingKill이라는 키워드가 붙어서

GC가 동작하는 주기가 있는데 한 이게 10초마다 한 번씩 동작하는걸로 앎

10초 아닐 수도 있는데 일단 매 프레임마다 동작하진 않음 세팅에서 조절 가능

암튼 2초 전에 GC가 동작했다면 다음 주기가 올 때 까지 8초는 기다려야 객체가 삭제됨


여기서 생기는 문제. 삭제시켜둔 객체가 완전히 죽을 때 까지는 같은 이름의 객체를 생성할 수가 없음


쓰다보니 좀 기네 말하고 싶은게 더 있긴 한데 다음편을 쓸 마음이 생긴다면 말하겠음

질문 있으면 질문 받음