본문 바로가기

전체 글

Unity: 코드 블록 성능 측정 방법 효율적인 로직을 구현하기 위해 어떤 코드가 더 성능상 유리한지 시간을 재어 보고 싶을 때가 있습니다. 유니티에서는 GameObject.Find나 GetComponent와 같이 매 프레임 반복적으로 호출하지 말 것을 권장하는 코드들이 있죠. 하지만 글이나 얘기로만 들었지 실제로 어느정도로 성능이 좋지 않은지 제대로 측정해보지는 않습니다. 게다가 비슷한 시도를 하더라도 제대로 측정하는 경우는 거의 없습니다. 최근 유니티 한국어 개발자 톡방에서 TryGetComponent와 GetComponent의 성능에 대한 얘기가 나왔는데, 아무도 잘못된 부분을 짚어주지 않아 겸사겸사 코드 블럭 성능 테스트를 위한 코드를 작성하는 부분에 대해 다뤄보겠습니다. 더보기 # 유니티 개발자 톡방 캡쳐 보기 유니티 엔진으로 개발을.. 더보기
Unity: 코드레벨에서 사용중인 렌더 파이프라인 특정하기 1 GraphicsSettings.currentRenderPipeline API를 이용하면 현재 사용중인 렌더링 파이프라인 에셋을 가져올 수 있습니다. 하지만 빌트인 렌더러를 사용하고 있는 경우, URP나 HDRP 패키지를 임포트 하지 않아 스크립트에서 직접적으로 접근할 수는 없습니다. using UnityEngine.Rendering.Universal; if (GraphicsSettings.currentRenderPipeline is UniversalRenderPipelineAsset) { } 이런 코드는 UnityEngine.Rendering.Universal 네임스페이스가 정의되지 않아 컴파일에러를 일으킬 가능성이 있습니다. 대신에 GetType()을 이용해 타입 이름을 가져와 확인하는 방식으로 대체하.. 더보기
Unity: 당신의 에디터가 느려지는 이유 스터디 발표 자료입니다. 시간이 꽤 지나 전체공개로 올려둡니다. 유니티 에디터가 스크립트를 컴파일하고 로드하는 과정, 플레이 모드에 진입하는 과정이 왜 점차 느려지는지에 대한 간략한 정리와 시도해볼 수 있는 해결책입니다. Assembly Definition Asset으로 Assembly를 쪼개어 컴파일 시간을 단축합니다. Enter PlayMode를 사용해 도메인 로딩 시간을 단축합니다. 종속성이 줄어드는 방식의 어셈블리간 코드 레퍼런스로 전체 프로젝트를 설계합니다. 에셋스토어의 플러그인들 중에는 적합하지 않은 것들이 많아 선택적으로 적용해야합니다. drive.google.com/file/d/1jaM7U5EnL2p7B0ItesQYCx1PKsI7vxHe/view?usp=sharing 당신의 에디터가 느려지.. 더보기
Unity: Workflow. 셰이더 그래프에서 단축키 사용하기 (2) 이전 글에서 이어집니다. 셰이더 그래프 패키지를 수정해볼까 싶었는데, 상당히 폐쇄적인 접근제한자로 보호되고 있어 액세스조차 불가했습니다. 이전 글에서 소개드린 포럼의 글의 날짜가 3월~4월 부근이기에 얼마 되지 않은 따끈따끈한 스레드인줄 알았습니다. 그래서 굳이 작업하지 않고 패키지를 수정해서 사용하다보면 금방 업데이트 되겠구나 싶었죠. 그러나 2020년 3~4월에 활발이 대화가 오고가다 2021년 4월이 되어 아직도 단축키 기능이 없다는 불평이 달렸다는걸 뒤늦게 알아챘습니다. 1년동안 전혀 변화가 없다니... 어쩌면 영원히 개발되지 않을지도 모른다는 생각이 들었습니다. 셰이더 그래프 패키지 코드를 수정하지 않고 기능을 집어넣을 방법이 없을까 고민을 해봤습니다. 그 결과 리플렉션을 이용해서 모든 필드에 .. 더보기
Unity: Workflow. 셰이더 그래프에서 단축키 사용하기 (1) 스크립터블 렌더 파이프라인이 도입되면서 유니티에서도 노드 기반 셰이더 에디팅이 가능해졌습니다. 프리뷰 태그는 뗀지 시간이 꽤 지났지만 셰이더랩 문법을 이용해 작성하던 것에 익숙해진 개발자들은 여전히 불편함을 토로하고 있습니다. 제대로 정립되지 않은 규칙들과 느린 개발 속도로 요구되는 기능들이 제때 들어오고 있지 않아 포럼은 말 그대로 불이 난 상태입니다. 셰이더 그래프를 활용해서 작업을 해보려고 이래저래 만져보고 있는데, 단축키 바인딩도 없고 이건 뭐... 쓰라고 만든건지 의심이 될 정도로 기능이 빈약합니다. 언리얼에서 머티리얼 작업하던 방식이 생각나 키보드를 이용해 단축키를 추가하는 확장을 개발해보려고 검색하던 찰나, 비슷한 문제로 포럼에 올라온 글을 발견합니다. 대략적으로, 언리얼 머티리얼 에디터에 .. 더보기
Unity: Workflow. AllocConsole() 감지 프로그래밍을 시작할 때면 콘솔 프로그램부터 시작하는게 대세였던 시절이 있었습니다. 지금은 그런 시대가 아니냐는 질문에는 명확한 답변을 드리기가 쉽지가 않습니다. 아무튼, 콘솔으로 코딩에 입문하는 것 처럼 게임 해킹을 시작하고 작얼 할 때, 그래픽스 렌더러를 후킹해 원하는 대로 조작하기 전에 콘솔을 이용해 로그를 찍고 데이터를 확인하는게 보통입니다. 어렵지 않게 띄울 수 있고, 곧바로 텍스트로 결과를 알 수 있기에 흐름 진행 확인에 꽤 도움이됩니다. AllocConsole을 호출하는 DLL을 하나 생성한 다음 타겟 프로세스에 주입만 해주면 콘솔이 나타나므로 매우 간편합니다. kernel32.dll 라이브러리에 콘솔관련 함수들이 포함되어 있기 때문에, 이를 이용해 간략히 구현했습니다. 유니티 기준으로 작성되.. 더보기
Unity: 빌드 파이프라인 베이직 유니티 에디터로 프로그램(애플리케이션)을 개발하고 사용자에게 제공하기 위해서는 '빌드'라는 과정을 통해 실행 가능한 정돈된 패키지로 만들어야 합니다. '패키징' 등으로 부르기도 합니다. 실행에 필요한 파일들을 모아서 압축하고, 다양한 사용자의 환경에서 일관성있게 실행될 수 있도록 여러 의존성들을 해결하는 작업입니다. 빌드된 유니티 프로그램의 디렉터리를 확인하면 크게 3가지로 구분할 수 있습니다. 유니티 엔진 모듈 사용자 스크립트 아트 리소스 2021년 4월 현재는 2가지의 빌드 방식이 있습니다. 최종 사용자 스크립트를 C++ 문법으로 바꿔주는 IL2CPP와, 닷넷 VM 환경에서 바로 실행시키는 Mono 방식이 있습니다. 두 방식의 빌드 결과물을 조금 상이한 폴더 구조를 가집니다. il2cpp 방식 mon.. 더보기
문제해결: 1. MinHook를 사용시 MinHook.x64.dll을 찾을 수 없을 때 타겟 프로세스에 MinHook를 이용한 모듈을 주입할 때 초기화 과정에서 MinHook.x64.dll을 찾을 수 없다는 예외가 발생하는 경우가 있습니다. 큰 문제는 아니고, 타겟 프로세스의 메인 모듈이 위치한 디렉터리에 MinHook.x64.dll을 위치시켜주면 스스로 로드됩니다. 참고 : TsudaKageyu/minhook: The Minimalistic x86/x64 API Hooking Library for Windows (github.com) 더보기