분류 전체보기 (23) 썸네일형 리스트형 코루틴 여러개가 모두 완료될때까지 대기하는 코드 언제 끝날 지 모르는 코루틴 여러개를 동시에 실행하되, 모든 코루틴이 끝날때까지 기다리는 기능이 필요해서 만들어 보았다. 개념으론 Task.WhenAll과 동일한데, Task와 달리 코루틴 여러개를 기다리는 기능은 유니티가 기본으로 제공해주지 않는다. . WaitForCoroutines WaitForCoroutines. GitHub Gist: instantly share code, notes, and snippets. gist.github.com using System.Collections; using UnityEngine; public class WaitForCoroutines : CustomYieldInstruction { public override bool keepWaiting => _remain.. 유니티에서 async/await를 어떻게 쓰면 좋을까? async/await는 비동기? 병렬? C#의 async/await와 Task는 비동기를 표현한 것일까 병렬실행을 표현한 것일까? 이 점을 헷갈려하는 사람들이 아주 많다. 결론부터 말하면 Task는 비동기 작업을 표현하는 클래스이다. 그러나 병렬로 실행되기도 한다. 이 점 때문에 Task를 쓰면 멀티스레드를 사용하여 병렬 작업이 일어난다고 알고 있는 경우가 많다. 그러나 이것은 단순히 .NET에 포함된 Task의 구현이 스레드 풀을 사용하도록 되어 있어서 그렇기 때문이다. Task는 어디서 실행될까? await SomethiingAsync(); async Task SomethingAsync() { Console.WriteLine(Environment.CurrentManagedThreadId); await.. Singleton 패턴을 써야 할까? 들어가며.. 싱글턴 패턴은 항상 많은 의견이 나오는 주제이다. 디자인 패턴 중 가장 쉬운 패턴인 것도 있고 가장 사용빈도가 높은 패턴 중 하나이기도 하다. 또한 안티패턴이다 vs 하나의 패턴일 뿐이다 로 의견이 많이 갈리는 주제이기도 하다. 이 글에서는 약간 다른 방향으로 접근해보려 한다. 전역변수처럼 쓰이는 싱글턴 싱글턴을 간단하게 정의하면 인스턴스가 한개만 존재해야 하는 상황을 모델링한 것이다. 이걸 C#에서는 생성자를 private으로 숨겨서 직접 생성할 수 없게 하고 대신 정적 인스턴스 프로퍼티를 만들어서 접근하는 식으로 구현하곤 한다. // 흔히 사용하는 제네릭 부모 클래스 형태의 싱글턴 public class Singleton where T : class { private static Sing.. Unity에서의 실제 FSM 구현에 대해 들어가며.. 흔히 게임에서 캐릭터를 조종한다던가 할 일이 있을 때 가장 먼저 배우는 것이 유한 상태 기계, FSM이다. FSM에 대해서는 이미 매우 잘 알려져 있고 양질의 정보도 쉽게 접할 수 있으므로 이 글에서 FSM에 대한 상세한 설명은 생략한다. 하지만 FSM이라는 개념에 너무 매몰되어 생각하는 경우 오버엔지니어링이 잔뜩 된 좋지 못한 코드를 쓰는 경우가 종종 있다. 특히 AI의 구현을 FSM으로 구현하려고 할 경우 그렇게 될 가능성이 큰데, 이 글에선 그에 대해 이야기한다. "게임에서의" FSM과 실제 구현에서의 문제 그런데 사실 컴퓨터과학에서 말하는 FSM과 실제로 게임에서 일반적으로 구현하는 FSM은 약간의 차이가 있다. 컴퓨터과학에서 이야기하는 FSM이 어떤 알고리즘을 수학적으로 표현하는 모.. Unity의 ScriptableObject의 활용법 ScriptableObject 유니티의 공식 문서(https://docs.unity3d.com/kr/current/Manual/class-ScriptableObject.html)에는 스크립터블 오브젝트를 다음과 같이 정의하고 있다. ScriptableObject는 클래스 인스턴스와는 별도로 대량의 데이터를 저장하는 데 사용할 수 있는 데이터 컨테이너입니다. ScriptableObject의 주요 사용 사례 중 하나는 값의 사본이 생성되는 것을 방지하여 프로젝트의 메모리 사용을 줄이는 것입니다. 이는 연결된 MonoBehaviour 스크립트에 변경되지 않는 데이터를 저장하는 프리팹이 있는 프로젝트의 경우 유용합니다. 이리저리 꼬아놨지만, 결론적으로는 어떤 데이터를 에셋 형태로 저장하는 기능이다. 스크립터블 .. Unity의 fake null 문제 유니티 엔진의 구조 UnityEngine.Object를 == null로 비교해서 true가 떨어졌다고 진짜 null인 것은 아니다. 이 문제는 유니티 개발자들에게는 잘 알려져 있는 문제지만, 워낙 직관적이지 않은 문제이기 때문에 유니티를 처음 접하는 사람들은 백이면 백 빠지는 함정이기도 하다. 유니티 코어 레벨의 객체들은 모두 다 C++로 구현되어 있고, C++ 객체로서 존재한다. 유니티 스크립트 상에서 보이는 C# 객체는 C++ 객체를 참조하는 wrapper로 볼 수 있다. 이 C# wrapper 객체는 무조건 생성되는게 아니라, C++ 객체가 C#레벨에서 노출되어야 할 때만 생성되는데, 상황에 따라서는 C++ 객체만 생성되어있고 C# 객체는 생성되어 있지 않을 수도 있다. 하지만 반대로 C++ 객체는.. IEnumerable, IEnumerator를 반환타입으로 가지는 메서드 파고들기 코루틴과 yield의 마법 유니티를 접하면서 코루틴을 처음 써보면 대기하는 것 같아 신기하다. 분명히 코드는 한줄한줄 순서대로 실행되는데 어떻게 yield에서 대기해놓고 다른곳을 실행할 수 있을까? IEnumerator와 yield가 정확히 어떻게 동작하는지는 찾아보면, 대략 MoveNext()를 호출할 때마다 다음 yield를 만날 때까지 실행해서 값을 반환한다는 식으로 이해된다. 약간 더 깊이 파고들면, 프로그래밍 언어에서 함수 호출을 하는 방식을 생각해볼 수 있다. 함수를 호출하면 스택에 반환될 주소와 함수 내부의 지역변수들이 추가된다. 그런데 만약 함수에서 값을 반환해버리면 스택이 없어질테고, 다음에 "중간부터 다시 시작" 할 수는 없을 것 같다. 어떻게 이런 일이 가능한 것일까? IEnumera.. C#의 readonly 키워드와 불변성에 대해 readonly vs const 처음 readonly를 접하면, 자연스럽게 const와 비교하게 된다. 언뜻 보기에는 둘다 변하지 않는 값을 선언하는 문법으로, 큰 차이를 느낄 수 없다. 다른 점을 찾아봐도 주로 const는 컴파일 시간 상수고, readonly는 런타임 상수라는 정도, 혹은 readonly는 생성자에서 값을 변경할 수 있다 라는 정도로 이해하는 경우가 대다수이다. 그러나 이는 완전한 오해이다. const와 readonly는 의미적으로나 실제로나 완전히 다르다. 근본적인 차이점은 const는 상수이고 readonly는 변수라는 것이다. const는 일종의 별명과도 같다. const int a = 1; 이라는 문장이 있을 때, 이 것은 1의 별명을 a로 하겠다는 선언이다. 이는 재정의하거나.. MonoBehaviour의 초기화는 어떻게 해야 하는가? Awake로 충분하지 않나요? MonoBehaviour의 초기화 메소드로는 유니티에서 Awake, Start 등을 지원하고 있다. 일반적으로 초기화는 Awake에서 하게 될 것이다. using UnityEngine; public class Something : MonoBehaviour { private void Awake() { Debug.Log("awake."); } } 잘 동작한다. 그런데 문서에는 강조되지 않는부분이지만, 생성 당시 GameObject가 비활성화 상태일때는 Awake가 호출되지 않는다. 나중에 활성화되는 시점에 Awake가 호출된다. using UnityEngine; public class SomethingParent : MonoBehaviour { public Something s.. 유니티에서 테이블 데이터 로드하기 #4 - Source Generator C#의 Source Generator를 사용하여 직렬화/역직렬화 코드를 생성하는 방법도 있다. 이론적으로 어떤 클래스를 byte array로 변환하려면 각 멤버를 모두 개별적으로 BitConverter 등을 이용해서 순서대로 byte array에 쓰면 되는데, 모든 데이터를 표현하는 클래스에 개별적으로 직렬화하는 코드를 작성하는 방법은 현실적이지 않다. 하지만 C#에는 이럴 때 사용할 수 있는 기능이 있는데, 바로 Source Generator이다. https://learn.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/source-generators-overview Source Generators Source Generators is a C# compiler featu.. 이전 1 2 3 다음