Carrot
본문 바로가기
Unity/멋쟁이사자처럼 부트캠프

[멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(41일차) - 알고리즘 (4)

by 독기품은토끼 2025. 7. 15.
✅ 오늘의 학습 목표
1. 알고리즘 (4)
2. 교재

 

1. 정렬 알고리즘

1. 병합 정렬 (Merge Sort)

계속해서 분할 및 정렬한 이후에 합치는 정렬 O(nlogn)

using UnityEngine;

public class MergeSort : MonoBehaviour
{
    private int[] array = { 5, 2, 1, 8, 3, 7, 6, 4 };

    void Start()
    {
        Debug.Log("정렬 전 : " + string.Join(", ", array));

        MSort(array, 0, array.Length - 1);
        Debug.Log("정렬 후 : " + string.Join(", ", array));
    }

    private void MSort(int[] arr, int left, int right)
    {
        if (left < right)
        {
            int mid = left + (right - left) / 2;

            MSort(arr, left, mid);
            MSort(arr, mid + 1, right);

            Merge(arr, left, mid, right);
        }
    }

    private void Merge(int[] arr, int left, int mid, int right)
    {
        int n1 = mid - left + 1; // 왼쪽 배열 크기
        int n2 = right - mid; // 오른쪽 배열 크기

        int[] leftArr = new int[n1]; // 임시 배열 크기
        int[] rightArr = new int[n2];

        for (int i = 0; i < n1; i++) // 왼쪽 배열 값 초기화
            leftArr[i] = arr[left + i];

        for (int i = 0; i < n2; i++) // 오른쪽 배열 값 초기화
            rightArr[i] = arr[mid + 1 + i];

        int j = left; // 시작점
        int u = 0, v = 0; // 반복문용 임시 변수

        while (u < n1 && v < n2)
        {
            if (leftArr[u] <= rightArr[v])
            {
                arr[j] = leftArr[u];
                u++;
            }
            else
            {
                arr[j] = rightArr[v];
                v++;
            }

            j++;
        }

        while (u < n1) // 왼쪽 배열이 남았다면
        {
            arr[j] = leftArr[u];
            u++;
            j++;
        }

        while (v < n2) // 오른쪽 배열이 남았다면
        {
            arr[j] = rightArr[v];
            v++;
            j++;
        }
    }
}

 

 

2. 교재

🥕 96페이지부터 시작!
※ 참고 : 슈팅 게임을 구현할 예정이나 오늘 수업은 복습 느낌이 강하다.
 

인생 유니티 교과서 | 이영호

유니티 게임 개발 탑티어 강의! 버전 6로 전면 개정! [2021 세종도서 학술 부문 우수 도서 선정] 이 책은 지난 2024년 10월 17일 발표된 유니티 버전 6에 맞춰 전폭적인 기능 설명과 메뉴를 전면 개편

ebook-product.kyobobook.co.kr

 

1. Camera

 

게임뷰에 카메라를 2개 세팅하려면

카메라를 2개 배치해주고 인스펙터 창에서 Output에 Viewport Rect 값을 조절해주면 된다.

  • Viewport Rect에서 X, Y는 시작 위치고, W, H는 가로/세로 크기다.
  • 카메라끼리 서로 다른 Culling Mask 써서 서로 다른 오브젝트만 보이게 설정도 가능하다.

 

2. Light

 

씬에 조명이 여러 개 있을 때 Light Explorer 창을 통해서 관리할 수 있다 (Window → Rendering → Light Explorer)

 

 

3. Movement

using UnityEngine;

public class PlayerMove : MonoBehaviour
{
    void Update()
    {
        // 월드 방향 이동
        transform.position += Vector3.forward * 5 * Time.deltaTime;
        
        // 로컬 방향 이동
        transform.Translate(Vector3.forward * 5 * Time.deltaTime); // Space.Self
        
        // 월드 방향 이동
        transform.Translate(Vector3.forward * 5 * Time.deltaTime, Space.World);

        transform.rotation = Quaternion.identity; // (0, 0, 0)
        transform.rotation = Quaternion.Euler(new Vector3(30, 60, 120)); // 오일러 -> 쿼터니언

        Debug.Log(transform.rotation.eulerAngles); // 쿼터니언 -> 오일러


        var newRotation = transform.rotation.eulerAngles + Vector3.up * 5 * Time.deltaTime;
        transform.rotation = Quaternion.Euler(newRotation);

        transform.Rotate(Vector3.up * 5 * Time.deltaTime); // Space.Self
        
        transform.Rotate(Vector3.up * 5 * Time.deltaTime, Space.World);

        transform.RotateAround(Vector3.zero, Vector3.up, 5 * Time.deltaTime);

        transform.LookAt(Vector3.zero);
    }
}

 

 

4. Prefab

  • Origin Prefab : Scene에 배치된 게임 오브젝트를 처음 Prefab으로 만든 원본

  • Nested Prefab : Prefab 안에 다른 Prefab이 있는 계층구조 프리팹

  • Varient Prefab : 원본 Prefab을 상속하여 부모의 구조나 속성을 유지하고 개별적 특성을 갖는 프리팹 (Origin에서 우클릭 → Create Variant)