1. On~ 함수
    1. OnMouse~
      1. co-routine 으로 사용할 수 있습니다. (yield 사용 가능.)
      2. OnMouseEnter
        1. 마우스가 처음 오브젝트 위로 올라왔을 때 호출
      3. OnMouseOver
        1. 마우스가 오브젝트 위에 있을 경우 매 프레임마다 호출.
      4. OnMouseExit
        1. 마우스가 처음 오브젝트 밖으로 나갔을 때 호출.
      5. OnMouseDown
        1. 오브젝트 위에서 마우스 버튼을 눌렀을 때 호출.
      6. OnMouseUp
        1. 오브젝트 위에서 마우스 버튼을 땠을 때 호출. 눌렀을 때의 오브젝트와 같은 오브젝트일 때만 호출됨.
      7. OnMouseDrag
        1. 오브젝트 위에서 마우스 버튼을 누른 상태로 있을 때 매 프레임마다 호출.
    2. 충돌 관련 함수
      1. OnTrigger~(other : Collider)
        1. Trigger 는 Inspector 창에서 Collider 의 Is Trigger 속성이 켜져있을 때 발생합니다.
        2. Trigger 가 켜져있을 때는 Collision 관련 함수는 호출되지 않습니다.
        3. Trigger 가 켜져있을 때는 두 오브젝트 사이에 물리 계산이 이루어지지 않습니다.
        4. 그래서 Trigger 는 단순한 '영역' 으로 이해하는 것이 좋습니다.
        5. Trigger 는 함수의 파라메터로 Collider 변수가 들어옵니다. 이것은 자신과 접촉한 오브젝트의 Collider 입니다.
      2. OnCollision~(collisionInfo : Collision)
        1. Collision 은 두 오브젝트 중 적어도 하나가 Inspector 창에서 Rigidbody 의 Is Kinematic 속성이 꺼져있을 때 발생합니다.
        2. 두 오브젝트 모두 Kinematic 속성이 켜져있으면 어느 쪽이 움직여서 겹치더라도 물리 연산이 이루어지지 않기 때문에
        3. 충돌 함수가 호출되지 않습니다.
        4. Collision 은 함수의 파라메터로 Collision 변수가 들어옵니다. 이것은 접촉에 대한 여러가지 정보를 담고 있는 클래스입니다.
      3. 충돌이 일어나려면 두 오브젝트 모두 Collider 를 가져야 하고 둘 중 하나는 Rigidbody 를 가져야 합니다.
      4. Rigidbody 를 가진 쪽이 움직여서 서로 만날 경우만 이벤트가 일어납니다
      5. yield 사용 가능
      6. ~Enter
        1. 접촉 시작시
      7. ~Stay
        1. 접촉 중일 때 매 프레임마다
      8. ~Exit
        1. 접촉이 끝났을 때
      9. 속성
        1. relativeVelocity - 두 오브젝트의 상대 속도입니다. 충격량이라는 느낌일까요? (읽기 전용)
        2. rigidbody - 자신과 접촉한 Rigidbody 입니다.
        3. 만약 상대가 Rigidbody 가 없는 Collider 라면 이 값은 null 입니다. (읽기 전용)
        4. collider - 자신과 접촉한 Collider 입니다. (읽기 전용)
        5. transform - 자신과 접촉한 오브젝트의 Transform 정보입니다. (읽기 전용)
        6. gameObject - 자신과 접촉한 오브젝트입니다. (읽기 전용)
        7. contacts - 물리 엔진에서 연산한 접촉 포인트 정보입니다. ContactPoint 의 배열입니다.
    3. OnControllerColliderHit(hit:ControllerColliderHit)
    4. OnJointBreak(breakForce:float)
    5. OnParticleCollision(other:GameObject)
    6. OnBecameVisible / OnBecameInvisible
    7. OnLevelWasLoaded(level:int)
    8. OnEnable/OnDisable
    9. OnGUI
    10. OnApplicationPause(pause:bool)
    11. OnApplicationQuit
    12. OnDrawGizmos
    13. OnDrawGizmosSelected
    14. OnPreCull
    15. OnPreRender
    16. OnPostRender
    17. OnWillRenderObject
    18. OnRenderObject(queueIndex:int)
    19. OnRenderImage(sourcce:RenderTexture, destination:RenderTexture)
    20. OnPlayerConnected(player:NetworkPlayer)
    21. OnServerInitialized
    22. OnConnectedToServer
    23. OnPlayerDisconnected(player:NetworkPlayer)
    24. OnDisconnectedFromServer(mode:NetworkDisconnection)
    25. OnFailedToConnect(error:NetworkConnectionError)
    26. OnFailedToConnectToMasterServer(error:NetworkConnectionError)
    27. OnMasterServerEvent(msEvent:MasterServerEvent)
    28. OnNetworkInstantiate(info:NetworkMessageInfo)
    29. OnSerializeNetworkView(stream:BitStream, info:NetworkMessageInfo)
    30. Rendering
    31. Network
  2. On이 붙지 않는 함수
    1. Update
      1. 매 프레임마다 호출
        1. 스크립트가 켜져 있을 때만 호출
      2. 지나간 시간 : Time.deltaTime
    2. LateUpdate
      1. 매 프레임마다 호출
        1. 스크립트가 켜져 있을 때만 호출
      2. 모든 Update 호출 후에 호출됨
    3. FixedUpdate
      1. Rigidbody를 다룰 때 Update 대신에 사용
      2. 고정 프레임(50fps)으로 다른 스레드에서 동작
      3. function FixedUpdate() { rigidbody.AddForce(Vector3.up); }
    4. Awake
      1. 스크립트 객체가 로딩될 때 호출
      2. 게임이 시작하기 전에 변수나 게임 상태를 초기화하기 위해 사용
      3. 스크립트 객체의 라이프타임 동안 단 한번만 호출
      4. 모든 오브젝트가 초기화된 후 호출
        1. 다른 오브젝트에 메시지를 날리거나 GameObject.FindWithTag 같은 함수를 안전하게 사용 가능
        2. Awake 함수에서 스크립트를 레퍼런싱한 후, Start 함수에서 필요한 정보를 넘겨받거나 넘겨줄 수 있음
      5. 언제나 Start 함수 전에 호출
        1. 스크립트의 초기화 순서를 정할 수 있게 함
      6. coroutine 으로 동작할 수 없음
    5. Start
      1. Update 함수가 처음 호출될 때 Update 함수 직전에 호출
      2. 스크립트가 동작하는 라이프타임 동안 단 한번만 호출
      3. Awake 함수와의 차이
        1. Start 함수는 스크립트가 켜져있을 때만 호출
          1. 정말로 필요할 때까지 초기화 코드 실행을 연기할 수 있음
      4. Awake 함수는 언제나 Start 함수가 호출되기 전에 호출
        1. 스크립트의 초기화 순서를 정할 수 있음
      5. 모든 스크립트 객체의 Awake 함수가 호출된 후에 호출
    6. Reset
      1. 기본값으로 리셋
      2. 유저가 Inspector의 context menu 에서 Reset 버튼을 눌렀을 때나, 게임 오브젝트에 스크립트를 처음 붙였을 때 호출됩니다. 이 함수는 에디터 모드에서만 호출
      3. Inspector에 초기 값을 설정할 때 가장 자주 사용하는 함수
    7. 순서도
      1. 'A, B, C 라는 게임 오브젝트가 있고, A, B 에 스크립트가 하나씩 붙어있습니다. B는 스크립트가 비활성화 되어 있습니다.'
        1. 조건
      2. 1. 게임이 로딩되면 우선 A, B, C 모든 게임 오브젝트가 초기화 됩니다.
      3. 2. 이후 A, B 에 붙어있는 스크립트의 Awake 함수가 호출됩니다.
      4. (이 상황에서도 이미 A, B, C 게임 오브젝트와 구성 컴포넌트는 모두 메모리에 들어있는 상태이므로 null 체크
      5. 이런 거 없이 안심하고 데이터 전달 등을 할 수 있습니다.)
      6. 3. 이후 A 의 Update 함수가 호출되려고 합니다. B 는 스크립트가 비활성화 상태이기 때문에 동작하지 않습니다.
      7. 4. A 의 Update 함수가 호출되려고 하는데, 이번이 첫번째 호출이네요! 우선 Start 가 호출됩니다.
      8. 5. A 의 Start 가 호출되었으니 Update 가 호출됩니다. 앞으로 매 프레임마다 호출되겠네요.
      9. 6. A 의 LateUpdate 도 호출됩니다. 역시 앞으로 매 프레임마다 호출됩니다.
      10. - 여기서 B의 스크립트를 활성화시켰습니다.
      11. 7. B 의 Update 함수도 호출되기 시작합니다. 제일 처음 Update 호출될 때 역시 Start 가 우선 한 번 호출됩니다.
      12. 8. A, B 의 Update 함수가 모두 호출된 후 A, B 의 LateUpdate 가 호출됩니다.
      13. - 여기서 C에 스크립트 컴포넌트를 붙였습니다.
      14. 9. C 에 스크립트가 붙자 C의 Awake 가 호출됩니다.
      15. 10. A, B, C 의 Update 차례. C의 경우 처음 Update 호출이라서 그전에 Start 함수가 우선 호출됩니다.
      16. 11. A, B, C 의 LateUpdate 차례. A, B, C 의 모든 Update가 끝나면 호출되기 시작합니다.
  3. MonoBehaviour
    1. 클래스 정의
      1. 모든 스크립트가 상속받는 기본 클래스
      2. MonoBehaviour -> Behaviour -> Component
        1. 상속받은 클래스 스크립트는 Component로 등록 가능
        2. Behaviour 클래스는 enable/disable 가능
          1. 이 때문에 스크립트 컴포넌트를 켜고 끌 수 있음