[이벤트]
- 이벤트 주도적인 설계로 리팩토링하여 Ammo나 Health와 같은 프로퍼티가 Update 함수 안에서 검사되지 않고
값 할당만을 허용
- 새로운 값이 할당될 때 적절한 이벤트가 발생.
- 이벤트 주도적인 설계는 성능 최적화 및 청결한 코드 유지가 가능해진다. Update 함수가 값을 검사하는 코드 등의 부담을 줄이고,
특정 값에 따라 반응하는 이벤트를 이용해 적절한 시점에만 이벤트가 불리운다.
[이벤트 관리]
- EventManager 클래스를 통해 오브젝트가 특정 이벤트를 수신할 수 있도록 한다.
- EventListener : 자신이 발생시킨 이벤트를 포함한 어떤 이벤트가 발생하면 알기를 원하는 모든 오브젝트를 리스너라고 부른다.
- EventPoster : 다른 모든 리스너가 알 수 있게 이벤트에 대해 알려야 한다. 오브젝트가 전역 레벨에서 이벤트를 발생시켜야 한다.
- EventManager : 여러 레벨에 걸쳐 계속 유지되며 전역적으로 접근이 가능하게 한다. 리스너를 포스터에게 실질적으로 연결하는 역할.
[인터페이스를 통해 이벤트 관리]
// 더 많은 이벤트가 리스트에 추가된다. public enum EVENT_TYPE { GAME_INIT, GAME_END, AMMO_CHANGE, HEALTH_CHANGE, DEAD }; // 리스너 클래스에서 구현될 리스너 인터페이스 public interface IListener { // 이벤트가 발생할 때 리스너에서 호출할 함수 void OnEvent(EVENT_TYPE Event_Type, Component Sender, object param = null); }
- IListener 인터페이스를 사용함으로써 클래스 상속을 사용하는 모든 오브젝트를 리스너로 만들 수 있다.
[이벤트 매니저 만들기]
- 이벤트가 실제로 발생했을 때 리스너들에게 이벤트 를 호출하는 것
- 지속되는 싱글턴 오브젝트로, 씬 안의 빈 게임오브젝트에 붙이면, 정적 인스턴스 속성을 통해 모든 오브젝트에서 직접 접근 가능
[델리게이트를 이용한 대안]
- 함수를 생성해 이 함수의 참조를 변수 안에 저장하고, 이 변수를 통해 참조 형식의 변수로서 함수를 취급하는 것이 가능.
- 함수포인터같은 개념이다. 델리게이트를 선언해놓고 변수를 선언해서 대입하면 된다.
- 델리게이트에 더해질 수 있는 것 -> 델리게이트 체인이 가능하다.
[#region과 #endregion을 이용한 코드 접어두기]
- 두 전처리기를 이용하면 코드의 가독성을 향상시키는데 도움이 되고 소스 파일을 찾는 시간을 단축 시켜준다.
- 소스코드의 유효성이나 실행 결과에 영향을주지 않으면서 코드를 조직화, 구조화시킨다.
[마우스와 탭 이벤트]
- OnMouseDown, OnMouseEnter, OnMouseExit 등
[코루틴]
- 메인 게임 루프에서 병렬이나 비동기로 실행 되는 것처럼 보이는 측면을 고려할 때 스레드 처럼 동작한다고 할 수 있다.
- IEnumerator 형식을 반환해야한다. 최소한 하나의 yield문을 포함하고 있어야 하고 StartCoroutine으로 실행된다.
[List]
- 정렬되지 않은 상태로 하나의 데이터 형식을 가지는 연속적인 항목들의 목록이 필요할 때, 이 목록이 저장된 데이터의 크기에
맞게 늘어나거나 줄어드는 것을 원한다면 List가 적합하다.
- 아이템을 추가/삭제하고 저장된 모든 항목들을 순차적으로 순회해야 할 필요가 있을 때 특히 적합하다.
[Dictionary]
- 단순한 항목들의 목록 이상의 기능을 원 할 때 유용
- 키 값에 따른 특정 원소를 검색해 즉시 접근해야 할 때
[문자열]
- 두 문자열이 동일한지를 판별하는 식으로 별개의 두 문자열을 비교해야 할 때, String.Equals 메소드를 사용한다.
- 또는, 문자열 해시로 변환하여 고유의 정수 값으로 비교한다.
- 문자열 서식 지정은 String.Format 메소드를 이용한다.
- 문자열 순회는 IEnumerator 인터페이스 자체를 이용하거나 foreach 반복문을 통해 구현
- 문자열 초기화는 MyString = ""; 보다는 string.Empty를 이용하자
- 문자열 찾기는 String.IndexOf 메소드를 이용
- 정규식 검색 기능은 Regex 클래스를 이용
[통합 언어 쿼리 - LINQ]
public void FindEnemiesLinqWay() { // 씬 안에 존재하는 모든 적을 얻어온다 Enemy[] Enemies = Object.FindObjectsOfType(); // 검색을 수행한다 Enemy[] FilteredData = (from EnemyChar in Enemies where EnemyChar.Health <= 50 && EnemyChar.Defense < 5 select EnemyChar).ToArray(); // 이제 걸러 낸 데이터에 접근해 처리할 수 있다 // FinteredData 안에 담긴 모든 항목은 검색 기준에 부합한다 foreach(Enemy E in FilteredData) { // 적 E를 처리한다 Debug.Log (E.name); } }
[텍스트 데이터 에셋]
- 외부에서 텍스트를 불러오는것이 가능하다. -> TextAssets 형식으로 임포트 된다.
- 로컬 파일 로딩, INI 파일 로딩, CSV 파일 로딩, Web 로딩
// 웹의 텍스트를 문자열로 불러온다 public IEnumerator GetTextFromURL(string URL) { // 새 WWW 오브젝트를 생성한다 WWW TXTSource = new WWW(URL); // 데이터를 불러오길 기다린다 yield return TXTSource; // 텍스트 데이터를 얻는다 string ReturnedText = TXTSource.text; }
[네비게이션 메시]
- 바닥으로 분류된 레벨의 수평면을 유니티가 걸을 수 있는 곳으로 인식할 수 있도록 자동으로 생성하는 보이지 않는 메시 에셋.
- 즉, AI유닛으로 하여금 필요한 경우 방해물을 피해 가도록 경로를 계산할 수 있게 해주는 모든 필요한 데이터를 포함하는 수학적 모델
- widnow > navigation을 선택해보면 navigation mesh 탭이 오브젝트 인스펙터에 도킹되어 나타난다.
- 순간이동 : 오프-메시 링크 컴포넌트
'NOTE > Unity' 카테고리의 다른 글
[Unity] 짧은 개념 정리 (0) | 2016.09.29 |
---|---|
[Unity] 힙 메모리 최적화와 오브젝트 풀링 (펌) (0) | 2016.09.27 |
[Unity] C# 스크립팅 마스터하기 BOOK 요약정리1 (0) | 2016.09.26 |
[Unity] 실행 순서 이벤트 함수 (펌) (0) | 2016.09.26 |
[Unity] 게임 최적화 기법 (펌) (0) | 2016.09.26 |