반응형

https://gall.dcinside.com/mgallery/board/view/?id=game_dev&no=66894 

 

알아두면 좋은 기술이나 지식, 라이브러리들 - 인디 게임 개발 갤러리

다음회사는 아마 게임회사를 안가게 될 것 같아서 제가 지금껏 해본것들 정리겸 인디겔에 적고 떠남니다..ㅠㅠ 유용한 라이브러리 뿐만 아니라 직접 할줄 알아야하는 지식도 포함하고 있음미다

gall.dcinside.com

 

Odin Insepctor

 

 

https://youtu.be/5TbhbU0HATQ

 

이건 뭐 누구나 다 아는걸텐데 말이 필요할까요! GUI 만들때도 굉장히 편하고 강력한 Serialize+GUI를 제공하기 때문에

사실 유니티를 사용한다면 누구나 가장 먼저 임포트하는 라이브러리 입니다.

 

비싸지만 잘 활용하면 생산성이 눈에띄게 올라가니 추천드려요.

 

 

 

 

 

 

 

Behaviour Tree (AI)

 

 

https://youtu.be/MT2C2Msr3xc

 

 

https://youtu.be/6VBCXvfNlCM

 

 

Behaviour Tree를 짤 줄 몰라도 사용하는 방법과 구조적인 원리를 알면 게임 AI를 만드는데 도움이 됩니다. Behaviour Tree는 GUI로 제공되는

편리한 유료 에셋들이 있습니다. 나중에 게임에 복잡한 AI를 넣어야 하는경우 한번 활용해 보세요.

 

* 복잡하지않은 간단한 AI는 FSM으로도 충분하긴 함니다. 그런데 저는 그냥 하나 익숙하게 잘 쓰려고 BT Tree로 다합니다.

https://assetstore.unity.com/publishers/2308 BT트리를 유료에셋으로 쓰시려는 경우 해당 에셋을 추천합니다. 다만 구매하시기전에 BT 트리가 무엇인지

정확히 이해하시고 사세요. 생각보다 복잡하긴 합니다.

 

 

 

 

 

 

코드 생성 자동화 (Code Generator)

 

 

https://youtu.be/-BfqFaQF53s

 

반복적인 코드를 짜야하는 경우나 서버와 Enum동기를 맞추는경우 코드 제네레이터를 만들줄 알면 코드 관리하기가 굉장히 편리합니다.

코드제네레이터는 위 동영상처럼 자동으로 형식이 있는 코드를 짜주는 도구를 말합니다. 위 영상은 제가 직접 만든거에용.

 

Obfuscator

 

 

 

 

 

 

https://github.com/shlifedev/AmongUsMemory/blob/master/OffsetGuide.md <-어몽어스의 경우 제가 이렇게 해킹했읍니다.

치트엔진에 모노디섹터 라는게 있는데 그게 게임의 구조를 다 볼수있게 해줘요.

 

Obfuscator.. 난독화죠. 여러분들이 만드는 유니티는 컴파일을해도 해커가 쉽게 정보를 해킹할 수 있습니다.

사실 유니티는 보안이 개똥이에요. 제일 해킹하기 만만한 게임엔진 입니당.

게다가 DnSpy나 DotPeek을 써보신 분들은 알거에요. il2cpp조차 없는 유니티가 얼마나 해커들에게 놀이터인지..

 

위 링크는 제가 어몽어스를 해킹했을때인데, Obfuscator를 적용하지 않으면 저런식으로 게임 내부의 클래스명이나

게임 스트럭쳐를 쉽게 확인할 수 있습니다.

 

난독화를 적용하면

 

int health = 2000;

 

이라는 변수가 아래처럼 변합니다.

 

int CXZJCXZJC = 0x7d0 // 0x7d0은 16진수로 2000입니다.

 

 

이런식으로 난독화되어 들어가서 해커가 해킹하기가 귀찮아집니다.

사실 모노 디섹터를 안쓰는 전통적인 해킹방식으로 포인터만 취득하면 다 금방 뚫려요

일반인이 Remote Thread를 주입하는걸 막고싶다거나 메모리 읽기쓰기를 방지하려면 안티치트 도입밖엔 답이 없긴함니다.

 

 

참고로 윈도우빌드시 Il2Cpp로 빌드해도 치트엔진의 Mono Dissector 가 작동하니 Il2cpp 빌드를 하신다해도

난독화는 필수입니다.

 

Newtonsoft.Json

 

Json이 필요하실때 Newtonsoft.Json 에셋스토어에 있는거 쓰시면 됩니다. 유니티에서 Json 파싱은 일반적으론 이 라이브러리를 사용합니다.

유니티에도 내장되어 있는게 있는 것 같은데 가끔 파싱 못하는 이유를 모르겠어서 그냥 맘편하게 얘 씁니다.

 

Peek (에셋)

 

 

https://youtu.be/WXiMQmuB3Dc

 

https://assetstore.unity.com/packages/tools/utilities/peek-editor-toolkit-149410

 

생산성 및 편의성 에셋입니다. 개인적으로 썻을때 생산성이 많이 오르더라구요.

Assembly Definition

 

컴파일 하실때 Assembly.Csharp 쪽으로 컴파일 되시는거 아시죠?

이런 저런 스크립트가 쌓이면 Assembly.Chsarp.dll의 용량이 커지면서 컴파일 시간이 길어집니다.

에디터-플레이 모드 진입시간도 길어집니다.

 

Assembly Definition을 사용하는 이유는 이것 때문입니다.

보통 라이브러리를 만드실때는 라이브러리는 Assembly.Csharp(유니티 프로젝트)를 참조 할 이유가 없습니다.

코드가 여기 종속될 필요도 없구요.

 

그렇기때문에 Assembly Definition으로 dll을 분리하면 컴파일시간을 줄일 수 있습니다.

 

 

 

Asset Bundle Custom Protecting

 

에셋번들 직접 암호화 하는 방법을 알면 좋습니다. 뭐 어떤 게임에서나 사용하고 있는 방법이라 크게 어려운건 없습니다. 보통 파일의

특정 Byte를 암호화하여 내 게임의 데이터 파일을 뜯어보는 변조행위를 방지합니다.

 

설명하고자 하는건 직접 하는 커스텀 암호화 방식입니다. 그런데 정보글이 별로 없어서 네이버 카페에 제가 정리했었던 글이 있는데 https://cafe.naver.com/unityhub/112019 에 있습니다

파이어베이스

 

파이어베이스 배워두면 좋은게 여러가지 있습니다

 

1. 푸시메세지 짱 쉽게 구현가능

 

 

2. 게임 로그 짱 쉽게 남길수있음.

예를들면 플레이어가 강화를 보통 몇회차에 실패하는지,

첫 시작시 레벨 몇까지 키우다가 게임을 종료하는지

등등.. 다 구글 서버에 남고 통계로 관리가능

 

 

3. 인증 쉽게 구현 가능

 

Social Login

 

소셜로그인 (GPGS, Facebook, App Store) 를 구현해보는게 좋습니다. 아, 직접 만들라는게 아니고 개발사가 제공하는

라이브러리를 쓰시면 됩니다.

 

근데 대형 개발사는 SDK만들때 그냥 지들이 만들더라고요 ㅋㅋㅋ

 

Web Request & Response

 

Api 서비스를 이용하거나 여러가지 이유로 HTTP 통신을 이해하시면 좋습니다.

HTTP통신은 웹 개발할때만 쓰는게 절대 아닙니다. 일단.. 프로그래머라면 반드시 배워야합니다.

 

DnSpy or DotPeek

 

저는 다른게임 소스코드 까보는 경우가 생각보다 많았습니다.

그냥 처음 만드는 장르면 얘내는 코드를 어떤식으로 짜놨을까 궁금해서 보고 구조를 참고하려는 경우가 많았습니다.

또는 막히는게 있으면 얘내들은 이거 대체 어떻게 해결한거지? 하고 찾아볼때도 있고요..

 

그래서 저 두 툴을 이용해서 소스코드를 볼 수 있었습니다.

대신 il2cpp 혹은 난독화 처리 되어있으면 못보긴 합니다..

il2cpp는 그래도 c# 잔해가 남아있어 Struct정도는 파악 가능합니다.

 

제가 카드겜 만드는데 얘내는 구조 어떻게 짜놨을까 하고 하스스톤이나 레전드오브 룬테라 초창기 나왔을때 dll 까봤던 기억이 있네요

유니티로 만든 게임 해킹이나 C#으로 만든 프로그램 까볼때 쓰기도 하고..

일단 얘내도 쓸 줄 알면 좋긴 합니다만 필수는 아닙니다.

 

OAuth 에 대한 이해

 

나중에 직접 서비스할때 OAuth에 대한 이해가 있는게 좋습니다. 특히 유니티는 구글서비스를

이용하는 경우가 많으실텐데 OAuth를 이해하지 않으면 구글서비스를 이용할때 혼란이 좀 많이

생기실 수 있습니다.

 

 

 

IMGUI

 

UIElement가 나왔지만 꾸준히 유니티에서 사용하는 GUI 코드죠. OnGUI() 함수 내부에 구현하는 그것 맞습니다.

배워두면 라이브러리나 에디터 만들때 유용합니다.

 

 

XOR 암호화

 

 

https://youtu.be/ii31ObaAaJo

 

 

 

https://youtu.be/pvII6_O6KAc

 

 

게임개발자가 자신의 게임의 해킹을 방지하기위해 할 수 있는 최소한의 장치입니다.

정말 우리가 흔히아는 XOR 연산에 불과한거라 구현이 어렵지 않아 직접 구현해서 쓸 수 있습니다.

영상은 아마 영어라서 잘 이해가 안되실수도 있는데 정말 잘 설명한 영상이라 가져와봤어요

저 영상에 있는게 정말 다에요. 구글에 XOR 암호화 쳐보시면 자세히 나옵니다.

 

이걸 구현해두면 치트엔진으로 서치로 값 오프셋 정도밖에 못찾는 허접한 치터툴키디들은 대부분 방지할 수 있습니다.

저는 보통 기능을 덧붙여 외부에서 강제로 값을 수정하면 XOR연산이 실패할때의 Callback을 만들어

해당 사용자를 서버에 로그로 남기고 벤때립니다.

 

 

 

 

 

젠킨스 or 유니티 클라우드 빌드 (빌드 자동화)

 

개인적으로 저는 유니티 클라우드빌드 돈질러서 쓰는거 추천합니다.

저는 유니티 클라우드 빌드를 슬렉과 연동해서 플레이스토어 앱 배포까지 전부 자동화 했었는데 굉장히 편했습니다.

또 제가 ios 디바이스가 없는데 유니티 클라우드 빌드는 ios앱까지 빌드해주는걸로 알고 있습니다.

 

다만 프로젝트가 무거워서 빌드속도가 중요하신 분은 빌드컴퓨터로 젠킨스 쓰는게 좋을 것 같아요.

근데 빌드컴퓨터 살돈에 차라리 클라우드 빌드가 더 나은것 같아서 저는 후자추천. 가성비/시간절약은 후자입니다.

게다가 클라우드 빌드는 버튼 몇번 뚝닥하면 되니까용~~

 

 

 

 

비동기와 비동기 콜백에 대한 이해

 

서버와 통신하는 경우가 없으면 사실 자주 쓸 일 없긴 하지만 이해해두면 나중에 분명 큰 도움이 됩니다.

비동기는 유니티로 학습하기 보다는 API서버와 HTTP 통신하는 프로그램을 간단히 짜보시면 이해가 더 빨리 되실겁니다

 

 

 

 

 

C# 기본 문법중 유니티와 연관하여 도움될만한 키워드

- Reflection

- Delegate/Callback/Lambda

- Attributes

- Properties

- Design Pattern (Singleton)

- Interface

- typeof / GetType()

- String 관련함수

- 반복기 (Enumerator)

- Linq

- Marshal

 

 

UniRX

그런데 저는 이거 사실 모두가 이해할 수 있는 코드 관점에서는 별로 좋아하지는 않지만 프로그래밍 기술로서는

배워두면 정말 좋다고 생각합니다

 

리액티브 프로그래밍을 배워두면 유니티말고 다른곳에서도 충분히 쓰실 수 있습니다

 

https://github.com/neuecc/UniRx 여기서 소개글을 꼭 보세요.

 

 

 

 

게임 데이터 DB

수천 수만개의 몬스터나 아이템 데이터를 관리하려면 엑셀같은 테이블이 필요하겠죠

보통 주로쓰는 방식은 Scriptable Object, Excel, CSV등 여러가지 방식으로 관리할 수 있어요.

 

 

- 구글시트를 사용하는경우

개인적으로 인디게임을 만든다면 가장 추천하는 방식이에요.

 

https://shlifedev.tistory.com/33 <- 제가 직접 만든거에요. 무료에 기능도 유료급으로 좋으니까 써보시는걸 추천드려요.

 

https://assetstore.unity.com/packages/tools/integration/google-sheets-for-unity-lite-15570 <- 에셋스토어에 20달러짜리에요.

 

 

- 엑셀을 사용하는 경우

 

https://assetstore.unity.com/packages/tools/integration/bg-database-112262 <- 구글시트+엑셀이랑 호환되고, 써봤었는데 정말 좋음.

 

 

유니티 에디터 기능 적극활용

 

 

 

UnityEditor쪽 네임스페이스 기능 파악을 해두면 좋와용 에디터 내에서 프로그래머나 기획자가 손으로 직접 막 끌어넣고~ 노가다 하는 작업들을

자동화 하는데 편해용

 

예를들면 에디터 기능을 사용해서 Animation Controller를 자동으로 생성해주는 툴을 만들면 생산성에 도움이 되겠죠.

에디터 GUI를 잘 사용 할 줄 알면 자기 게임에서 쓰이는 게임 에디터 툴도 만들수 있고용.

 

위에 동영상은 제가 그냥 블로그 포스팅하려고 예전에 만들었던 영상인데 Multiple Sprite를 버튼 한번만 누르면 자동으로 애니메이션 클립으로

생성해주는 툴을 만든것입니당. 동영상 찍으려고 기능만 만든거라 Flip이 안맞긴한데 무시해주세용.ㅋㅋ

 

 

 

 

 

 

 

IMGUI (OnGUI) 대신 사용할수있는 UI Element

 

 

유니티2019.3 이상의 버전을 사용하는경우 UI Element 를 이용해서 쉽게 에디터 GUI를 프로그래밍 할 수 있습니다.

비유를 해드리자면 html/css로 쉽게 사이트 만들듯 UI Element 도 uxml+uss로 쉽게 GUI를 프로그래밍 할 수있습니다.

 

지금은 또 UI Builder라는게 있어서 GUI로 GUI를 만들수도 있음ㄷㄷㄷ

 

저는 IMGUI로 코드짜면 너무 지저분해지고 느려져서 UI Element로 MMO RPG의 맵 배치툴이나 엔피시 에디터 툴들을 작업해 봤었어요.

다만 이건 최신버전 유니티가 아니면 사용하는걸 비추천 드립니다. 다만 조만간 스타일링이 너무 편해서 IMGUI대신 이걸로 대체될 것 같음.

 

github.io에 제가 포스팅한 글이 있긴한데 그땐 너무 글을 못써가지고 올리기는 쪽팔리고 영상을 하나 올리고 감니다.

 

 

 

포톤 네트워크 or 프라우드넷

 

이 두개는 다 인디게임 개발자들한테 유명하니까요.. 그냥 전자 후자 왜 쓰는지만 적을게요.

뒤끝은 제가 잘 모르는거니까 패스 ㅎㅎ

 

 

a) 직접 서버 짜는게 싫다. 유니티 관련해서 라이브러리가 알아서 동기화 맞춰주면 좋겠다 - 포톤 네트워크

 

b) 직접 서버 프로토콜부터 동기화 관련 세부사항 구현이 필요하다. Physics 관련 물리처리등도 전부다 서버에서 할려고한다. - 프라우드넷

 

 

길찾기 알고리즘

 

 

 

 

A* (Pathfinding)을 짤 줄 알거나 사용할줄 알면 알면 굉장히 도움이 댑니다. 깃허브에 오픈소스가 많으니 참고하면서 공부해도 되고,

지형지물이 복잡한 Mesh로 이루어진 경우 Nav Mesh를 사용하는것도 방법입니다.

 

그냥 가져다 써도 무방하지만 저는 직접 구현이 필요했었던게 제가 만들던 게임 서버를 웹소켓 (노드js)로 짜보고 있었는데

플레이어 이동처리를 서버에서 하는터라 노드js에서 직접 A*를 짰어야 했읍니다..

 

게임회사 면접에 문제로 나오기도 해가지고 알고리즘 정도는 알아두면 좋아요.

처음엔 어려운데 배워두면 간단해요

 

 

 

 

 

Gizmos

 

 

게임 디버깅할때 시각적으로 편리한 기능입니다.

일단 잘 쓰면 무조건 좋습니당.

 

 

보간법 관련 지식

 

 

 

보간법 관련 수학기술들을 익히면 좋습니다. 예를들면 선형 보간법 같은게 있겠읍니다.

보간은 생각보다 게임에서 정말 많이 쓰입니다. 네트워크 동기화를 자연스럽게 맞출때도 사용해요.

 

약간의 (DB관련)서버 관련 지식

클라이언트 개발자인 우리는 어느정도 서버 개발지식도 겸비하는게 좋습니다. 예를들면

서버 지식이 전무해서 유저정보를 저장할때 무작정 클라에서 MySQL에 무작정 커넥션 박는분이 계시는데

파이어베이스db 같은걸 사용하실게 아니라면

Client -> Server -> DB 구조를 타셔야합니다.

 

 

 

 

간단한 API서버 만들기 (노드js 추천)

생각보다 api서버 만드는게 어렵지 않아서 간단한 orm과 node.js 같은걸 배워두면 위에 언급한 Client -> Server -> DB 구현하기가 쉽습니다.

저도 최근에 공부해보니까 프로그래밍 이해도가 좀 있으면 정말 기초는 금방 배우고 게임개발에 쓸 정도 되긴 합니다.

 

 

 

게임서버/소켓통신 지식

게임클라이언트여도 어느정도 알고있으면 좋습니다.

게임 서버에서 쓰는 어려운 기술들 말고요.

패킷은 무엇인지, 소켓통신은 무엇인지, TCP/UDP 차이가 뭔지 등등.

나중에 서버랑 협업하려면 필요합니다.

 

 

 

 

게임 패치 시스템 구현

패치시스템 구현을 위해서는 AssetBundle or Addressable에 대한 이해가 필요하고, FTP에 대한 이해와 파일 해시와

파일 쓰기 속도와 방식에 대한 이해가 필요합니다.

 

파일 해시같은 경우는 이미 받은 파일은 안받거나 기존파일 업데이트 받아야 하니까 필요하고요.

보통 패치받은 파일의 해시를 json등에 기록해서 확인하죠.

 

요즘은 파일 쓰기 속도에 대한 이해도 필요한데용

또 요즘 게임들 패치화면에는 심심하지 말라고 미니게임이 들어가잖아요? 패치받으면서 미니게임 하면 렉이 걸립니다.

 

그래서 파일 쓰기에대한 이해도 있으면 좋습니당. File Write가 모바일에서 많이 느리기 때문인데 이걸 어떻게 해결할건지 생각해보면

10메가짜리 파일을 받을때 버퍼에있는 데이터를 파일에 나눠서 쓸지, 아니면 한번에 10메가 받아서 쓸지 잘 정해야 하거등요.

후자같은 경우는 패치 받을때마다 툭툭 끊기긴 하겠쬬..?

 

비동기로 쓰냐, 동기로쓰냐, 안드로이드 백그라운드 쓰레드를 같이 이용하냐 여러가지 방법이 있으니깐요..

 

근데 요즘 파일해시니 뭐니 귀찮은거 생각 안하고 짤 수 있게 Addressable이 알아서 잘 해주는거 같은데 전 안써봤으니 어드레서블에 대한 이야기는

패수 하겠읍니다.

 

 

 

System.Collection.Generic

System.Collection.Generic에 포함된 자료구조들을 잘 사용할줄 알면 좋습니다. GameObject.Find("이름")으로 찾는게 아니라

자주 게임오브젝트를 코드에서 검색해서 사용해야 하는경우 Instantiate와 동시에 List/Dictionary에 넣어 관리하는 습관을 들여야 합니다.

 

 

Linq

 

쿼리문과 비슷한 형태로 List나 Dictionary등 자료구조에 있는 데이터를 쉽게 다룰 수 있습니다.

이미 asp.net core쪽에서는 ORM 개념으로 쓰고있다고 들었어요ㅎㅎ

 

 

 

멀티 쓰레딩 관련

 

Mono를 상속받는 객체는 멀티쓰레딩이 안되는게 유니티 최대 단점입니다. 그래서 보통 유니티로 만든 게임들은 CPU 처리속도를 많이먹죠..

하지만 역으로 모노 비헤이비어 상속이 없는 클래스라면 멀티 쓰레딩 사용 가능하기도 합니다.

이걸 경우를 따져가며 잘 활용할줄 알면 성능향상에 도움이 됨니다.

 

대부분 포톤을 쓰시면 몰라도 되지만, 자기가 게임서버를 만들거나 서버와 직접 통신해야 하는경우 패킷 송수신에는 Mono의 기능이 전혀 필요 없으므로

Mono 종속성이 없는 클래스를 만들어서 다른 쓰레드에서 패킷 송수신을 하고 Dispatch 하는게 일반적입니다.

 

 

 

 

캐싱에 대한 이해

 

캐싱에 대한 이해도 하시는게 좋습니다. 사실 이건 기본이긴 하죠.

예를들어 불러오는데 3초걸리는 이미지를 필요할때마다 매 번 불러오면 많이 느리겠죠.

특히 이게 유니티 Update문에서 실행되고 있다고 생각하면 끔찍하죠.

한 번 미리 불러와놓고 사용하는게 더 자원을 덜 소모하는 그런게 캐싱..

 

 

유니티에서는 GetComponent 캐싱 이라고 쳐보시면 쓸만한 정보가 많이 구글에 나올겁니다.

Update문에서 GetComponent<T>().Method();하는게 나은지..

 

Awake에서 전역변수에 GetComponent<T>()를 한다음

Update에서 전역변수.Method()가 나은지.. 차이가 있겠죠?

 

 

GetComponent만 캐싱할 수 있는게 아니라 저것과 비슷한 원리로

탐색 -> 접근 과정에서 탐색의 과정을 줄일 수 있는 경우 캐싱을 적용하심 됩니다.

 

드로우콜 및 아틀라스에 대한 이해

 

드로우콜이 많을수록 cpu 사용량이 증가합니다.

 

쉬운 이해를 위해 드로우콜 10이면 for문이 매프레임 10번돌다가 드로우콜 100이면 100번돈다고 생각하는 정도로

비유하겠읍니다..

 

 

즉 드로우콜은 화면에 표현하고있는 오브젝트가 많아질수록 늘어납니다.

이 경우 모바일에서는 발열로까지 이어지는데요..

 

특히 스프라이트를 많이 사용하시는 경우 Atlas를 이용하셔서 비슷한 종류의 스프라이트끼리 묶어서 드로우콜을 최적화하는게 좋습니다.

 

아틀라스안에 수박,사과,딸기를 넣고 한 씬에 3개를 다 뿌리면 드로우콜은 1이지만

아틀라스에 넣지않고 수박,사과,딸기를 넣고 한 씬에 3개를 뿌리면 드로우콜이 3이됩니다.

 

대신 아틀라스는 메모리를 많이 차지하는 단점은 있습니다.

 

참고로 드로우콜은 여러가지 요인으로 발생하는거고, 보통 아틀라스 미적용으로 드로우콜이 많이 발생해서

아틀라스를 필수항목으로 꼽아 예를 든 것 입니다.

 

 

 

shared material 에 대한 이해

A큐브 B큐브 C큐브에 Test Material을 넣었다 칩시다.

material의 속성을 바꿔서 각각 빨강,노랑,파랑으로 바꾸고 싶은데

이 경우 드로우콜이 3이됩니다.

 

왜냐하면 material은 속성을 공유합니다. A큐브를 빨강으로 바꾸면 B,C도 빨강이 되는게 정상인데

이걸 강제로 색을 분리시켜버리면 드로우콜은 늘어납니다.

 

https://docs.unity3d.com/kr/530/ScriptReference/Renderer-sharedMaterial.html

모르고 작업하시는 분들이 있는 것 같아서요. 알아두시면 좋습니다.

 

 

셰이더 프로그래밍 및 그래픽 지식

 

 

https://youtu.be/KnueAgpUL3Y

 

 

 

https://youtu.be/C0uJ4sZelio

 

저는 셰이더를 잘 하는편은 아니라 깊은 조언은 못드리지만 어느정도 하면 좋다고 생각해서 배워두니 도움이 많이 되었다고 말씀드리고 싶습니다.

셰이더나 그래픽 지식은 특히 3D 모델러 분들이랑 소통할때 도움이 많이 됩니다.

Material에 들어가는 속성들에 대한 기본 이해들을 해두면 좋습니다. Normal Map, Height Map이라던가 UV좌표 등등등..

각 일반적으로 쓰는 셰이더에서 쓰이는 속성값들에 대한 이해를 해두면 좋을것입니당.

 

 

 

빌드하려는 타겟 플랫폼에 대한 지식

안드로이드 빌드할꺼면 안드로이드 플러그인도 만들줄 알면 좋겠죠. 기본적인 웹뷰를 만들수도 있는거고, 필요에 따라서 자기회사가 중견/대형 회사면

심지어 SDK를 직접 구현해야 하는 경우도 있고.. 자기가 Reflection을 사용하는데 그게 해당 플랫폼에서 제대로 지원이 되는지 확인해야 할 필요도 있구요

그냥 알아두면 가장좋은 이유 하나느 오픈소스 안드로이드 플러그인 박아넣었는데 종속성 에러나면 해결하려면 gradle, manifest에 대한 이해도 있어야 하거든요.

adb도 기본적으로 사용할줄도 알아야하구요

 

 

DoTween

 

 

https://youtu.be/SZF1oZ-tqMs

 

DoTween을 잘 다루면 이쁜 연출을 여러가지 할 수 있습니다.

유튜브에 암만 쳐봐도 괜찮은 DoTween 설명이 없어서 그냥 설명영상 이라도 가져와봄.

 

보통 UI 뿅~ 하고 이쁘게 튀어나오는 연출이나 게임 캐릭터 이동연출등에 자주 사용합니다.

 

 

힙과 스택에 대한 이해, 메모리 관리

요즘같이 콤피타도 빠르고 좋은세상에 꼰머스러운 주제이지만 게임 개발자라면 당연히 필요한 지식이 아닐까 싶읍니다.

 

사실 C++를 했던 사람이라면 크게 어려운 거 없는 부분이긴 해요.

 

그래도 본인이 정말 개발자라면 이런 고민은 해보면 좋습니다.

 

 

- 스택은 뭐고 힙은 뭐고, 왜 할당 영역이 분리되어있고 스택 할당이 왜 힙 할당보다 더 빠른가?

- new Class()로 인스턴스 하면 힙메모리라 가비지가 생긴다고 들었는데 그럼 매 프레임 자주 호출하는 new Vector3() 호출은 왜 가비지를 안일으키는가?

- 힙 메모리가 동적할당을 위한거라면 도대체 스택 메모리의 사이즈는 어떻게 결정되는걸까?

- 스택 오버 플로우가 무엇인가?

- 내가 유니티에서 Destroy해서 더이상 사용하지 않는 객체는 메모리에서 왜 바로 안사라질까?

- 오브젝트 풀링은 왜 쓰는걸까?

- Enum은 왜 가비지컬렉션을 발생시킬까?

 

..등등.. 모르시는 분들은 도움이 분명 될테니 한번 찾아보세요 ㅎㅎ

 

 

한번 이해하고 공부해보면 좋습니다

 

팁 : C#의 struct와 class의 메모리 할당 차이를 먼저 찾아보시면 개념은 쉽게 이해할 수 있습니다.

 

 

오브젝트 풀링 구현

 

 

 

 

이걸 왜 쓰냐면.. 똥피하기 게임이라고 치면 똥이 플레이어가 죽지 않는이상 영원히 떨어질텐데,

Instantiate로 만든 똥이 쌓이고 쌓일수록 렉도 심할거고, 가비지컬렉션 되는 시점에 툭 끊기기도 할거고..

 

그래서 게임에서는 오브젝트 풀링으로 객체를 재사용하는 방식을 자주 사용합니다.

 

 

 

 

 

 

게임 시스템 직접 구현 (★★★★★)

 

게임 시스템 : 전투,인벤토리,상점,퀘스트,시야(FOV), 길찾기, AI 등등 게임을 이루는 프로그래밍적인 모든것들을 일컫습니다.

 

게임 시스템은 타인이 만든것에 의존할 수 있는게 아닙니다. 할 수 있어도 남이 만든 틀 위에서 게임만드는 꼴이랑 다를게 없다고 생각합니다.

2D 플랫포머 툴로 2D게임을 만든다해서 림월드 같은 게임을 만들 수 있는건 아니니까요.

자기 게임 시스템은 자신이 구현해 나가야 합니다.

 

자기 게임에 알맞는 구현이 안나올수도 있고요. 그래서 꼭 직접 만들어보는게 중요하다고 생각해요.

제가 별표를 칠만큼 중요한 이유는 다른거 다 떠나서 이걸 할줄 알면 자기가 원하는 게임은 다 만들 수 있는거니까요.

 

 

예를 들어볼까요?

 

전투시스템도 여러가지가 있죠?

 

Escape From Tarkov 라는 FPS게임은 다른 FPS랑 다르게 총알이 벽에 맞으면 총알이 깨진 잔해로도 데미지를 입는다네요.

이런 생소한 구현을 기획자가 원하면 일반 인터넷 게시글만 보고 못할겁니다.

 

철권같은 게임의 경우는 잘하는 사람들은 1프레임 단위로 계산까지 하고 키 입력 커맨드도 정확한 타이밍에 입력해야하는

전투시스템을 갖췄는데, 이런건 인터넷만 보고 만들수 있는게 아니라 자기가 직접 만들어야 겠죠.

 

롤 같은 게임도 라이즈로 따지면 QEQWQEQ를 빠르게 커맨드해도 다 입력이 되어 나갑니다. 이런거도 전투시스템의 일부인데

Input Queue 대한 이해와 스케줄링에 대한 있어야 겠죠?

 

 

인벤토리도 여러가지가 있죠?

 

예를들면 인벤토리 시스템을 만들고 싶은데 인벤토리도 여러가지 방식이 있습니다.

 

 

메이플스토리 같은데서나 쓰는 단순한 인벤토리부터 Escape From Tarkov 혹은 Scum 에서 쓰는 복잡한 인벤토리 시스템까지.

사실 이런 기본적인 것들은 직접 짜라고 하면 다 짤줄 알아야 한다고 생각합니다.

 

초보자 티를 벗고싶다면 게임 시스템을 자기가 하나하나 전부 구현 해보세요.

 

시스템 구현은 남의 강의보고 따라한다기 보다 그냥 소스코드를 예제로 참고만하고

작업하는 수준이 되야합니다.

 

 

 

 

 

 

Profiling (프로파일링)

 

 

 

https://youtu.be/4kVffWfmJ60

 

CTRL + 7 누르면 나오는 프로파일러를 사용할 줄 알면 좋아요. 자기 코드가 어디서 느려지고, 어디서 문제가 있는지 파악하기 좋습니다.

할 줄 알면 좋은게 아니라 자기가 조금 사양을 많이 잡아먹을만한 게임을 만든다면 그냥 할 줄 알아야 하는 것 같아요.

 

 

 

시네머신 카메라

 

 

 

 

저는 이걸 써보고 박수를 쳤습니다. 유니티가 인디게임 개발자들 생각해서 이런거 하나는 잘 만들어 주는거 같아요

카메라 연출을 많이 써야하거나 FPS나 MMO RPG 스타일 Camera를 구현하시는 분들은 한번 배워보시면 어떨까요?

 

 

픽셀 퍼펙트에 대한 이해

 

 

 

2d 게임 만드시는 분들은 한번 짚고 넘어가시면 좋습니다.

 

발열/배터리 문제인식

 

 

 

 

보통 Application.targetFrame 옵션을 타협해서 발열문제를 해결합니다. 발열은 보통 CPU사용량이 많아지면 생깁니다. 하지만 최근에

Addaptive performance 라는 기술이 생기면서 개선 될 것 같긴 합니다만 최대한 자기가 만든 게임을 잘 최적화 해서

발열을 줄이시는게 중요합니다.

 

UnityEngine.UI (UGUI)

 

길게 말할것도 없고 UGUI 관련 스크립팅을 능숙하게 할 줄 알아야 하는건 당연하죠. 본인 게임에 UI를 많이 쓴다면 UGUI 관련 스크립팅을

능숙하게 하시는게 좋습니다.

 

 

 

String 관련함수

스트링 관련 함수들을 잘 쓰면 좋습니다

split, join, last, length, indexof, substring, startswith 함수등은 정말 많이 씁니다.

 

 

 

 

 

게임에 유저 Modding(모드) 지원

 

만약 본인이 게임에 모딩지원을 추가하고싶으면 아래 키워드를 검색해서 공부해보세요

1. Harmony (강력추천)

2. Unity Lua Binding

 

 

 

Rider IDE

 

비주얼 스튜디오 쓰다가 젯브레인 Rider로 갈아타니 코드 작성속도가 1.5배는 좋아졌습니다.

비효율적인 코드도 rider가 찾아주고..

 

대신 유료라 돈아까우면 vs community 써야죠 ㅠㅠ

 

 

 

System.Reflection

리플렉션을 정말 잘 사용하면 효율적인 코드를 작성할 수 있습니다.

Odin Inspector같은 에셋도 사실 리플렉션을 겁나 잘 써서 만든 결과물이라 볼 수 있습니다.

 

 

System.IO

System.IO.Path 클래스나 System.IO.File, System.IO.Direcotry 쪽 함수들은 생각보다 많이 사용합니다.

뭐 어떤 언어에서든지 있는 파일시스템 관련 네임스페이스니까 잘 익혀두면 언젠가 꼭 도움이 됩니다.

 

 

Regex

 

 

 

여러분들이 C#을 안해도 regex 문법은 언제든지 어디에서나 유용하게 쓰일것 입니당.

이걸 배우는데에는 제가 최근에 즐겨보고있는 유투버분이 올린 영상이 큰 도움이 됩니다.

 

더쓰면 글이 자꾸 날아가네요. 다른내용 원래 더 있었는데 수정만 몇번째인지.. ㅜㅜ

나중에 다른곳에 다시 포스팅해서 올릴게요

 

반응형

+ Recent posts