스크립트 컴포넌트 -> 기능이 정해지지 않은 컴포넌트, 사용자가 구현하고 싶은 컴포넌트(엔진에서 제공되지 않음)
스크립트 컴포넌트를 상속시켜 여러 스크립트들을 제작한다.
스크립트들은 final tick 을 하면 안된다. -> 스크립트를 제외한 일반적인 컴포넌트가 기본적인 위치나 이동이 끝나고 gpu에 데이터를 전달하기전에 마무리하기 위해 만들어놓은 틱이기 때문이다.
스크립트는 논리적인 로직을 구현하는 파트이기 때문에 틱에서 구현을 마무리 해야한다.
그래서 스크립트 컴포넌트에서 finaltick() final {}; 을 붙여서 그 밑의 자식 스크립트들이 구현할 수 없게 막아놓는다.
스크립트 컴포넌트나 자식 스크립트 컴포넌트들의 타입은 다 스크립트로 분류가 된다.
게임오브젝트에 에드컴포넌트에 들어왔을때 기존에 있던 컴포넌트들은 고정된 배열 안에 들어가니까,
컴포넌트 타입을 인덱스로 해서 배열에 집어넣으면 됐다.
그런데 스크립트는 이렇게 하면 안된다.
이넘값을 보면 스크립트가 끝자리에 한 칸 있는 것인데, 인덱스가 증가하면 end 까지 개수만큼 배열로 잡아놨기 때문에
스크립트 자리에 넣어버리면 같은 칸에 주소가 덧씌워진다.
컴포넌트에서 파생됐고, 부모로 올라가다보면 컴포넌트가 있기 때문에 컴포넌트 포인트 배열에 들어갈 수 있다.
그래서 enum값 순서를 스크립트는 컴포넌트 타입으로 분류가 되지만, end 다음으로 배치를 해서 오버된 인덱스가 되어버리게 해서 컴포넌트 타입의 배열칸 안에는 들어오지 않도록 한다.
그럼 스크립트들은 결국 인덱스가 아닌 백터자리에 들어가게 된다.
즉, 스크립트가 아닌 것은 배열에 넣으면 되고 스크립트인 것은 백터에다 넣어주면 되게 if문으로 설정을 해준다.
비긴함수 -> 레벨이 시작되거나, 레벨이 시작 전에 이미 있거나 레벨에 합류하는 시점에 호출된다.
게임오브젝트, 레벨, 컴포넌트, 그리고 소유하고 있는 컴포넌트 타입들에게 전부 비긴을 준다..
*생성자는 메모리에 만들어지자마자 호출되는 것, 비긴은 레벨이 시작될 때
리소스 별로 템플릿이 따로 적용된다.
클래스 템플릿은 클래스가 아니라 클래스를 만들기 위한 탬플릿이다.
타입 t 가 정해진것마다 다른 클래스라는 의미이다.
매니저소멸순서를 정한 적이 없다.
엔진에서 싱글톤으로 해서 데이터영역에 올라가 있기 때문에, 소멸순서를 정할 수가 없다.
데이터영역 메모리 자체가 프로그램이 종료될 때 해제되기 때문이다.
지워지는 순서가 레벨매니저가 먼저 지워지고 리소스 매니저가 먼저 지워져야한다.
해제하는시점을 직접 정해줄수있게 동적할당으로 변경해야한다.
동적할당으로 만들었기 때문에 프로그램 종료하기 전에 반드시 디스트로이해서 해당 객체를 지워줘야한다.
atexit -> 호출시킬애들을 exit로 등록하면 가장 마지막에 등록한것부터 호출된다. 스택구조이기 때문이다.