[C#] static 초기화 시점과 C# type Initializer
static 변수 초기화 시점`beforefieldInit` 플래그가 설정되어있는지 아닌지에 따라 초기화 시점이 달라지는데, 해당 플래그의 여부는 정적 생성자가 있는지 여부에 따라 달라진다. 정적 생성자는 타입에 접근하는 순간 호출된다. .NET4 이후로는 동작이 더 "lazy"해진 것 같다고 한다. 정적 필드는 일반적인 코드를 사용하여 액세스하는 한 사용하기 전에 초기화된다. 솔직히 정적 필드를 초기화하는 곳에서 특정 동작을 코딩하진 않을 것이다.  Static constructor (정적 생성자)정적 생성자 설명 MSDN 정적 생성자 - C#C#의 정적 생성자는 정적 데이터를 초기화하거나 한 번만 수행되는 작업을 수행하며 첫 번째 인스턴스가 만들어지거나 정적 멤버가 참조되기 전에 실행됩니다.learn..
2024.12.08
[Unity Editor Scripting] EditorStyles null Reference
EditorStyles null Reference문제점Editor를 상속받은 클래스의 OnEnable에서 GUIStyle을 사용하려면 NullReference가 발생한다. 무조건은 아니지만, 다시 리로드되는 타이밍에는 직렬화 되지 않은 데이터는 초기화되므로 무조건 다시 NullReference가 발생하는 것 같다.private void OnEnable(){ Init(); //SOManagers.instance.hexGridGenerator = new HexGridGenerator(_hCGeneration.HexPrefab);}private void Init(){ _mainHeaderStyle = new GUIStyle(EditorStyles.boldLabel) { fon..
2024.12.06
no image
[C#] Delegate, EventHandler 그리고 구조에 대한 고민
Delegate델리게이트는 특정 매개변수와 반환 타입을 가진 메서드에 대한 "참조"를 나타내는 타입이다. 델리게이트를 인스턴스화하면, 호완가능한 시그니처와 반환 타입을 가진 모든 메소드와 연결할 수 있다. 또한 델리게이트의 인스턴스를 통해 메소드를 호출할 수 있다. 개발을 할 때 "메서드 자체를 파라미터로 전달할 수 있을까?" 라는 의문을 해결하는데는 델리게이트가 적격이다. 메서드에 대한 참조를 델리게이트로 래핑한 뒤, 메서드를 다른 메서드의 파라미터로 전달하는데 사용할 수 있다.  델리게이트 타입의 선언그럼 델리게이트 타입은 어떻게 선언할 수 있을까?public delegate void CustomCallback(string s);`접근한정자` `delegate` `반환 형식` `delegate타입 이..
2024.12.06
C#
no image
[Unity] 유니티의 직렬화(serialization)와 재귀 문제 회피
스크립트 직렬화직렬화는 자료 구조(data structure) 또는 게임 오브젝트의 상태를 유니티가 저장할 수 있고 추후 Reconstruct 할 수 있는 포맷으로 자동 변환하는 프로세스이다. 유니티 프로젝트에서 데이터를 구성하는 방식은 데이터를 직렬화 하는 방식에 영향을 미치며, 이는 프로젝트 성능에 큰 영향을 미칠 수 있다. 직렬화 규칙Unity의 Serializer는 런타임에 효율적으로 동작하도록 디자인되었다. 이는 유니티의 직렬화가 다른 프로그래밍 환경의 직렬화와 다르게 동작하기 때문이다. Unity의 직렬화는 프로퍼티가 아닌 C# 클래스의 필드에서 직접 동작하기에 유니티는 특정 조건을 충족할 때만 직렬화를 수행한다. 필드 직렬화를 하는 방법public으로 선언 또는 SerializeField a..
2024.11.09
[Unity] Renderer.materials, Renderer.sharedMaterials
Renderer.SharedMaterial인스펙터에서 보는 매터리얼은 Renderer의 SharedMaterial에 저장되어 있다고 함. sharedMaterial을 수정하면 해당 매터리얼을 사용하는 모든 오브젝트의 모양이 변경되고, 프로젝트에 저장된 매터리얼 설정도 변경된다. sharedMaterial이 반환한 material은 수정하지 않는 것이 좋다. renderer의 material을 수정하려면 그냥 Renderer.material 를 사용하는 것을 추천한다. Unity에서는 Render.material에 접근하는 순간 sharedMaterial의 사본을 만들게 된다. 따라서 sharedMaterial과 독자적으로 동작하는 material의 인스턴스가 생성되고 이는 기존 매터리얼이 아닌 별도의 매..
2024.11.08
no image
[Unity Editor Scripting] Editor관련 함수 정리
EditorWindowScriptableObject를 상속받아 구현된 클래스이며 UnityEditor의 네임스페이스에 속한다. 이 클래스를 사용하여 유니티 에디터의 기본 창과 유사하게 독립적으로 띄울 수있거나 탭에 부착 가능한 Editor window를 만들 수 있다.  다음 다이어그램은 에디터 윈도우의 실행 순서이다.OnEnable: 스크립트가 로드되거나 오브젝트가 활성화될 때 호출된다.EditorApplication.isUpdating: true라면, 에디터는 현재 AssetDatabase를 새로고침 중이다.CreateGUI: 에디터가 업데이트 중이 아니라면 GUI를 생성한다.Update: 프레임당 한 번 호되어 스크립트의 로직을 업데이트 한다.OnGUI: GUI 이벤트를 렌더링하고 핸들링하기 위해 ..
2024.10.25
[Unity] TransformDirection()
TransformDirection()Transform.TransformDirection은 local space의 `direction`을 world space의 direction으로 변환한다. 해당 연산은 scale이나 position에 영향을 받지는 않는다. 반환된 벡터의 길이는 `direction`과 같다.  그러나 해당 공식 문서의 설명만으로는 헷갈리는 감이 있어, 아래에 첨부한 참고자료를 살펴보고, 직접 사용해보며 내린 결론을 정리해서 다음과 같이 부연 설명을 덧붙인다. `TransformDirection()`함수를 사용할 때는 인자로 넘겨준 direction을 로컬 좌표계로 취급하는데, 이는 TransformDirection()을 호출한 gameobject의 로컬 좌표계를 기준으로 잡는다.Vect..
2024.10.09
no image
[C#] 제너릭 메소드
제너릭 메소드제너릭 메소드는 이처럼 형식 매개 변수를 사용하여 선언된 메소드이다.static void Swap(T lhs, ref T rhs){ T temp; temp = lhs; lhs = rhs; rhs = temp;}위처럼 선언을 하지않고, 메소드 이름 옆에 를 제거하면 오류가 발생하는 것을 볼 수 있다. 사실 가 없어도 바로 쓸 수 있을 것이라 생각하였는데, 그렇지 않았다. 형식 인수 int를 사용하여 제너릭 메소드를 사용하는 법static void Swap(ref T lhs, ref T rhs){ T temp; temp = lhs; lhs = rhs; rhs = temp;}static void Main(string[] args){ int a = 1..
2024.10.06
C#
[C#] CS0273에러 accessor must be more restrictive than the property or indexer
CS0273internal class Player{ public int PosX { get; private set; } public int PosY { get; private set; } private Board Board { get; private set; }}이 코드들 중 다음 부분에서 문제가 발생한다.private Board Board { get; private set; }  이것을 에러가 발생하지 않도록 바꾸려면 다음과 같이 만든다:private Board Board { get; set; }setter는 전체 프로퍼티의 접근성(accessibility)이므로 이미 private이다.  기본적으로 프로퍼티의 `get;` 또는 `set;`의 접근 제한자를 지정하려면 다른 경우보다 더 ..
2024.09.25
C#
no image
[수학] Manhattan distance (맨해튼 거리)
Manhattan distance 맨해튼 거리는 그냥 몇 칸을 이동했는지를 의미한다(선분 길의의 합). 유클리디안 거리는 시작점과 끝점이 주어지면 피타고라스 정리를 사용하여 구하게 된다. 맨하탄 거리는 몇 칸을 이동했는지를 보는 것이기에  x와 y각각 몇 칸 이동하였는지 계산하여 총합을 보며 다음의 식과 같다:$$d_1(\mathbf{p}, \mathbf{q}) = \|\mathbf{p} - \mathbf{q}\|_1 = \sum_{i=1}^{n} |p_i - q_i|$$맨해튼 거리: $d_1$벡터: $p, q$$\mathbf{p} = (p_1, p_2, \dots, p_n)$과 $ \mathbf{q} = (q_1, q_2, \dots, q_n)$ 머신러닝에서는 similarity 계산을 위해 사용했었는..
2024.09.21
no image
Blender에서 Unity로 모델 임포트
올바른 세팅값으로 모델 Import하기 블렌더로 육각형을 만들어서 유니티에 import했는데, Rotation값과 Scale값이 생각한 것과 달랐다. Edit → Export → .fbx → 표시된 창에서 Apply Transform적용 다시 유니티로 불러오면 Rotation, Scale값이 동일하게 잘 불러와진다. 참고자료https://lektion-von-erfolglosigkeit.tistory.com/235https://timeboxstory.tistory.com/148
2024.09.10
[유니티 미세 팁] 연산 순서
연산 순서transform.Translate(Vector3.forward * Time.deltaTime * _speed);유니티에서 코드를 작성하다보면, 위의 코드처럼 이동을 작성할 때가 있다. 그러나 이 방식은, 요소값을 3개 가진 Vector3에 대해 deltatTime곱셈을 시도하고, 추가적으로 Speed 상수를 또 연산해놓은 3개의 값에 곱셈을 하기에 총 6번의 연산이 이루어진다. 그러나 deltaTime과 speed를 먼저 계산한다면, 총 4번의 연산 횟수만에 값이 구해진다. 사실 큰 최적화는 아니지만, Rider 사용 시 에러가 신경쓰여 알아보았다.  참고자료https://stackoverflow.com/questions/57933831/unity-rider-order-of-multiplica..
2024.09.04