2025.03.25 (화)

윤혜진·2025년 3월 25일

📍오늘의 학습 키워드

  • 스탠다드 1회차 - 유니티 기초

    • 유료 에셋을 사용하는 경우 주의해야 할 점
    • MonoBehaviour
    • 생명주기 함수
    • SendMessage

📍학습 내용

  • 유료 에셋을 사용하는 경우 주의해야 할 점

    • 유료 에셋을 이용하는 경우 깃허브에 public으로 올리면 안 됨.
    • 만약 사용했는데 public으로 올려야 한다면:
      • 새로운 폴더(EX-99.Asset)를 만들어 유료 에셋을 그 폴더에 다 넣은 뒤, .gitignore에 해당 폴더를 등록한다. (등록하면 해당 파일은 깃허브 서버에 올라가지 않는다.) 이 경우 함께 에셋을 사용해야 하는 팀원들에게는 유니티 패키지 파일로 에셋을 따로 전달한다.
      • 일단 사용한 뒤, 외부에 노출될 때 폴더를 삭제하는 방법
    • 포트폴리오를 깃허브에 올릴 때는 꼭 신경써주기.
    • 신경쓰는 만큼 기본이 되어있다는 인상을 줄 수 있다!
  • MonoBehaviour

    • MonoBehaviour를 상속 받는다 = 유니티의 관리를 받는다.
    • MonoBehaviour를 상속 받은 클래스만 컴포넌트가 될 수 있다. (오브젝트에 붙일 수 있다)
    • MonoBehaviour를 상속 받으면 생명주기 함수를 사용 가능.
    • 뿐만아니라 해당 도큐먼트 안에 쓰여있는 것들 모두를 사용할 수 있게된다.
    • 유니티 도큐먼트 링크 👉 MonoBehaviour - Unity 매뉴얼
  • 생명주기 함수

    • 생명주기 함수는 정말 많지만 이 정도로 정리해볼 수 있음:

         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 :

    • 유니티 공식 Documentation 👉 Component-SendMessage - Unity 스크립팅 API
    • MonoBehaviour를 상속 받은 클래스에 있는 메서드 모두를 검색해서 실행시킴
    • public이 아닌 메서드도 문자열로 검색해 강제로 호출하기 때문에 성능적으로 좋지 않고, 디버깅도 어려움.
    • 그냥 있다는 것만 알아두고 사용하진 말 것!!
    • 팁: 생명주기함수는 SendMessage로 호출하는 것과 유사한 형식으로 돌아가기 때문에 불필요한 생명주기 함수를 지우지 않고 놓아두면 성능적으로 좋지 않다.
  • Vector :

    • 크기와 방향만 존재할 뿐이지 위치에 대한 정보가 없다는 특징이 있음.

    • 플레이어 좌표에서 몬스터 좌표를 빼면 몬스터 좌표에서 플레이어를 바라보는 벡터가 나옴

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

      • 이 경우 벡터의 방향은 같지만 크기가 각자 다름
      • 이렇게 되면 몬스터 들의 속도가 달라짐.
      • 벡터의 크기가 작은 녀석은 느린 속도로 플레이어를 향해 이동할 것이고,
      • 벡터의 크기가 큰 녀석은 빠른 속도로 플레이어를 향해 이동할 것임.
    • 이 경우 필요한 것이 정규화인데, 정규화를 하면 크기는 초기화 하고 방향만을 남길 수 있게 된다.

      Q. 정규화?

      👉 어떠한 벡터를 단위 벡터로 만드는 것을 정규화(Normalization)라고 하는데, 여기서 단위 벡터(unit vector)란, 방향을 가지는 크기가 1인 벡터를 뜻한다.

    • vector의 크기만 남기기: magnitude

    • vector의 방향만 남기기: normalized

📍겪은 어려움

  • new로 새로운 객체를 만들어주면 일어나는 일:

    • 내가 겪은 어려움은 아니지만, 셍명주기 함수의 순서를 정리하던 중 다른 분이 가르쳐주셨던 신기한 오류를 기록해둔다.
    • 다음과 같이 new를 통해 test에 TestScript 를 할당해준다.
    • 여기서 문제: 그럼 test는 null인가?
    • 나는 test 변수 안에 new로 TestScript를 넣어줬으니 당연히 null이 아닐 것이라고 대답했다.
    • 그리고 결과는... :
      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>();

📍회고 및 반성

  • 암호화 공부를 못했다... 특강이 있었던 것을 감안해도 하루열 두시간이 적은 시간은 아닌데, 그 시간에 온전히 집중하지 못한 것 같아서 조금 아쉬움.
  • 내일은 꼭 ATM 코드 리펙토링 및 리드미 작성까지 끝낸 다음에, 과제 제출 하고, 2주차 강의 마저 듣고, 암호화 공부까지 하는 걸로!
  • 최종 전 마지막 팀플이 얼마 남지 않았으니 최선을 다하자!

0개의 댓글