728x90

코딩 29

[Unity] 유니티 셰이더 베리언트 최적화 & 문제 해결 팁 Unity Shader Variants Optimization & Troubleshooting Tips

유니티 엔진에서 셰이더를 빌드할 때, 셰이더 베리언트가 다량으로 생성되면서 빌드 시간, 빌드 용량, 런타임 메모리 등 다양한 자원 낭비가 발생할 수 있습니다. 이런 낭비를 줄이고 최적화 하기 위해 알아 두어야 할 유니티 엔진의 셰이더 베리언트(Shader Variant) 최적화 관련 문서를 스크랩 합니다. 아래 문서는 2018년 5월 14일에 작성된 문서로, 시간이 좀 지나긴 했지만, 유니티 셰이더 베리언트가 생성되는 공식 등을 상세히 다룹니다.이런.기계 번역이지만, 한글 문서도 제공하고 있기 때문에 참고하기 좋습니다. Stripping scriptable shader variantshttps://unity.com/blog/engine-platform/stripping-scriptable-shader-v..

[Unity C#] Editor 에서 버튼 스타일 토글 UI 만들기

체크박스 형태의 토글이 기본형이지만, 종종 버튼 스타일로 여러 개 버튼을 열거하고 하나의 버튼만 선택된 상태로 만들어야 할 때가 있습니다. 아래 정렬 스타일 버튼처럼. GUILayout.Toggle() 함수를 활용하면 되는데, 적절한 메소드와 스타일을 넘겨줘야 합니다. 아래 두 가지 스타일의 코드 스니펫으로 활용할 수 있습니다.Style A 는 문자열 상수로 GUIStyle 을 인자로 전달하고,Style B 는 GUIStyle 을 명시적으로 생성해서 전달합니다.// Style Afor (int i = 0; i  이렇게 작성하면 체크박스처럼 동작하는 단일 선택 옵션 버튼을 생성할 수 있습니다. https://docs.unity3d.com/6000.0/Documentation/ScriptReference/G..

[Unity C#] 파일 경로 분리와 경로 구분자 변환: 두 가지 접근법 비교

Unity에서 파일 경로를 다룰 때, 디렉토리 경로와 파일명을 분리하거나, 경로 구분자(\, /)를 통일해야 하는 상황이 자주 발생합니다.이번 포스트에서는 경로를 효율적으로 처리하는 두 가지 방법, System.IO.Path를 활용한 방식과 string.Substring을 활용한 방식을 비교하고, Unity 환경에 맞게 경로 구분자를 통일하는 팁을 함께 소개합니다.파일 경로 분리가 필요한 이유게임 개발에서는 파일 경로를 다루는 일이 필수적입니다. 아래와 같은 작업에서 디렉토리와 파일명을 분리해야 하는 경우가 자주 있습니다:특정 파일만 선택적으로 불러오기파일명을 기준으로 데이터를 처리하기경로에 특정 디렉토리를 추가하거나 변경하기파일 경로 분리 방법: 두 가지 접근법파일 경로를 처리하는 방법은 크게 두 가지..

[Unity] C# Finalizer 와 Garbage Collector 동작에 대한 정리

C++의 소멸자(Destructor)와 C#의 Finalizer의 공통점과 차이점 공통점 문법적으로 ~Class() {...} 로 코딩 클래스 객체가 소멸될 때 리소스를 해제하기 위해 사용 차이점 C++ 의 소멸자는 delete myObj; 와 같이 명시적으로 호출 시기를 정할 수 있음. C# 의 소멸자는 C++와 구분하기 위해 Destructor대신 Finalizer로 부름. Finalizer는 개발자가 그 호출을 명시적으로 결정할 수 없고, Garbage Collection 메커니즘에서 호출. 좀 더 구체적으로, C# 클래스에 Finalizer 가 존재하면, 해당 객체의 생성자 호출시 Finalization Queue라는 QC 내부 큐에 레퍼런스 추가. 이후, Managed Heap이 차서 GC처리를..

파이썬(Python) - 폴더 아래 소스코드 인코딩 일괄 변환 스크립트

유니티 엔진으로 개발하던 프로젝트의 소스코드가 어째서인지 어느 순간 인코딩이 바뀌어 버렸습니다. 원인은 알 수가 없는 상황. 코드는 모두 utf-8 인코딩으로 관리하고 있었는데, 갑자기 인코딩이 변경되고 코드 내에 한글이 모두 깨져있는 상황. 그래서, 일단 파이썬으로 소스코드 전체 일관 인코딩을 변경해주는 코드를 짜서 돌렸습니다. 아래는 원본 소스. 폴더 이름과 소스코드 확장자, 인코딩을 적절히 수정해서 돌리면 됩니다. 그리고 chardet 모듈을 사용하기 때문에 pip install chardet 커맨드로 chardet 모듈을 설치해야 합니다. import os import codecs import chardet # 현재 경로 아래의 scripts 폴더 내 파일들의 인코딩을 변경합니다. director..

[Unity] Unity Engine 버전업 후 에러 메시지 Error : "The type or namespace name 'Newtonsoft' could not be found"

Newtonsoft.Json.JsonConvert 를 사용하고 있었는데, 유니티 엔진(Unity Engine)버전업 후 아래와 같은 에러 메시지가 출력될 경우. "The type or namespace name 'Newtonsoft' could not be found ~ " Newtonsoft 모듈 종속성 설정이 추가되지 않았기 때문. 엔진 버전업 하면서 모듈 설정이 날아가는 모양. Packages/manifest.json 을 열어서 "dependencies" 아래에 모듈 정보를 추가해주면 됨. "com.unity.nuget.newtonsoft-json": "3.0.2" 이렇게. 저장하고 유니티 엔진 리프래쉬 한 번 해주면 끝. GitHub : Newtonsoft Json for Unity https:/..

DirectX 11 스터디 - 고유 물체를 정의할 GameObject 만들기

여기까지 개발한 렌더링 처리 객체인 Pipeline, 그리고 물체마다 고유한 값을 가질 수 있는 객체들을 모아서 GameObject 를 만들어본다. 방향성은, 유니티 엔진의 GameObject 스타일로 만들고, Transform 처리는 컴포넌트 형태로 만들어 붙여보는 순서로 진행. 한번에 몰아서 구현하던 Game 클래스에서, 물체마다 고유한 값을 가져야 하는 객체들을 모두 GameObject 로 옮겨서 구현. class GameObject { public: GameObject(ComPtr device, ComPtr deviceContext); ~GameObject() {} void Update(); void Render(shared_ptr pipeline); private: ComPtr _device; ..

DirectX 11 스터디 - 모듈화 (2), 렌더링을 책임질 Pipeline클래스 작성

앞에서 Geometry, VertexData 부터 Output Merger 의 BlendState까지 모두 모듈화 해서 DX COM객체를 캡슐화 했고, 이번엔 모듈화한 객체들을 가지고 Rendering Pipeline 을 실제 수행하는 객체를 작성해본다. 파이프라인에서 고유하게 존재하고 사용되어야 하는 모듈들과, 3D 물체마다 값/설정이 변경되어야 하는 모듈을 구분한다. 3D 물체마다 설정이 변경되어야 하는 객체들을 별도로 그룹화 해서 PipelineInfo 구조체로 묶어준다. 렌더링 파이프라인에 이 구조체를 기준으로 설정을 바꿔서 태워주면 새로운 물체를 그릴 수 있게 됨. PipelineInfo 는 아래 구성 요소가 포함됨. 여기서 ConstantBuffer는 3D 메시마다 필요할 수도, 필요하지 않을..

소수점 연산 오차 관련 (Epsilon, Approximately, IsNearlyEqual)

컴퓨터는 0과 1, 즉 2진수로 숫자를 처리. 실수의 소수점 숫자를 2진수로 정확히 표현할 수 없는 경우가 있기 때문에(비트가 무한히 반복) 소수점 연산을 할 때에는 미세한 오차가 발생할 수 밖에 없음. 예시를 보면 // C# using System; class Program { static void Main() { float num1 = 0.1f; float num2 = 0.2f; float sum = num1 + num2; Console.WriteLine("Sum: " + sum); } } // C++ #include int main() { float num1 = 0.1f; float num2 = 0.2f; float sum = num1 + num2; std::cout

C# 리플렉션(Reflection) 개념잡기

C#에서 리플렉션(Reflection) 기능은 프로그램이 런타임 중에 동적으로 객체의 타입 정보를 획득해서 접근하고 활용할 수 있는 기능. 리플렉션은 주로 System.Reflection 네임스페이스 내의 기능들을 사용하여 런타임에 타입 정보를 동적으로 검사하거나 조작하는 것. GetType() 메서드는 객체의 런타임 타입을 가져오는 것으로, 이것도 정적인 타입 정보를 가져오는 것이므로 일반적으로는 리플렉션을 사용했다고 보기 어렵. System.Reflection 네임스페이스의 기능을 사용하는 경우에야 리플렉션을 사용한 것으로 간주하며, typeof 연산이나 GetType() 메서드는 해당 범주에 포함되지 않는 것으로 볼 수 있음. 왜 이름이 리플렉션(Reflection)일까? C#의 리플렉션(Refle..

728x90
반응형