게임프로그래밍/Unity_C#

[멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(2025.05.20-2025.05.23)

shine94 2025. 5. 25. 16:44

해당 글은 유니티 게임 개발 수업 후 정리한 글입니다

   https://bootcamp.likelion.net/school/kdt-ugm-5th

 

유니티 게임 개발 5기 : 멋사 부트캠프

개발부터 출시까지! 나만의 게임을 세상에 선보이는 유니티 부트캠프

bootcamp.likelion.net

 

 

 

 

2025.05.20 (화)

* Start()

   객체가 생성될 때 딱 1번 실행되는 이벤트 함수

 

* Update()

   매프래임 마다 실행되는 이벤트 함수

 

* 캐릭터 움직이기

using UnityEngine;

public class Movement : MonoBehaviour
{
    private float moveSpeed = 5.0f;
    
    private void Start()
    {
        transform.position = new Vector3(0, 0, 0);
    }

    private void Update()
    {
        // Input System (Old-Legacy)
        // 입력값에 대한 약속된 시스템
        // if (Input.GetKey(KeyCode.W))
        //     transform.position += Vector3.forward * (moveSpeed * Time.deltaTime);
        //     
        // if (Input.GetKey(KeyCode.S))
        //     transform.position += Vector3.back * (moveSpeed * Time.deltaTime);
        //     
        // if (Input.GetKey(KeyCode.A))
        //     transform.position += Vector3.left * (moveSpeed * Time.deltaTime);
        //     
        // if (Input.GetKey(KeyCode.D))
        //     transform.position += Vector3.right * (moveSpeed * Time.deltaTime);
        
        // 부드럽게 증감하는 값
        // float horizontal = Input.GetAxis("Horizontal");     // X
        // float vertical = Input.GetAxis("Vertical");         // Z
        
        // 딱 떨어지는 값
        float horizontal = Input.GetAxisRaw("Horizontal");     // X
        float vertical = Input.GetAxisRaw("Vertical");         // Z

        Vector3 direction = new Vector3(horizontal, 0, vertical);
        //Debug.Log($"현재 입력 : {direction}");
        
        transform.position += direction * moveSpeed * Time.deltaTime;
    }
}

 

* 값 타입(Value Type)

   스택(stack) 영역에 저장

   값을 직접 저장

   대입 시 값 복사

   서로 독립적인 데이터가 됨

 

* 조 타입(Reference Type)

   힙(heap) 영역에 실제 데이터 저장, 스택에는 참조(주소) 저장

   대입 시 참조 복사가 일어남

   하나의 데이터를 여러 변수가 공유

 

2022.05.21 (수)

* 수업시간에 추천해주신 영상

https://www.youtube.com/watch?v=PAyyECsZ_Rs

https://www.youtube.com/watch?v=U4MyjA16hgY

https://www.youtube.com/watch?v=aTw7bt93Bs4

 

* Asset

   유니티에서 사용하는 리소스의 단위

 

2025.05.22 (목)

* 게임 오브젝트를 찾는 법

(1) 이름으로 찾기

   ▼ 오브젝트 이름 문자열로 GameObject를 찾음 : 이름이 중복될 경우, 첫 번째로 찾은 오브젝트만 반환

GameObject obj = GameObject.Find("오브젝트이름");

 

(2) tag로 찾기

   태그를 사전에 등록해두어야 함

 

   ▼ 태그로 지정된 첫 번째 오브젝트만 반환

GameObject obj = GameObject.FindGameObjectWithTag("태그 이름");

 

   ▼ 태그로 지정된 모든 오브젝트를 반환

GameObject[] objs = GameObject.FindGameObjectsWithTag("태그 이름");

 

* Tag : 게임 오브젝트의 별명, Layer : 게임 오브젝트의 소속

 

* GameObject의 비활성화 - gameObject.SetActive(false) : 전체 멈춤 + 자식 포함

   게임 오브젝트 자체를 비활성화

   오브젝트와 모든 컨포넌트가 작동을 멈춤

   모든 이벤트 함수도 더 이상 실행되지 않음

   자식 오브젝트들도 함께 비활성화

   Hierarchy 창에서 회색으로 표시

 

* MeshRenderer의 비활성화 - GetComponent<MeshRenderer>().enabled = false : 렌더링만 OFF + 로직 그대로

   렌더링만 비활성화

   화면에는 보이지 않지만 로직은 그대로 작동함

   모든 이벤트 함수는 계속 실행됨

   

* AddComponent<T>()

   기존 게임 오브젝트에 새 컨포넌트를 동적으로 추가

   타입은 제네릭 형식으로 전달

 

* GetComponent<T>()

   해당 게임 오브젝트에 이미 존재하는 컨포넌트를 가져옴

   없으면 null 반환

 

* Instantiate()

   프리팹 또는 기존 오브젝트를 복제해서 새 인스턴스를 생성

   일반적인으로 오브젝트 스폰이나 풀링 시스템에서 사용

 

* 즉시 파괴

   오브젝트를 즉시 메모리에서 제거

DestroyImmediate(gameObject);

 

* 지연 파괴 기능

   지정한 오브젝트를 한 프레임 후 또는 지정 시간 이후에 파괴

Destroy(gameObject);		// 한 프레임 후 파괴
Destroy(gameObject, 3f);	// 3초 후 파괴

 

* OnDestroy()

   게임 오브젝트 또는 컨포넌트가 파괴될 때, 자동으로 호출하는 이벤트 함수

 

* Edit > Project > Settings... > Input Manager

   Legacy Input System에서는 Input.GetButton("Jump")처럼 문자열 이름으로 키 입력을 처리한다

   이 방식은 프로젝트의 설정의 Input Manager에서

   미리 정의한 축(axis) 또는 버튼(button) 이름을 코드에서 직접 문자열로 참조하는 방식이다

using UnityEngine;
 
 public class Movement : MonoBehaviour
 {
     public float moveSpeed = 5f;
     
     void Update()
     {
         // 부드럽게 증감하는 값
         float horizontal = Input.GetAxis("Horizontal");
         float vertical = Input.GetAxis("Vertical");
         
         // // 딱 떨어지는 값
         // float horizontal = Input.GetAxisRaw("Horizontal");
         // float vertical = Input.GetAxisRaw("Vertical");
         
         Vector3 direction = new Vector3(horizontal, 0, vertical);
         Debug.Log($"현재 입력 : {direction}");
         
         transform.position += direction * moveSpeed * Time.deltaTime;
     }
 }

 

2025.05.23 (금)

* 파이(π) : 무리수

   원의 둘레

   지름이 1일 때, 둘레는 약 3.141591... (즉, 파이)

 

* 디그리(Degree, 도)

   일반적으로 각도를 표현할 때 사용하는 단위로, ° 기호를 사용

   유니티에서는 Transform 회전값이나 Inspector 상 각도 입력 시 기본적으로 '도' 단위를 사용

 

* 라디안(Radian)

   호도법에서 사용하는 각도 단위로

   호의 길이 / 반지름 길이 = 중심각(라디안)으로 정의

   

* 호도법(radian)

   각도를 호의 길이와 반지름의 비율로 표현하는 방식

   반지름과 호의 길이가 같을 때, 중심각을 1 라디안으로 정의

   π 라디안 = 180도, 1 라디안 ≈ 57.2958도

   2π 라디안 = 360도 (원 1바퀴)

https://www.youtube.com/watch?v=UXflutSHp9E

 

* 삼각비(Trigonometric Ratio)

   직각삼각형에서 각을 기준으로 두 변의 길이 비율을 정의한 값으로,

   대표적으로 사인(sin), 코사인(cos), 탄젠트(tan)가 있다

 

* 내적(Dot Product)

   두 벡터의 방향이 얼마나 유사한지(같은 방향인지)를 나타내는 연산

 

* 외적(Cross Product)

   두 백터에 수직인 방향의 새로운 백터를 만들어내는 연산

 

https://www.youtube.com/watch?v=4-76jesTq2I

 

* 벡터의 내적을 활용한 시야각 연산과 몬스터 AI의 FSM(Finite State Machine)

   내적(Dot Product)을 이용하면,

   몬스터가 바라보는 방향과 플레이어 방향 백터 사이의 각도를 계산할 수 있다

   이를 통해 플레이어가 시야 범위(FOV) 안에 있는지 여부를 판단할 수 있다

   FSM(Finite State Machine)

   몬스터가 Idle, Chase, Attack 등의 상태(state)를 가지며,

   특정 조건에 따라 상태 전이(state transition)가 발생하는 구조

 

* Transform.LookAt 함수

   게임 오브젝트가 지정된 대상 방향을 바라보도록 회전시키는 함수

   주로 적 캐릭터가 플레이어를 바라보게 할 때 사용한다

private void Update()
    {
        // 부드럽게 증감하는 값
        float horizontal = Input.GetAxis("Horizontal");     // X
        float vertical = Input.GetAxis("Vertical");         // Z
        
        // 크기(거리) 없이 방향 정보만 담고 있는 값
        Vector3 direction = new Vector3(horizontal, 0, vertical);
        //Debug.Log($"현재 입력 : {direction}");
        
        // 방향 벡터에 속도와 시간을 곱해서 위치 이동
        // 방향(direction)
        // 속도(moveSpeed) * 시간(Time.deltaTime) = 위치
        transform.position += direction * moveSpeed * Time.deltaTime;
        
        // 백터는 방향과 크기를 함께 가진 값으로
        // 위치(transform.position) * 방향(direction) = 최종 위치 백터
        // LookAt 함수를 통해 해당 방향으로 오브젝트가 바라보도록 회전 처리
        transform.LookAt(transform.position + direction);
    }

 

* Transform.RotateAround 함수

   게임 오브젝트가 지정된 중심점과 축을 기준으로 회전하도록 만드는 함수

   주로 카메라가 대상 주변을 도는 동작, 궤도 운동을 구현할 때 사용한다