본문 바로가기

전체 글36

Scriptable Object - 응용: 오디오 이벤트, 프로퍼티 드로워, 커스텀 에디터 (6) 샘플 프로젝트 (richardfine-scriptableobjectdemo) 소스 : https://bitbucket.org/richardfine/scriptableobjectdemo/src/default/ 오디오 이벤트 추상 클래스는 다형화를 구현하는 대표적인 수단이다. 사용자인 MonoBehaviour는 인스턴스의 타입이 무엇인지에 상관없이 Play()만 호출할 뿐이다. 다형성은 OOP가 지향하는 것으로 변경에 대비해 사용자와 특정 클래스 사이를 추상 클래스나 인터페이스로 분리시키는 것이다. 기능의 변경이 발생하면 사용자의 코드는 건들지 않아도 된다. 기능 정의는 자식 클래스에서 이뤄지기 때문이다. 1 2 3 4 5 6 using UnityEngine; public abstract class Audi.. 2020. 6. 1.
Scriptable Object - 응용: Enum 대체, 오해와 진실, 프로퍼티 드로워 (5) Enum 대체 Scriptable Object의 Asset으로 Enum을 대체할 수 있다. Enum은 각 요소가 문자열과 int형으로 매핑된다. 그래서 Enum은 Dictionary의 키로 사용하거나 메뉴 인덱싱을 위해 사용한다. Enum은 변경에 취약하다. 중간 요소를 제거하거나 추가해서 인덱스가 변경되면 관련한 모든 코드를 재정렬해야 한다. Switch/case문의 요소 제거 및 추가, 인덱스로 활용 중인 코드의 인덱스 조정 등 활용 범위가 넓을 수록 코드 수정 범위도 넓어진다. 하지만 Enum을 Asset으로 대체하면 수정 범위가 Inspector뷰에 한정된다. 따라서 변경에 대한 단점을 최소화 할 수 있다. 특히 Scriptabl Object는 기능도 정의할 수 있으므로 Enum의 인덱싱과 동시에.. 2020. 6. 1.
Scriptable Object - 응용: 이벤트, 데이터셋 (4) 이벤트 Player는 이벤트를 전파하는 주체인 이벤트 트리거이다. Player가 이벤트 조건을 충족하면 이벤트 에셋을 통해 리스너들을 호출한다. Player는 'public UnityEvent damageEvent'라는 필드를 갖는다. 해당 필드는 Inspector뷰로부터 리스너를 추가할 수 있다. Player는 이벤트를 트리거 시 리스너에게 전파해 줄 GameEvent 에셋을 추가했다. 이벤트 발생 시 에셋의 Raise()를 호출할 것이다. 'Player > UnityEvent.Invoke > GameEvent.Raise()' 리스너들은 'GameEventListener' 컴포넌트를 추가해야한다. 이 컴포넌트는 해당 Event에 자신을 등록한다. 그러면 GameEvent로부터 'public UnityE.. 2020. 6. 1.
Scriptable Object - 개념: 기본 아이디어, 기존 싱글톤의 장단점 (3) 샘플 프로젝트 (Unite - 2017) 소스 : github.com/roboryantron/Unite2017 roboryantron/Unite2017 Sample project for Game Architecture with Scriptable Objects from Unite Austin 2017 - roboryantron/Unite2017 github.com 기본 아이디어 아이디어를 크게 도식화 하면 위와 같다. Player와 다른 개체들 사이를 Asset이 이어주고 매개한다. Player라는 프리팹 개체에는 UnitHealth.cs라는 MonoBehaviour가 정의됐다. 해당 스크립트에는 HP 라는 필드가 선언됐다. 그리고 값으로 해당 에셋이 링크됐다. Player 개체는 플레이 중 HP의 값을.. 2020. 5. 29.
Scriptable Object - 개념: 인스턴스와 에셋 생성 (2) 스크립터블 오브젝트 ScriptableObject는 MonoBehaviour와 같이 Unity.Object를 상속하며 Inspector뷰에 노출된다. Unity.Object는 SerializedProperty로 캐스팅될 수 있는데 이는 곧 직렬화가 가능해서 Disk의 한 파일로 저장될 수 있다는 의미다. SerializedProperty는 Editor 클래스가 참조하는 프로퍼티로 Inspector뷰를 구성할 때 쓰인다. Editor 클래스로 별도의 작업을 안해도 Inspector 뷰에 프로퍼티가 보이는 이유는 MonoBehaviour에 대해 적용된, 보이지 않는 디폴트 Editor 클래스가 있는 것으로 추정해볼 수 있다. 예를 들면, MonoBehaviour.cs에서 선언된 List는 생성자 호출 없이 .. 2020. 5. 29.