Unity에서 작성되는 모든 스크립트는 MonoBeviour를 상속받는다.
늘 익숙하게만 여겨져 신경쓰지 않았지만, 오늘은 이 MonoBehavour를 알아보기로 하자.
- 역할
- 유니티의 기본적인 기능들을 사용하게 해주는 친구이다.
- 이점
- LifeCycle(생명주기)
- 아래 함수들의 순서들을 기억해두고, 나머지는 있다는 것만 알아두도록
- 초기
- Awake()
- OnEnable()
- Start()
- 반복
- FixedUpdate()
- Update()
- 종료 시점
- OnDisable()
- OnDistroy()
- LifeCycle(생명주기)
- Awake(), Start() : 시작할 때 한번씩 실행
- OnEnable() : 켜질 때 마다 계속 실행
- Update : 기기의 성능마다 프로그램에서 카메라에 비춰지는 속도가 다름.
- 따라서 애니메이션, 리지드바디 등등 물리 처리에 관하여 미리 세팅이 필요한 것은 FixedUpdate()에서 진행하도록
- 가장 마지막에 후 처리하고 싶다면 LateUpdate() 사용하도록
- Update문에서 물리처리를 하고 싶다면?
- *Time.deltaTime = 시간의 정규화
- 시간의 정규화
- 특정 지점까지 이동하는데 걸린 시간을 기준 시간과 비교
- ex) 동일하면 Vector2.One 곱해주고, 0.5초 걸렸으면 Vector2.One0.5 곱해주는 느낌
- 결론 : 다른 기기라도 같은 수행을 보여주고자 하는 것
- 특정 지점까지 이동하는데 걸린 시간을 기준 시간과 비교
- MonoBehaviour과 Class의 차이
- 보통 new 연산자로 선언하지 않음.
- public이나 [SerializedField]를 붙여서 인스펙터에서 처리함.
- 동적생성 : 실시간으로 필요한 것을 만들어 쓰겠다.
- 이후 나중에 추가 작성할 것.
- 컴포넌트
- GetComponent : “게임 매니저야, 코드로 플레이어 매니저에 접근하고 싶어!”
- 이때 사용하는게 _pm = GetComponent<PlayerManager>();
- <PlayerManager> : 제네릭 : <T>
- T : type(클래스 이름 같은 뉘양스)
- ‘인스펙터를 훑어보고 있다면 _pm에 저장, 없다면 null’
- T : type(클래스 이름 같은 뉘양스)
- <PlayerManager> : 제네릭 : <T>
- 이때 사용하는게 _pm = GetComponent<PlayerManager>();
- GetComponent : “게임 매니저야, 코드로 플레이어 매니저에 접근하고 싶어!”
- “다른 오브젝트에 접근하고 싶어!”
- 해당 오브젝트가 어떤 컴포넌트를 가졌는지 안다면, 게임오브젝트로 받음
- 기본적인 유니티 기능들 사용 가능(라이프 사이클, 셋 액티브 등등등)
- ex) [큐브 오브젝트]-[컴포넌트 들]-[A.cs]-[Hi()]를 원한다면
- cubeObject.GetComponent<Cube>().Hi();
- 오브젝트.GetComponent<인스펙터 창의 속성들 중 특정 컴포넌트>().~~~
- ex) [큐브 오브젝트]-[컴포넌트 들]-[A.cs]-[Hi()]를 원한다면
- 결론
- public이나 [SerializedField]로 인스펙터 상에서 연결시켜라.
- 버튼을 예로 들떄, 버튼이 여러 개 있다면 그중에 찾는 버튼을 탐색하기 빡세니까.
- (pulbic, [SerializedField]가 싫을 때)나랑 상관 없는 친구 연결해서 쓰고 싶다면, GetComponent
- 추가++
- 하위 속성에 묶여서 프리팹화가 된다면, 스크립트 상에서는 유지되나
- 따로 이어주지 않는다면 연결되어 있지 않으므로 큐브가 비어있게 됨.
- public이나 [SerializedField]로 인스펙터 상에서 연결시켜라.
- MonoBehaviour를 상속받으면
스크립트 내부에서 gameObejct 변수를 생성할 수 있음.
그리고 gameObject로 스크립트 외부 컴포넌트에( : 스크립트가 장착된 오브젝트의 다른 컴포넌트)에 접근 가능.
gameObject.SetActive(false);하면 오브젝트가 꺼져버리는 것이 이 까닭
마찬가지로 본 스크립트가 차지하는 컴포넌트는 하부의 스크립트이나
MonoBehaviour에서 상속받은 변수인 transform변수로 다른 컴포넌트인 transform에 접근할 수 있는 것.
+++
gameObject에 다른 오브젝트(CubeObject)가 연결되어있을때
gameObject.SetActive(false) == 스크립트가 달려있는 해당 오브젝트가 꺼질 것임.
cubeObj.gameObject.SetActive(false) = = 연결된 다른 오브젝트가 꺼질 것임.
- 결국 주어의 차이라고 생각하자.
- 주어가 없으면 스크립트가 달려있는 해당 오브젝트가 대상
- 주어가 다른 오브젝트라면 그 다른 오브젝트가 대상
- 게임 오브젝트랑 transform은 monobehaviour로 상속받은 것.
Uploaded by N2T