(현) 캐나다 AAA 게임 스튜디오 U사 게임 프로그래머
- PC/콘솔 AAA 액션 어드벤처 게임 프로젝트 참여
(전) 국내 게임사 N사 서버 프로그래머
- 언리얼 MMORPG 게임 프로젝트 참여
(전) 국내 게임사 N사 클라이언트 프로그래머
- 언리얼 MMORPG 게임 프로젝트 참여
(전) 국내 게임사 N사 클라이언트 프로그래머
- 유니티 캐주얼/미드코어 게임 프로젝트 참여
(전) 국내 대기업 S그룹 소프트웨어 엔지니어
- S그룹 계열사 전산 시스템 프로젝트 참여
안녕하세요. 게임 개발자 BurningCarrot 버닝캐럿 입니다.
게임을 개발하는 사람이 되고 싶다는 마음으로
대기업을 퇴사한 후 국내 게임 회사를 거쳐
현재는 해외 게임 스튜디오에서 일하고 있습니다.
현재 업계에 몸담고 있는 만큼, 현업에서 사용하는
실전 노하우와 기법을 최대한 공유 드리고자 합니다.
여러분과 같이 게임을 좋아하고 만드는 한 사람으로서,
제 강의를 수강 하시는 모든 분들이 각자의 목표에
한걸음 더 다가갈 수 있는 유익한 시간이 되었으면 좋겠습니다.
💡블로그 : https://blog.naver.com/burningcarrot
💡브런치 : https://brunch.co.kr/@burningcarrot#works
💡스레드 : https://www.threads.com/@burning.carrot
💡X(구 트위터) : https://x.com/burningcarrot10
Courses
Reviews
l4knight26660
·
Unity System Programming Pt. 2 - Core Systems All-in-One Package for Implementing Commercial GamesUnity System Programming Pt. 2 - Core Systems All-in-One Package for Implementing Commercial Gameskyuarez
·
Unity System Programming Pt.1 - All-in-one package of core systems for commercial game implementationUnity System Programming Pt.1 - All-in-one package of core systems for commercial game implementation- (Free) AAA Game Programmer Job and Career Change Guidebook
rim01216595
·
Unity System Programming Pt.1 - All-in-one package of core systems for commercial game implementationUnity System Programming Pt.1 - All-in-one package of core systems for commercial game implementation- (Free) AAA Game Programmer Job and Career Change Guidebook
Posts
Q&A
데이터 로드 관련 질문
안녕하세요! BurningCarrot입니다. 문의해 주신 내용에 답변 드립니다.CSV Reader에서 object 타입을 쓰는 이유 object 타입을 쓰는 이유는 데이터 테이블에 저장된 데이터가 문자, 숫자(정수, 실수) 등 다양하기 때문입니다. object 타입이면 다양한 데이터 타입을 저장할 수 있는데 굳이 모두 string으로 바꾸는 불필요한 행위를 할 필요는 없습니다. 언박싱으로 인한 성능저하를 걱정하시는데 중소 규모의 게임에서의 성능 저하는 짧은 시간 단위로 반복으로 실행하는 Update 함수 같은 곳에서 그 특정 행위를 하는지 여부만 보시면 됩니다. CSVReader로 데이터를 읽어오는 행위는 게임 시작 시 단 한번만 실행할 뿐더러 Update 함수 같은 곳에서는 사용하지 않기 때문에 성능 저하는 우려하지 않으셔도 됩니다. 리스트 순회를 통한 데이터 검색 저장된 데이터가 많고 데이터 검색이 자주 일어난 다면 딕셔너리에 저장하셔도 됩니다. 저는 데이터의 양이 많지 않고 검색 또한 자주 일어나지 않아 리스트로 처리했습니다. ItemData와 같은 경우는 딕셔너리에 저장하는 것이 더 나은 선택일 것 같습니다. 검색이 자주 일어난다는 기준 또한 상대적입니다만 Update 함수에서 계속적으로 호출하는 것은 당연히 자주 일어나는 기준에 부합하는 것이고, 그 외에도 1초 단위 정도로 계속적으로 호출될 수 있는 것도 자주 일어나는 기준에 부합한다고 말씀 드릴 수 있겠습니다.
- 0
- 2
- 19
Q&A
18 유저 데이터 온라인DB 로드 및 저장 PT4의 UserInventoryData 클래스에 대하여
안녕하세요! BurningCarrot입니다.확인 감사합니다. 중복된 코드는 삭제하여 수업 자료에 재업로드해 두었습니다. 🙂
- 0
- 1
- 26
Q&A
16번 강의에서 ShowUI 함수부분 오타가 있는거 같습니다.
안녕하세요! BurningCarrot입니다. 문의해 주신 내용에 답변 드립니다.확인 감사합니다. 제가 영상 제작 후 오타를 확인하고 강의 자료에는 수정하여 올려 둔 것으로 보입니다. 아래와 같은 코드가 맞습니다. 감사합니다.if (m_UIOpenAnim) { m_UIOpenAnim.Play(); }
- 0
- 2
- 20
Q&A
19 유저 플레이 로그 수집 추가후, 앱 크러쉬에 대해
안녕하세요! BurningCarrot입니다. 문의해 주신 내용에 답변 드립니다.AndroidX DataStore 라이브러리가 어떤 이유로 포함되어 문제가 발생할 수도 있을 것 같습니다. 먼저 Assets > External Dependency Manager > Android Resolver > Force Resolve를 해보시면 어떻게 되는지 확인 부탁 드립니다. 그리고 Firebase Unity SDK는 버전명이 어떻게 될까요?
- 0
- 2
- 56
Q&A
PlayerPrefs 에 대해서 문의드립니다.
안녕하세요! BurningCarrot입니다. 문의해 주신 내용에 답변 드립니다.PlayerPrefs 그럼에도 실제 프로젝트에서도 사용이 되는지? 네 실제 프로젝트에서도 사용합니다. 서버가 있는 게임이라면 당연히 서버에 유저 데이터를 저장하겠지만 로컬에 저장하는 방식이라면 PlayerPrefs를 사용합니다.만약 사용된다면 PlayerPrefs 보안관련 작업을 따로 수행하나요? 사용한다면 당연히 보안 작업을 진행합니다. 회사 자체 보안 솔루션을 적용할 수도 있고, 상용 보안 솔루션을 적용할 수도 있고, 직접 구현할 수도 있습니다. PlayerPrefs의 유저 데이터 암호화는 섹션 8. 보충을 참고하시길 바랍니다.(사진)구글링을 하면서 Easy Save 라는 에셋 사용까지 이르게 되었는데, Easy Save 툴로 암호화된 파일로 유저 데이터를 로컬과 게임 규모에 따라서 서버에 저장해서 사용하는 것이 안정성이 있다고 파악을 했는데 이것도 괜찮은 방향인지 문의드립니다. 제가 올려드린 강의를 참고하셔도 되고 유니티 어셋 스토어에 있는 암호화 어셋을 사용하셔서 유저 데이터를 로컬에 저장하셔도 됩니다. 게임 규모에 따라서는 서버에 저장하는 것도 좋은 선택입니다. 실제로 [유니티 시스템 프로그래밍 Pt.2]에서는 Firebase DB를 사용하여 직접 서버 구현 없이도 Firebase가 제공하는 DB에 유저 데이터를 저장 및 로드하는 것을 다룹니다. (사진)
- 0
- 2
- 43
Q&A
다운 받은 자료 용량 관련 문의입니다.
안녕하세요! BurningCarrot입니다.정확히 어떤 파일 때문인지 알 수 있을까요? 보통 Git에서 파일 용량이 50MB 이상이면 '큰 파일 감지됨'으로 표시됩니다.
- 0
- 2
- 45
Q&A
userDataList Json으로 저장
안녕하세요! BurningCarrot입니다. 문의해 주신 내용에 답변 드립니다.IUserData는 클래스가 아니라 인터페이스이기 때문에 기존 JsonUtility를 사용해서는 json으로 변환할 수 없습니다. Newtonsoft.Json 어셋을 활용한 방법을 알려드리니 이를 활용하시길 바랍니다.using Newtonsoft.Json; //Newtonsoft.Json 어셋을 설치하셔야 합니다. var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto, Formatting = Newtonsoft.Json.Formatting.Indented }; //json으롭 변환 string json = JsonConvert.SerializeObject(UserDataList, settings); Console.WriteLine(json); //UserDataList로 역변환 List deserializedList = JsonConvert.DeserializeObject>(json, settings);Newtonsoft.Json 어셋 설치는 이 링크를 참고하시길 바랍니다. 제가 캡쳐한 부분을 참고하시면 됩니다.https://github.com/applejag/Newtonsoft.Json-for-Unity/wiki/Install-official-via-UPM(사진)
- 0
- 2
- 62
Q&A
Lobby 프리팹 구성 질문
안녕하세요! BurningCarrot입니다. 문의해 주신 내용에 답변 드립니다. LobbyManager와 LobbyUIController 프리팹을 구분하는 이유는 LobbyUIController 프리팹을 UI 오브젝트의 관리만을 전담하게 해주기 위해 그렇습니다. 이렇게 해야 작업 과정에서 효율을 높이고 실수를 줄일 수 있습니다. 예를 들어 팀으로 작업하는 경우, 아트 직군 분들이 보통 UI 프리팹에 이미지/이펙트를 추가하고 수정하게 됩니다. LobbyManager와 LobbyUIController 관련 오브젝트들이 하나의 프리팹으로 통합되어 있을 경우, 아트 직군분들이 LobbyManager 요소를 실수로 수정하고 이를 인지하지 못한 채 적용해 버리면, 게임 로직이 의도한 대로 작동하지 않게 됩니다.게임이 커지고 복잡해질 수록 이런 실수가 발생할 가능성이 높고, 그때마다 이를 해결하기 위해 추가적인 시간을 투입해야 합니다. 게임 개발 시 이러한 자잘한 실수가 생각보다 많은 시간을 잡아먹습니다. 때문에 유지보수 측면에서 분리할 수 있는 것은 분리해서 독립적인 시스템/프리팹으로 만들어 주는 것이 좋습니다. 추가로 궁금하신 점이 있으시다면 편하게 질문 부탁 드립니다. 🙂
- 0
- 3
- 57
Q&A
스팀 어드레서블
안녕하세요! BurningCarrot입니다. 문의해 주신 내용에 답변 드립니다.어드레서블의 장점을 두 가지로 정리하면 대용량 리소스 관리에 용이하고 원격 리소스 다운로드 서버를 구축할 수 있다는 것입니다. 단점은 여러가지 설정 및 빌드 작업 자체에 은근 시간이 소요됩니다.만약 수강생 분께서 개발하는 게임이 리소스 용량이 많고, 또 싱글 게임이지만 라이브 서비스처럼 주기적으로 콘텐츠를 계속 추가하실 계획이라면 어드레서블을 사용하시는 것이 좋습니다. 그러나 규모가 크지 않은 인디게임이고, 출시 후 버그 수정과 같은 자잘한 업데이트만을 생각하신다면 기존 Resources 폴더를 사용 하시는 것이 개발 효율성 측면에서 더 나을 것입니다. 리소스 용량은 많지만 출시 후 업데이트가 별로 없을 것이라면 어드레서블을 사용하여 리소스 관리를 하되 원격 리소스 다운로드 서버(CDN)는 구축하지 않으셔도 됩니다. 어드레서블 빌드를 게임 빌드 자체에 포함시키는 옵션을 선택하시면 됩니다.추가로 궁금하신 점이 있으시다면 편하게 질문 부탁 드립니다. 🙂
- 0
- 1
- 56
Q&A
이미 리소스 다운받은 후 다시 실행시 리소스 인식 문제
안녕하세요! BurningCarrot입니다. 문의해 주신 내용에 답변 드립니다.제 생각에는 50MB의 리소스 중 일부가 첫 실행에 모두 다운로드 되지 못한 것으로 보입니다. 두 번째 실행에서 50MB 중 남은 일부를 다운 받은 것 같습니다. 아마 50MB를 한 group(번들)으로 묶으셨을 것 같은데, addressables 내부적으로 하나의 그룹에서 조금이라도 새롭게 다운로드 받아야 할 용량이 남아 있으면(예를 들어 50MB 중 2MB) 해당 그룹을 다운로드해야 한다고 표시됩니다. 하지만 실제로 다운로드를 시작하면 새로 다운 받아야 할 용량만 받았기 때문에 금방 100%가 되었을 것으로 추측됩니다. 플랫폼 별로 리소스를 다운받는 경로가 다르기 때문에 윈도우는 처음에 정상적으로 잘 다운 받은 것으로 보입니다. 제가 다운로드해야 할 용량을 로그로 표시하는 것은 실제로는 해당 그룹의 총 용량을 표시하는 것이지 정확히 50MB 중 얼마를 새로 다운 받아야 하는지 정확하게 표시하는 것은 아닙니다. 그 기능은 addressables에서 제공해주고 있지 않기 때문에 직접 구현해야 합니다. 하지만 난이도가 있는 내용이기에 이 강의에서 다루지는 않았습니다. 추가로 궁금하신 점이 있으시다면 편하게 질문 부탁 드립니다. 🙂
- 0
- 2
- 55