MonoBehaviourSendMessagepublic으로 올리면 안 됨.99.Asset)를 만들어 유료 에셋을 그 폴더에 다 넣은 뒤, .gitignore에 해당 폴더를 등록한다. (등록하면 해당 파일은 깃허브 서버에 올라가지 않는다.) 이 경우 함께 에셋을 사용해야 하는 팀원들에게는 유니티 패키지 파일로 에셋을 따로 전달한다.MonoBehaviourMonoBehaviour를 상속 받는다 = 유니티의 관리를 받는다.MonoBehaviour를 상속 받은 클래스만 컴포넌트가 될 수 있다. (오브젝트에 붙일 수 있다)MonoBehaviour를 상속 받으면 생명주기 함수를 사용 가능.생명주기 함수는 정말 많지만 이 정도로 정리해볼 수 있음:
private void Awake() { Debug.Log("가장 먼저 시작 되는 Awake"); } private void OnEnable() { Debug.Log("켜질 때마다 시작하는 OnEnable"); } private void Start() { Debug.Log("OnEnable 이후 시작하는 Start"); } private void FixedUpdate()// 1초에 50번 호출함. { Debug.Log($"물리처리를 실행하는 FixedUpdate"); } private void Update()// 1초에 프레임 단위로 호출함. { Debug.Log($"프레임 단위로 시작하는 Update"); } private void LateUpdate() { Debug.Log("Update이후 시작하는 LateUpdate"); } private void OnDisable() { Debug.Log("꺼질 때마다 시작하는 OnDisalbe"); } private void OnDestroy() { Debug.Log("파괴되면 시작하는 OnDestroy"); }
게임 오브젝트에 붙이고 실행시:
Awake > OnEnable > Start > FixedUpdate > Update > LateUpdate 순서로 실행

게임 오브젝트를 끄면:
OnDisable 실행됨
다시 키면:
OnEnable 실행
킨 채로 파괴하면:
OnDisable > OnDestroy 순서로 실행됨
만약 오브젝트가 꺼진채로 프로젝트를 실행한다면:
Awake도 실행되지 않음)
이 상태에서 키면:
Awake > OnEnable > Start > FixedUpdate > Update > LateUpdate 순서로 실행
끈 상태에서 삭제하면:
OnDestroy만 실행
끈 상태에서 실행한 뒤 바로 삭제한다면:
OnDestroy 도 실행되지 않는다.)
SendMessage :
MonoBehaviour를 상속 받은 클래스에 있는 메서드 모두를 검색해서 실행시킴public이 아닌 메서드도 문자열로 검색해 강제로 호출하기 때문에 성능적으로 좋지 않고, 디버깅도 어려움.SendMessage로 호출하는 것과 유사한 형식으로 돌아가기 때문에 불필요한 생명주기 함수를 지우지 않고 놓아두면 성능적으로 좋지 않다.Vector :
크기와 방향만 존재할 뿐이지 위치에 대한 정보가 없다는 특징이 있음.
플레이어 좌표에서 몬스터 좌표를 빼면 몬스터 좌표에서 플레이어를 바라보는 벡터가 나옴

만약 플레이어는 하나인데 몬스터는 여러마리 일 경우 다음과 같은 경우가 발생할 수 있음:

이 경우 필요한 것이 정규화인데, 정규화를 하면 크기는 초기화 하고 방향만을 남길 수 있게 된다.
Q. 정규화?
👉 어떠한 벡터를 단위 벡터로 만드는 것을 정규화(Normalization)라고 하는데, 여기서 단위 벡터(unit vector)란, 방향을 가지는 크기가 1인 벡터를 뜻한다.
vector의 크기만 남기기: magnitude
vector의 방향만 남기기: normalized
new로 새로운 객체를 만들어주면 일어나는 일:
using UnityEngine; public class TestScript2 : MonoBehaviour { TestScript test; private void Awake() { test = new TestScript(); } private void Start() { if(test == null) { Debug.Log("test은 null이다."); } else { Debug.Log("test은 null이 아니다."); } } }
대체 왜?! :
Unity에서는 MonoBehaviour를 new 키워드로 직접 생성할 수 없움
MonoBehaviour는 Unity가 씬(Scene) 위에 붙는 컴포넌트로, 반드시 GameObject.AddComponent<>()로 생성해야 한다.
MonoBehaviour는 Unity 엔진 내부에서 생성과 수명 관리를 하기 때문에, 개발자가 new로 만들면 Unity가 인식하지 못해서 문제가 생긴다!
때문에 test에 무언가가 들어있음을 제대로 체크하려면 TestScript에서 MonoBehaviou를 상속받는 부분을 없애던가, 아래 코드처럼 AddComponent를 통해 붙여주어야 함!!
GameObject obj = new GameObject("MyObject"); TestScript script = obj.AddComponent<TestScript>();