프로그래밍 39

구조체의 new

구조체에서 new 의 역할메모리 초기화구조체는 값 타입이기 때문에, 선언 시 이미 스택(Stack)에 메모리가 할당됩니다.new는 이 스택 메모리에 있는 멤버 변수를 초기화하는 역할만 합니다. 힙 메모리와 무관new는 구조체의 경우 힙(Heap)에 새로운 객체를 생성하지 않습니다.클래스와 달리, 스택 메모리에서 동작합니다.  따라서 class 의 new 와 헤깔리지 말아야 합니다.  예를 들면 ... struct Point {     public int X;     public int Y; } class Program {     static void Main()     {         Point p;          // p.X = 10;  // 멤버 변수를 수동으로 초기화하지 않으면 오류 발생    ..

프로그래밍/C# 2024.11.29

FindWithTag() 와 FindGameObjectsWithTag()

FindWithTag()와 FindGameObjectsWithTag()는 모두 Unity에서 특정 **태그(tag)**를 가진 오브젝트를 찾는 함수들이지만, 둘 사이에는 중요한 차이점이 있습니다. 1. FindWithTag()역할특정 태그를 가진 첫 번째 게임 오브젝트를 찾습니다. 반환 값단일 게임 오브젝트 (GameObject) 사용 예시이 함수는 씬에서 "Player" 태그를 가진 첫 번째 오브젝트를 찾고, 그 오브젝트를 반환합니다. 만약 태그를 가진 오브젝트가 없으면 null을 반환합니다. 이 함수는 단 하나의 오브젝트만 찾을 때 유용합니다.GameObject player = GameObject.FindWithTag("Player"); 2. FindGameObjectsWithTag()역할특정 태그를..

유니티에서 특정 오브젝트 찾기 #03 : 성능 최적화

FindObjectsOfType()를 사용하면, 이미 씬에 존재하는 모든 게임 오브젝트를 한 번에 다 가져오는 것이기 때문에, 결국 성능 최적화 측면에서 비효율적입니다.즉, 모든 오브젝트를 메모리에 로드한 후에 다시 필터링을 하는 방식이므로, 성능 최적화는 이미 깨진 상태라고 할 수 있습니다. 문제점FindObjectsOfType()는 씬에 있는 모든 게임 오브젝트를 메모리로 로드하고 나서, 그 중에서 조건을 확인하는 방식이기 때문에, 불필요한 오브젝트들도 로드됩니다.이런 방식은 특히 씬에 오브젝트가 많을 때 성능에 큰 영향을 미칠 수 있습니다. 최적화가 깨지지 않는 대안레이어를 기준으로 성능을 최적화하려면, 모든 오브젝트를 일일이 로드하지 않고, 처음부터 필터링된 오브젝트들만 검색하는 방식으로 전환해야..

유니티에서 특정 오브젝트 찾기 #02 : 성능 최적화

이름이나 태그로 먼저 필터링한 다음에 특정 컴포넌트를 찾는 것은 1차적으로 오브젝트의 범위를 줄이는 필터링 과정이기 때문에, 모든 오브젝트를 한꺼번에 검사하는 것보다 훨씬 더 효율적입니다. 왜 1차 필터링이 빠를까?씬에 있는 모든 오브젝트를 순회하면서 컴포넌트를 찾으려면, 각 오브젝트마다 컴포넌트 목록을 일일이 확인해야 합니다. 이것은 씬의 오브젝트 수가 많을수록 성능에 큰 영향을 줄 수 있습니다.하지만 먼저 이름이나 태그 같은 간단한 조건을 통해 1차적으로 오브젝트 범위를 좁히면, 그다음에는 선택된 오브젝트들에 대해서만 컴포넌트를 확인하면 됩니다.이 과정에서 불필요한 오브젝트는 처음부터 제외되므로 성능이 향상됩니다. 만약 특정 태그를 가진 오브젝트에서만 특정 컴포넌트를 찾고 싶다면, 태그로 먼저 오브젝..

유니티에서 특정 오브젝트 찾기 #01 : 성능 최적화

만약 특정한 오브젝트를 찾기 위해 Unity에서 씬 상의 모든 오브젝트를 확인하려고 한다면, 모든 오브젝트를 순회하며 검사해야 합니다.Unity에는 씬에 존재하는 오브젝트를 순회하고 특정 조건에 맞는 오브젝트를 찾는 방법이 여러 가지가 있지만, 기본적으로는 모든 오브젝트를 확인하는 과정이 필요합니다. 오브젝트를 찾는 방법1. FindObjectsOfType() 사용Unity에서 특정 타입의 컴포넌트를 가진 오브젝트를 찾고 싶다면 FindObjectsOfType() 메서드를 사용할 수 있습니다.이 메서드는 씬에 있는 모든 오브젝트를 순회하며, 해당 타입의 컴포넌트를 가지고 있는 오브젝트들을 찾아 반환합니다. GameObject[] allEnemies = FindObjectsOfType().Where(obj..

유니티에서 Layer 의 역할 : 성능 최적화

Unity에서 레이어를 설정하고 사용할 때는 모든 오브젝트를 검사하는 것이 아니라, 설정된 레이어에 속한 오브젝트들만 검사를 하게 됩니다.이것은 주로 성능 최적화와 특정 오브젝트만 대상으로 작업을 수행하기 위해 사용됩니다. 레이어 설정의 역할Unity에서 **레이어(Layer)**는 게임 오브젝트를 그룹화하는 방식으로, 주로 다음과 같은 상황에서 사용됩니다 * 충돌 검사 (Collision Detection)* 레이캐스트 (Raycasting)* 렌더링 처리 (Rendering) Raycast에서 레이어 사용만약 레이어를 사용하지 않는다면, Unity는 레이캐스트나 충돌 검사를 수행할 때 모든 게임 오브젝트를 검사합니다.하지만 특정 레이어만 대상으로 검사하고 싶을 때, **레이어 마스크(Layer Mas..

유니티에서 컴포넌트가 자동으로 선택되는 원리

Unity는 Inspector 창에서 특정 컴포넌트 타입의 변수를 정의했을 때, 해당 게임 오브젝트가 여러 컴포넌트를 가지고 있어도, 지정된 타입에 맞는 컴포넌트만 자동으로 선택해서 할당합니다.이 원칙은 모든 컴포넌트에 동일하게 적용되며, Unity가 오브젝트를 관리하는 방식에서 비롯됩니다.  Transform 컴포넌트의 경우모든 게임 오브젝트는 기본적으로 Transform 컴포넌트를 가지고 있습니다.Transform은 오브젝트의 위치, 회전, 크기를 관리하는 컴포넌트로, 이 컴포넌트가 없는 오브젝트는 존재할 수 없습니다. 만약 당신이 스크립트에서 Transform 타입의 변수를 선언했다면, 이 변수는 Inspector 창에서 게임 오브젝트를 드래그해 넣을 때 오브젝트에 포함된 다른 컴포넌트는 무시하고,..

Action 의 다양한 형태들

Action은 .NET에서 제공하는 대리자 타입 중 하나로, 매개 변수가 없고 반환값도 없는 메소드를 참조할 수 있습니다. 하지만, 매개 변수를 받을 수 있는 여러 가지 형태의 Action 대리자 타입도 존재합니다.  매개 변수가 없는 Action기본적인 Action은 매개 변수가 없는 메소드를 참조하는 대리자입니다. Action myAction = () => Console.WriteLine("매개 변수가 없는 Action");myAction();  // 출력: 매개 변수가 없는 Action 여기서 Action은 매개 변수를 받지 않는 함수(즉, 파라미터가 없는 함수)를 참조합니다.이 함수는 실행할 때 아무런 인자도 필요하지 않습니다. 매개 변수를 받을 수 있는 Action매개 변수를 받을 수 있는 Ac..

프로그래밍/C# 2024.10.19

클로저와 람다 표현식

클로저(Closure)람다 표현식에서 ()는 람다 식 자체가 매개 변수를 받지 않는다는 의미일 뿐, 람다 내부에서 사용하는 변수들이 반드시 람다 표현식의 매개 변수로 전달되어야 하는 것은 아닙니다.람다 내부에서는 외부에서 정의된 변수를 그대로 사용할 수 있습니다.이 때, 외부 변수를 캡처하여 사용하는 것을 **클로저(Closure)**라고 부릅니다. 즉, () => zombies.Remove(zombie) 이런 코드가 있다고 가정할 때,()는 람다 표현식 자체에 매개 변수가 없다는 의미입니다.그러나, 람다 표현식 내부에서는 외부의 zombie 변수를 사용하고 있습니다.이 zombie는 이미 람다 표현식 바깥에서 선언된 변수이며, 함수 호출에 필요한 매개 변수로 그대로 사용될 수 있습니다. Zombie z..

프로그래밍/C# 2024.10.19

delegate 표현 방식들

1. Delegate 타입을 사용한 기본적인 대리자(Delegate) 선언기본적으로, 대리자(Delegate)를 선언하고 함수를 대입하는 방식은 다음과 같습니다 delegate void MyDelegate();  // 대리자 선언void MyMethod()  // 대리자로 호출할 함수{    Console.WriteLine("MyMethod 호출됨");}MyDelegate delFunc = MyMethod;  // 대리자에 함수 대입delFunc();  // 호출: 출력 -> MyMethod 호출됨  여기서 **delegate void MyDelegate();**는 반환값이 없고 매개 변수가 없는 대리자를 선언하는 코드입니다.**MyDelegate delFunc = MyMethod;**는 이 대리자 타입..

프로그래밍/C# 2024.10.19