본문 바로가기
NOTE/Unity

[Unity] C# 스크립팅 마스터하기 BOOK 요약정리2

by DevAthena 2016. 9. 27.

[이벤트]

- 이벤트 주도적인 설계로 리팩토링하여 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 탭이 오브젝트 인스펙터에 도킹되어 나타난다.

- 순간이동 : 오프-메시 링크 컴포넌트