공부일지

MonoBehaviour 특강 내용 본문

코딩/Unity

MonoBehaviour 특강 내용

이하택 2023. 9. 20. 23:58

Unity에서 작성되는 모든 스크립트는 MonoBeviour를 상속받는다.

늘 익숙하게만 여겨져 신경쓰지 않았지만, 오늘은 이 MonoBehavour를 알아보기로 하자.

  • 역할
    • 유니티의 기본적인 기능들을 사용하게 해주는 친구이다.

  • 이점
    • LifeCycle(생명주기)
      • 아래 함수들의 순서들을 기억해두고, 나머지는 있다는 것만 알아두도록
      • 초기
        • Awake()
        • OnEnable()
        • Start()
      • 반복
        • FixedUpdate()
        • Update()
      • 종료 시점
        • OnDisable()
        • OnDistroy()


  • Awake(), Start() : 시작할 때 한번씩 실행
    • OnEnable() : 켜질 때 마다 계속 실행

  • Update : 기기의 성능마다 프로그램에서 카메라에 비춰지는 속도가 다름.
    • 따라서 애니메이션, 리지드바디 등등 물리 처리에 관하여 미리 세팅이 필요한 것은 FixedUpdate()에서 진행하도록
    • 가장 마지막에 후 처리하고 싶다면 LateUpdate() 사용하도록

  • Update문에서 물리처리를 하고 싶다면?
    • *Time.deltaTime = 시간의 정규화

  • 시간의 정규화
    • 특정 지점까지 이동하는데 걸린 시간을 기준 시간과 비교
      • ex) 동일하면 Vector2.One 곱해주고, 0.5초 걸렸으면 Vector2.One0.5 곱해주는 느낌
    • 결론 : 다른 기기라도 같은 수행을 보여주고자 하는 것


  • MonoBehaviour과 Class의 차이

  1. 보통 new 연산자로 선언하지 않음.

  • public이나 [SerializedField]를 붙여서 인스펙터에서 처리함.
  • 동적생성 : 실시간으로 필요한 것을 만들어 쓰겠다.
    • 이후 나중에 추가 작성할 것.

  1. 컴포넌트
    • GetComponent : “게임 매니저야, 코드로 플레이어 매니저에 접근하고 싶어!”
      • 이때 사용하는게 _pm = GetComponent<PlayerManager>();
        • <PlayerManager> : 제네릭 : <T>
          • T : type(클래스 이름 같은 뉘양스)
            • ‘인스펙터를 훑어보고 있다면 _pm에 저장, 없다면 null’

  • “다른 오브젝트에 접근하고 싶어!”
    • 해당 오브젝트가 어떤 컴포넌트를 가졌는지 안다면, 게임오브젝트로 받음
    • 기본적인 유니티 기능들 사용 가능(라이프 사이클, 셋 액티브 등등등)
      • ex) [큐브 오브젝트]-[컴포넌트 들]-[A.cs]-[Hi()]를 원한다면
        • cubeObject.GetComponent<Cube>().Hi();
        • 오브젝트.GetComponent<인스펙터 창의 속성들 중 특정 컴포넌트>().~~~

  • 결론
    1. public이나 [SerializedField]로 인스펙터 상에서 연결시켜라.
      1. 버튼을 예로 들떄, 버튼이 여러 개 있다면 그중에 찾는 버튼을 탐색하기 빡세니까.
    1. (pulbic, [SerializedField]가 싫을 때)나랑 상관 없는 친구 연결해서 쓰고 싶다면, GetComponent

    • 추가++
      • 하위 속성에 묶여서 프리팹화가 된다면, 스크립트 상에서는 유지되나
      • 따로 이어주지 않는다면 연결되어 있지 않으므로 큐브가 비어있게 됨.


  • MonoBehaviour를 상속받으면

스크립트 내부에서 gameObejct 변수를 생성할 수 있음.

그리고 gameObject로 스크립트 외부 컴포넌트에( : 스크립트가 장착된 오브젝트의 다른 컴포넌트)에 접근 가능.

gameObject.SetActive(false);하면 오브젝트가 꺼져버리는 것이 이 까닭

마찬가지로 본 스크립트가 차지하는 컴포넌트는 하부의 스크립트이나

MonoBehaviour에서 상속받은 변수인 transform변수로 다른 컴포넌트인 transform에 접근할 수 있는 것.

+++

gameObject에 다른 오브젝트(CubeObject)가 연결되어있을때

gameObject.SetActive(false) == 스크립트가 달려있는 해당 오브젝트가 꺼질 것임.

cubeObj.gameObject.SetActive(false) = = 연결된 다른 오브젝트가 꺼질 것임.

  • 결국 주어의 차이라고 생각하자.
    • 주어가 없으면 스크립트가 달려있는 해당 오브젝트가 대상
    • 주어가 다른 오브젝트라면 그 다른 오브젝트가 대상
  • 게임 오브젝트랑 transform은 monobehaviour로 상속받은 것.


Uploaded by N2T