목록GameEngine/Unity (11)
흔한 덕후의 잡동사니
멀티스레딩 환경에서 Unity 객체를 안전하게 다루는 방법 정리Unity에서 네트워크를 사용하다 보면, 자연스럽게 비동기 처리나 멀티스레딩을 활용하게 된다. 하지만 Unity의 엔진 구조상, 메인 스레드가 아닌 곳에서 Unity API를 호출하면 문제가 발생한다. 특히 Transform이나 GameObject와 같은 객체를 백그라운드 스레드에서 직접 조작하는 것은 매우 위험하다. 이 글에서는 Unity에서 네트워크 데이터를 송수신할 때 발생할 수 있는 스레드 문제와, 이를 해결하기 위한 잡 큐(Job Queue) 구조에 대해 설명하려한다. 1. Unity 객체는 메인 스레드에서만 접근 가능하다Unity의 대부분의 API는 메인 스레드에서만 호출 가능하다. 특히 다음과 같은 Unity 엔진 객체들은 다른..

유니티에서 UI를 제작할 때 레이아웃 그룹(Layout Group)과 이미지(Image) 설정을 활용하면 더욱 효율적으로 인터페이스를 구성할 수 있다. 이번 글에서는 Vertical Layout Group, Horizontal Layout Group, Grid Layout Group을 비롯해 Image Type 설정을 이용한 게이지 아이콘 제작 방법을 소개하고자 한다. 1. Layout Group을 활용한 UI 정렬유니티에서 UI 요소를 정렬하는 대표적인 방법으로 Layout Group이 있다. Layout Group을 적용하면 자식 오브젝트들의 위치와 크기를 자동으로 정렬해 준다. [ 1.1 Vertical Layout Group (세로 정렬) ]Vertical Layout Group을 사용하면 자식 ..

1. Trigger란?Trigger는 Collider 컴포넌트의 속성 중 하나로, Is Trigger 옵션을 활성화하면 해당 Collider는 물리적인 충돌을 일으키지 않는다. 대신, 다른 Collider와 겹치는지 여부만 감지한다. Trigger로 설정된 Collider는 물리 엔진에 의해 이동하거나 밀려나지 않는다. 이 기능은 주로 물리적 충돌이 필요 없는 상황에서 오브젝트 간의 상호작용을 감지할 때 유용하다. 주로 게임 내에서 특정 영역에 진입하거나 아이템을 획득하는 등의 이벤트를 구현할 때 사용된다. 2. Trigger 사용 방법 Trigger의 사용 방법은 3단계로 나누어 볼 수 있다. 1. Collider 추가Trigger로 사용할 오브젝트에 Collider 컴포넌트를 추가한다. Collid..

이 글은 Unity API에 대한 설명을 기반으로 따로 찾은 내용과 함께 정리한 내용이다. 보다 자세한 내용을 보고 싶다면 글 아래 참조 쪽에 공식 API 사이트 링크를 참고하자. Raycast란?Raycast는 3D 공간에서 특정 방향으로 광선(Ray)을 쏘아 충돌을 감지하는 기능이다. 주로 오브젝트 간의 충돌 감지, 시야 확인, 마우스 포인터로 오브젝트 선택 등에 사용된다. 1. Raycast 사용 방법1.1 좌표, 방향, 거리를 사용하는 Raycast Raycast는 특정 시작점(origin)에서 특정 방향(direction)으로 광선을 쏘아, 지정된 거리(maxDistance) 내에서 충돌을 감지한다. 이때 Physics.Raycast 함수를 사용한다.using UnityEngine;public..

1. IL2CPP란? IL2CPP(Intermediate Language To C++)는 유니티에서 C#으로 작성된 코드를 IL(Intermediate Language)로 변환한 후 C++ 코드로 변환하여 네이티브 바이너리를 생성하는 스크립팅 백엔드다. 이를 통해 실행 성능을 높이고 보안을 강화할 수 있다. 기존 Mono 방식에서는 C# 코드를 IL로 전환하고 실행하는 반면, IL2CPP는 IL에서 추가적인 변환 과정을 거쳐 만들어진 네이티브 코드로 실행된다. Unity의 내부는 C++로 작성되어 있으며, 개발자는 C#을 사용하여 API에 접근한다. IL2CPP를 사용하면 C# 코드도 C++로 변환되므로, 전체적인 성능이 향상된다.또한 C#은 메모리 관리 및 쓰레드 관리가 자동화되어 있어 생산성이 높지만..
1. C#의 objectC#에서의 object는 모든 데이터 타입의 최상위 클래스이다. object로 선언된 객체는 .NET의 기본 가비지 컬렉션(GC) 시스템에 의해 관리되며 객체가 더 이상 참조되지 않으면 GC가 자동으로 메모리를 해제한다. 이 과정은 C#의 기본적인 메모리 관리 방식으로, 메모리 관리를 프로그래머가 직접 할 필요가 없다. 하지만 가비지 컬렉션은 일정한 간격으로 실행되므로, 이 시점에서의 성능 저하가 발생할 수 있다. + 성능 저하가 일어나는 이유와 발생 주기 및 조건에 대해선 다음에 GC에 대해서 정리하면서 설명할 예정이다. 아래는 이를 간단하게 설명한 것이다.더보기미리 간단하게 설명하자면, 2가지 이유로 성능 저하가 일어난다. 첫째, GC는 3세대(0, 1, 2 세대)로 관리되는데..
1. 회전 방법: 오일러각 vs 쿼터니언회전의 경우 오일러각이라 불리는 x, y, z 축을 가지고 객체를 회전시키게 되는데, 행렬을 사용해 카메라를 조작하다보면 축이 겹치는 상황에서 객체의 회전이 180도 돌아버리는 상황이 나온다. 이를 짐벌락이라 한다. 짐벌락은 오일러 각에서 발생하는 회전 순서에 의해 발생하는 문제이다. 즉, 오일러 각은 회전 순서가 고정되어 있기 때문에, 예를 들어 첫 번째 축으로 회전한 후 두 번째 축을 회전시키면, 첫 번째 축의 회전이 두 번째 축에 영향을 미쳐서 비정상적인 회전 결과가 나오는 것이다. 이때 두 축이 평행해져서 더 이상 회전이 제대로 이루어지지 않으며, 이 상태를 짐벌락이라고 한다. 이 문제를 해결하기 위해 쿼터니언을 사용한다. 쿼터니언은 짐벌락 현상을 피할 수..
설명TransformDirection은 로컬 좌표계의 방향 벡터를 월드 좌표계 방향 벡터로 변환하는 함수이다. 예를 들어, 월드 좌표에서 오른쪽(1,0,0) 방향으로 이동하려는 플레이어가 있다고 하자. 하지만 Y축을 기준으로 90도 회전된 상태이상이 걸렸다고 가정하면 로컬 기준에서는 여전히 오른쪽이지만, 월드 좌표에서는 (0,0,-1) 방향으로 이동하게 된다.쓰는 이유DirectX 등에서 월드 행렬과 로컬 행렬을 따로 관리하는 방식을 생각해 보면 이해하기 쉽다. TransformDirection(로컬 방향 벡터) → [로컬 회전 행렬] × [월드 회전 행렬] 연산을 수행하여 변환된 방향 벡터를 반환한다. 이를 통해 회전 중인 객체라도 자연스럽게 방향을 계산할 수 있다. 추가 정보1. TransformD..