경일게임아카데미 멀티 디바이스 메타버스 플랫폼 개발자 양성과정 20220707 2022/04/04~2022/12/13

Jinho Lee·2022년 7월 7일
0

경일 메타버스 20220707 14주차 4일 수업내용. 유니티 - 매뉴얼, 인터페이스, 컴포넌트, 로그, 씬 편집 툴, 컴포넌트 패턴, 이벤트 함수의 실행 순서, Unity를 위한 C# 프로그래밍, 오답노트

유니티 매뉴얼

https://docs.unity3d.com/Manual/UnityManual.html

  • 유니티 패키지(Package) : 외부 라이브러리

  • 에셋(Asset) :
    Unity 프로젝트에서 무언가를 만들 때 사용하는 모든 것, 모든 아이템.

  • 입력(Input) :
    유니티는 입력을 두 가지 방법으로 제공한다.
    인풋 매니저(Input Manager) / 인풋 시스템(Input System)

  • 2D

  • 그래픽스(Graphics) :
    그래픽 관련 툴

  • 월드 빌딩(World Building) :
    가상 세계를 만들기 위한 툴, 에셋

  • 스크립팅(Scripting) :
    프로그래밍, 유니티 아키텍쳐 전까지 필수, 그 이후는 심화

  • 유니티 네트워킹은 아직 충분히 쓸만하지 못하다. 참고하지 말 것.

    • 상용 엔진 : proudnet, photon 등
    • 언리얼 엔진은 자체적으로 네트워킹 제공 중
  • 오디오(Audio)

  • 동영상(Video)

  • 애니메이션(Animation) :
    애니메이션은 알아두는 것이 좋다.

  • 유저 인터페이스(User Interfaces, UI) :
    UI 툴킷(tool kit) / uGUI(Unity UI) / IMGUI

  • 내비게이션과 경로 탐색(Navigation and Pathfindinf) :
    Unity에서 제공하는 길찾기 알고리즘

  • XR : VR & AR 관련

  • 에셋스토어(Asset Store) :
    유명한 무료 에셋 ex) Unity chan!

  • 플랫폼 개발(Platform devleopment) :
    다양한 플랫폼에서 프로그램을 빌드할 때 참고.

  • 스크립팅 API :
    스크립팅에 관한 내용.

인터페이스

  • 씬(Scene) 창 :
    게임 월드인 씬을 시각적으로 편집하는 창

  • 하이어라키(Hierarchy) 창 :
    씬에 존재하는 모든 게임 오브젝트가 나열되는 창

  • 인스펙터(Inspector) 창 :
    선택한 게임 오브젝트의 정보가 표시되는 창

  • 게임(Game) 창 :
    플레이어가 실제로 보게 될 화면을 띄우는 창

  • 프로젝트(Project) 창 :
    프로젝트에 사용될 에셋들이 표시되는 창

  • 콘솔(Console) 창 :
    로그나 에러가 표시되는 창

기본 컴포넌트

  • 트랜스폼(Transform) :
    오브젝트의 3차원 좌표와 크기, 회전을 지정한다.

  • 메시 필터(Mesh Filter) :
    3D 메시 파일을 받아 오브젝트의 외곽선을 지정한다.

  • 메시 렌더러(Mesh Renderer) :
    메시를 따라 색을 채워 그래픽 외형을 그린다.

  • 박스 콜라이더(Box Collider) :
    다른 물체가 부딪칠 수 있는(충돌 처리) 물리적인 표면을 만든다.

로그 종류

  • 일반 로그(회색) :
    일반적인 기록 정보

  • 경고 로그(노란색) :
    권장할 만한 수정 사항이 존재할 때 표시

  • 에러 로그(빨간색) :
    잘못된 문법, 접근 등으로 명령을 실행할 수 없는 문제가 생기면 표시

로그 출력 설정 버튼

  • Clear :
    모든 로그를 지운다. 해결되지 않은 코드 문법 에러 로그는 사라지지 않는다.

    • Clear on Play :
      씬을 플레이할 때 직전까지 쌓여 있던 모든 로그를 지운다.

    • Clear on Build :
      빌드시 직전까지 쌓여 있던 모든 로그를 지운다.

    • Clear on Recompile :
      코드가 수정되어 반영될(재컴파일) 때 쌓여 있던 모든 로그를 지운다.

  • Collapse :
    같은 내용의 로그끼리 보기 쉽게 묶는다.

  • Error Pause :
    플레이 도중 에러가 발생하면 씬을 일시 정지한다.

  • Editor :
    유니티 에디터 외부의 기기로부터 원격 로그를 받을 수 있다.

씬 편집 툴

  1. 핸드(Hand) 툴 : 단축키 Q
    카메라를 움직인다.

  2. 평행이동(Translate) 툴 : 단축키 W
    오브젝트를 이동시킨다.

  3. 회전(Rotate) 툴 : 단축키 E
    오브젝트를 회전시킨다.

  4. 스케일(Scale) 툴 : 단축키 R
    오브젝트의 크기를 조정한다.

  5. 렉트(Rect) 툴 : 단축키 T
    UI와 2D 오브젝트
    크기를 조정한다.

  6. 트랜스폼(Transform) 툴 : 단축키 Y
    평행이동, 회전, 스케일 툴을 하나로 합친 툴이다.

유니티의 좌표축

  • 전후 x 상하 y 좌우 z

  • 왼손 좌표계로 기억하자. 엄지 y

기즈모

  • 씬 기즈모.
    시점을 조정하는 부분. 오른쪽 위의 3축 표시

  • 투영 전환 :
    원근(Perspective) 또는 등각(Isometric)으로 전환 가능.

    • 아이소메트릭(Isometric, 등각) 뷰 :
      원근감을 없애고 보는 시점

씬 플레이 버튼

  1. 플레이 : 단축키 Ctrl + P

  2. 일시 정지: 단축키 Ctrl + Shift + P

  3. 스텝 : 단축키 Ctrl + Alt + P

컴포넌트(Component) 패턴

상속에만 의존할 때의 문제점

  1. 오히려 코드 재사용이 힘든 경우가 생길 수 있다.

    • 너무 깊이가 깊어 분석이 힘들다.
  2. 새로운 오브젝트의 생성이 힘들다.

컴포넌트 패턴이란?

  • 컴포지션(Composition) 패턴.

  • 미리 만들어진 부품을 조립해 완성된 오브젝트를 만든다.

    • 게임 오브젝트 :
      컴포넌트의 컨테이너 역할.

컴포넌트의 장점

  1. 유연한 재사용이 가능하다.

  2. 새로운 오브젝트의 생성이 쉽다.

  3. 독립성 덕분에 기능 추가와 삭제가 쉽다.

컴포넌트의 독립성

  1. 게임 오브젝트는 단순한 컨테이너

  2. 컴포넌트스스로 동작하는 독립적인 부품

  • 브로드캐스팅

이벤트 메서드

이벤트 함수의 실행 순서

  • Script lifecycle flowchart

Initialization ⇒ Physics ⇒ Input Events
⇒ Game Logic ⇒ Scene Rendering ⇒ Decommissioning

  • 가장 초기에 호출되는 함수

    1. Awake

    2. OnEnable

  • Reset은 playmode가 아닐 때, 스크립트가 부여되면 호출된다.
    더 정확히는, 처음 스크립트가 연결될 때Reset 커맨드를 사용할 때 호출된다.

  • FixedUpdate(Physics)가 필요한 이유 :

    각 컴퓨터마다 성능이 달라, Update의 호출 속도가 다르다.

    그래서 물리 연산이 Update에서 일어나면, 컴퓨터마다 다른 결과가 나올 수 있다.

    이를 피하기 위해 고정된 프레임마다 호출되는 FixedUpdate더 정밀히 물리 연산을 실행한다.

    FixedUpdate는 기본적으로 어떤 환경이어도 1초에 50번(50fps) 호출되도록 설정되어있다.

  • LateUpdate :

모든 업데이트가 끝나고 마지막으로 호출된다.

주로 카메라 연산을 위해 사용된다.

플레이어의 위치를 따라가는 등, 모든 업데이트 후 마지막으로 카메라를 이동시켜준다.

  • 가상 세계의 최신화를 위해 제공되는 Update 함수세 가지가 제공된다.
  1. FixedUpdate
    주로 물리 연산이 이루어진다.
    고정된 프레임마다 호출된다.

  2. Update
    게임 로직이 실행된다.
    프레임마다 호출된다.
    업데이트를 위한 주요 작업 함수이다.

  3. LateUpdate
    모든 업데이트가 끝나고 마지막으로 호출된다.
    카메라의 이동 등이 이루어진다.

  • 주요 이벤트 함수와 그 순서

    1. void Awake()

      오브젝트가 활성화되어있을 때, Start 함수가 호출되기 전에 호출된다.
      즉, 가장 먼저 호출된다.

    2. void OnEnable()

      스크립트가 활성화될 때마다 호출된다.

    3. void Start()

      스크립트가 활성화되어있을 때, Update의 첫 프레임 바로 전에 호출된다.
      즉, 단 한번 시작할 때 호출된다.

    4. void FixedUpdate()

      고정된 프레임마다 호출된다.

    5. void Update()

      프레임마다 호출된다.

    6. void LateUpdate()

      Update가 다 끝나고 호출된다.

    7. void OnDisable()

      스크립트가 비활성화될 때마다 호출된다.

    8. void OnDestroy()

      스크립트가 제거될 때 호출된다.

Unity를 위한 C프로그래밍

  • C++과의 차이점만 여기서 정리한다.

객체

  • 정수는 다음과 같이 사용한다.
// 정수
byte b = 16;            // 10진수
int i = 0x64;           // 16진수
long l = 0b_0010_1010;  // 2진수
// _는 사람이 구분하기 위한 것으로, 수치로써 읽히지 않는다.
  • 부동소수점은 float만 지원한다.

    • 가장 빠르게 계산되며, float 이상의 유효숫자가 필요한 일이 별로 없기 때문.
  • char2byte이며, 기본적으로 UTF-16을 지원한다.

문자열

  • System.String으로 제공된다.

  • C++과 다르게 C#에서 문자열 타입은 불변(Immutable) 타입이라 항상 새로운 인스턴스를 생성한다.
    ⇒ 성능에 주의!

    • C++에서는 문자열을 수정하면 기존 메모리에 공간을 확보해서 추가한다.

      • “Hello ” ⇒ “Hello ”+”World!” ⇒ “Hello World!”
        6 ⇒ 12
    • C#에서는 문자열을 수정하면 새로운 메모리에 할당하므로, C++보다 훨씬 많은 메모리를 차지한다.

      • “Hello ” ⇒ “Hello ”+”World!” ⇒ “Hello ” “Hello World!”
        6 ⇒ 18
    • 왜 그런가?
      참고 : https://www.pluralsight.com/guides/understanding-string-immutability-csharp

  • 문자열 보간

    • 문자열””의 앞에 $기호를 넣고, {} 중괄호 안에 변수를 넣는 것으로
      문자열을 편하게 형식화할 수 있다.

      int id = 1234;
       s = $"ID는 {id}입니다.";
  • 문자열의 활용

    • 제공되는 속성, 메소드로 여러가지 연산을 할 수 있다.
      string s에 대하여,

    • s.Length :
      **문자열의 길이**

    • s.ToLower :
      문자열 전체를 소문자로 변환

    • s.ToUpper :
      문자열 전체를 대문자로 변환

    • s == “Hello World!”
      연산자로 비교가 가능하다.

    • s.Trim() :
      **문자열의 앞뒤 공백**을 지워준다.

    • s.StartsWith(”Hello”) :
      문자열이 매개변수의 문자열로 시작하는지 판별하고 bool 값을 반환한다.

    • s.EndsWith(”World”) :
      **문자열이 매개변수의 문자열로 끝나는지** 판별하고 bool 값을 반환한다.

    • 코드 예시

      char ch = '要';
       Debug.Log($"Awake{ch}");
      
       string s = "Hello World!";
       Debug.Log($"length{s.Length}");
       int j = s.Length;
       Debug.Log($"length{j}");
      
       s = s.ToLower();
       Debug.Log(s);
      
       s = s.ToUpper();
       Debug.Log(s);
      
       if(s=="HELLO WORLD!")
       {
           Debug.Log("same");
       }
      
       s = "   HELLO WORLD!   ";
       s = s.Trim(); // s == "HELLO WORLD!"
       Debug.Log(s);
      
       if (s.StartsWith("HELLO"))
       {
           Debug.Log("start");
       }
       if (s.EndsWith("!"))
       {
           Debug.Log("end");
       }

제어문

  • 조건식은 모두 bool 타입만을 받는다.
    즉, C++과 달리 조건식 내부에서 암시적 형변환이 일어나지 않는다.

  • switch문에 문자열을 넣어줄 수 있다.

    // 문자열도 사용 가능
    string s = "Hello";
    switch (s)
    {
        case "Hello":
            Debug.Log("switch 문에서는 문자열 비교 가능!");
            break;
        case "World":
            break;
        default:
            break;
    }

0개의 댓글