분류 전체보기 504

[Unity][개념] 잡 시스템(Job System)_2

https://docs.unity3d.com/kr/current/Manual/JobSystem.html C# 잡 시스템 개요 C# 잡 시스템의 동작 방식 Unity C# 잡 시스템을 통해 사용자는 나머지 Unity 기능과 잘 연동하고 수정 코드 작성을 용이하게 해주는 멀티스레드 코드를 작성할 수 있습니다. 멀티스레드 코드를 작성하면 성능이 향상되는 이점을 누릴 수 있으며, 프레임 속도도 대폭 개선됩니다. 버스트 컴파일러를 C# 잡과 함께 사용하면 코드 생성 품질이 개선되며, 모바일 디바이스의 배터리 소모량도 크게 감소합니다. C# 잡 시스템의 핵심은 Unity의 내부 기능(Unity의 네이티브 잡 시스템)과 통합된다는 점입니다. 사용자가 작성한 코드와 Unity는 동일한 워커 스레드를 공유합니다. 이러한..

Unity 2022.09.20

[Unity][개념] 잡 시스템(Job System)

개념 유니티에서 안전한 멀티스레딩을 구현하는 시스템 스레드를 별도로 생성하지 않으며, 유니티의 워커스레드에 작업을 지시할 수 있게 한다. 잡 대기열에 잡을 배치하면 워커 스레드가 잡 대기열에서 항목을 가져와 실행한다. Native Container를 이용해 잡의 수행 결과를 메인 스레드와 공유한다. 버스트 컴파일러를 이용하여 추가적인 성능 향상을 기대할 수 있다. 장점 다수의 작은 작업들을 처리하기에 좋으며, 속도가 빠르다. 스레드를 추가로 만들고 관리하지 않아도 되므로 메모리를 절약할 수 있다. 유니티 콘솔을 이용해 디버깅할 수 있다. 메인 스레드의 데이터를 잡의 스택에 깊은 복사를 하여 복사본으로 사용하므로 Race Condition이 발생하지 않는다. 단점 워커 스레드를 이용하기 때문에 일반 스레드..

Unity 2022.09.20

[Unity][방법] 멀티스레드에서 unity 오브젝트 참조 방법

유니티엔진에서는 기본적으로 모든 CPU 연산이 메인 스레드에서 이루어진다. 그렇다고 다중 스레드를 사용할 수 없다는 것은 아니지만 메인 스레드가 아닌 다른 스레드에서 유니티의 메인 로직에 접근할 수 없도록 막혀있다. 다시 말해, 다른 스레드에서는 게임오브젝트, 컴포넌트 등에 접근하면 에러가 발생한다. 다른 스레드에서 유니티 메인 로직에 접근해야 한다면 MainThreadDispatcher 등을 사용하여 private async void TaskTest() { await Task.Run(() => { MainThreadDispatcher.Instance.Enqueue(() => transform.Translate(1f, 0f, 0f)); }); } 이렇게 작성하면 된다.

Unity 2022.09.20

[Unity][개념] 렉트 트랜스폼(Rect Transform)

렉트 트랜스폼(Rect Transform) 렉트 트랜스폼은 UI에서 사용되는 Transform입니다. 렉트 트랜스폼에는 Width, Height, Anchors, Pivot의 속성을 가지고 있습니다. Width : UI의 넓이를 나타냅니다. Height : UI의 폭을 나타냅니다. 앵커(Anchors) 앵커는 씬뷰에서 네게의 삼각형 손잡이 모습으로 표시되며, 부모로부터의 기준을 나타냅니다. 스크린이 리사이징(Resizing)될 때 앵커를 기준으로 UI의 위치, 크기가 변경됩니다. 앵커의 x, y는 0 ~ 1 사이의 비율 값으로 설정됩니다. 앵커의 x값은 0일때 부모의 가장 좌측, 1일때 부모의 가장 우측으로 설정됩니다. 앵커의 y값은 0일때 부모의 가장 하단, 1일때 부모의 가장 상단으로 설정됩니다. 다..

Unity 2022.09.19

[Unity][개념] 캔버스(Canvas)

목차 캔버스 특징 Canvas Renderer Mode Canvas Scaler UI Scale Mode Reference Pixels Per Unit Graphic Raycaster Rect Transform 앵커 피벗 포지션 Rect-Transform 앵커의 Min, Max 1. Min = Max인 경우 2. Min != Max 인 경우 3. X, Y 중 하나는 Min != Max 인 경우 앵커 프리셋 유니티 공식 매뉴얼 https://docs.unity3d.com/kr/current/Manual/UnityManual.html Scripting Overview http://www.devkorea.co.kr/reference/Documentation/ScriptReference/index.html 캔버..

Unity 2022.09.19

[Unity][개념] 오브젝트 찾는 방법 및 Find vs FindChild 차이점

[ 대표적인 함수 ] 1. Object를 찾는 방법(전체) - 비활성화된 Object는 못 찾음! 1 2 3 4 5 GameObject.Find("이름"); // Object의 이름으로 찾음. 가장 처음에 나오는 Object를 반환. GameObject.FindWithTag("..."); // 태그로 대상을 찾음. 가장 처음에 나오는 Object를 반환. GameObject.FindGameObjectsWithTag("..."); // 태그로 대상을 찾음. 같은 태그를 가진 Objects를 배열의 형태로 반환. 2. Object를 찾는 방법(자식) - 비활성화 된 Object를 찾을 수 있음! 1 2 3 transform.Find("..."); // Object의 이름을 찾음. 가장 처음에 나오는 Obje..

Unity 2022.09.16

[C#] 리플렉션 개념 및 주의사항(Reflection)

리플렉션은 컴파일 시에 알 수 없었던 타입이나 멤버들을 찾아내고 사용할 수 있게 해주는 메커니즘이다. 그러나 다음의 주요한 단점이 존재한다. 리플렉션을 사용하면 컴파일 시에 타입 안정성을 해친다. 리플렉션은 전반적으로 느리다. 어셈블리에서 정의하는 메타데이터를 살필 때 항상 문자열 검색이 수행되어야 한다. 리플렉션을 이용하여 멤버를 호출하면 성능에 좋지 않은 영향을 미친다. 따라서 먼저 매개변수들을 배열로 포장해야 한다. 내부적으로는 이렇게 포장된 내용을 다시 꺼내어 스레드의 스택에 옮긴다. 추가적으로 CLR이 메서드 호출 전에 각각의 매개변수들이 올바른 타입을 가지고 있는지 확인하고 호출자가 호출하려는 멤버에 접근할 보한 권한이 있는지 확인해야 한다. 상기의 이유로, 타입의 필드나 메서드 혹은 속성에 ..

VisualStudio/C# 2022.09.15

[C#] 리플렉션 개념 및 사용법(Reflection)

리플렉션(Reflection)은 어떤 Type에 대한 정보를 가져오거나 접근하는 등의 작업을 런타임에 동적으로 수행할 수 있도록 해주는 기능이다. 리플렉션을 사용하면 런타임에서 메서드를 호출하거나 필드의 값을 바꾸는 등의 작업을 할 수 있다. 실제로 어셈블리는 미리 생성된 스크립트를 기준으로 생성이 되며, 어셈블리가 동작할 때 메서드가 호출되거나 필드의 값을 변경하는 행위는 모두 프로그래머가 어셈블리를 빌드하기 전에 스크립트에 정의해놓은 일련의 작업일 뿐이다. 예를 들어 클래스 A에 존재하는 a, b, c라는 세 개의 필드에 사용자로부터 값을 입력받아 지정하고자 한다면 프로그래머는 클래스 A의 구성 요소에 대해 알고 있고, 수행해야 할 동작들에 대해서도 이미 정의되어 있기 때문에 아래와 같이 코드를 작성..

VisualStudio/C# 2022.09.14

[Unity][개념] UniTask VS Task

https://github.com/Cysharp/UniTask GitHub - Cysharp/UniTask: Provides an efficient allocation free async/await integration for Unity. Provides an efficient allocation free async/await integration for Unity. - GitHub - Cysharp/UniTask: Provides an efficient allocation free async/await integration for Unity. github.com 왜 UniTask를 사용해야 할까요? 최근 UniTask를 사용하게 된 가장 큰 이유는 최근에 프로젝트에 비동기(스럽게) 관리하고 싶은 코드들..

Unity 2022.09.14