본문 바로가기

Unity

Unity: ShaderLab 패키지 요구사항 정의 (PackageRequirements) 2021.2 알파버전이 한창 개발되고있습니다. SRP 역시 버전을 바꿔가며 거듭 진화하고 있는데, API 이름이라 지원하는 키워드 등 버전별로 사용가능한 부분이 상이해 섣불리 기존 프로젝트에 적용하기엔 부담스럽습니다. 에셋 개발자들 역시 SRP 버전업에 따라 키워드를 바꿔주거나 추가해주어야하고 유지보수가 쉽지 않습니다. Shader "MyShader" { SubShader { Pass { PackageRequirements { "com.unity.render-pipelines.universal":"[10.0,10.5.3]" } ... } Pass { PackageRequirements { "com.unity.render-pipelines.universal":"[11.0,11.2.4]" "com.my.ot.. 더보기
Unity: Workflow. Text 추가 효과 적용 - Deformer uGUI와 TextMeshPro 모두에서 사용가능한 Text 컴포넌트 애니메이터를 만드려고 uGUI 코드와 TMPro 코드를 읽어보던 중 BaseMeshEffect 컴포넌트를 이용한 효과 주입이 가능함을 발견했습니다. uGUI 패키지에 포함되어있는 Outline, Shadow 컴포넌트인데요. BaseMeshEffect를 이용해 추가적인 효과를 더해주는 기능을 제공합니다. 이를 참고해서 Mesh 버텍스를 랜덤하게 이동시켜 글자가 꿈틀거리는 효과를 만들었습니다. 기능 구현을 확인했고, 다른 이펙트와 겹쳐 사용이 가능한지 확인도 했습니다. 단순히 생성된 메쉬의 버텍스 위치만 옮겨주는 거다보니 크게 문제는 없을거라 생각했습니다. 그림자(Shadow)와 외곽선(Outline)효과도 문제없이 함께 적용됩니다. 프로.. 더보기
Unity: Workflow. ListPool<T> 리스트 풀 유니티 uGUI 코드를 살펴보다가 ListPool을 사용하는 부분을 발견했습니다. 주로 Mesh가 업데이트 되어야 할 때마다 버텍스를 관리해줄 때 리스트가 사용됩니다. 매번 리스트를 만들고 사용하면 그 동작이 얼마나 자주 진행되는지에 따라 메모리 누수로 인한 CPU Spike가 발생할 수 있습니다. 이를 방지하기 위해 uGUI 코드에서 internal로 사용되던 자료구조입니다. 구현은 위와 같이 되어있으며 2021.1 버전부터 public 으로 사용할 수 있게 접근제한이 풀렸습니다. uGUI의 Text 컴포넌트에서 사용되는 VertexHelper 클래스는 이를 리스트풀을 이용해 구현했습니다. 조심해야 할 점은 Release를 제대로 시켜주지 않으면 되려 메모리에 악영향을 줄 수 있다는 것입니다. 명시적으.. 더보기
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) 스크립터블 렌더 파이프라인이 도입되면서 유니티에서도 노드 기반 셰이더 에디팅이 가능해졌습니다. 프리뷰 태그는 뗀지 시간이 꽤 지났지만 셰이더랩 문법을 이용해 작성하던 것에 익숙해진 개발자들은 여전히 불편함을 토로하고 있습니다. 제대로 정립되지 않은 규칙들과 느린 개발 속도로 요구되는 기능들이 제때 들어오고 있지 않아 포럼은 말 그대로 불이 난 상태입니다. 셰이더 그래프를 활용해서 작업을 해보려고 이래저래 만져보고 있는데, 단축키 바인딩도 없고 이건 뭐... 쓰라고 만든건지 의심이 될 정도로 기능이 빈약합니다. 언리얼에서 머티리얼 작업하던 방식이 생각나 키보드를 이용해 단축키를 추가하는 확장을 개발해보려고 검색하던 찰나, 비슷한 문제로 포럼에 올라온 글을 발견합니다. 대략적으로, 언리얼 머티리얼 에디터에 .. 더보기