본문 바로가기

전체 글

(18)
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..