Hello Unity

공재원
∙∙조회 8

오늘은 Unity엔진을 사용해보았다.
C# 언어를 배우며 흐름을 배운다고 생각하고 있었는데 Unity엔진을 사용하니 처음 보는 단어들이 나왔다.
흐름은 비슷해 보였지만 처음 보는 언어 및 기능들에 다시 머리가 멍해졌다.
그래서 오늘은 처음 보는 언어 및 기능들을 정리해보려 한다.

오늘은 Dodge 게임에 사용 된 언어 및 기능들을 정리해보겠다.
먼저 볼 것은 작성된 코드의 흐름이다. (기능을 보기 편하게 주석 처리 해뒀다.)

PlayerController

csharp
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    [SerializeField] // 인스펙터에서 속도 조절 가능
    private float speed = 10f; // 플레이어 이동 속도

    private Rigidbody rgdbody; // 플레이어의 Rigidbody 컴포넌트

    private void Start() // 초기화
    {
        rgdbody = GetComponent<Rigidbody>(); // Rigidbody 컴포넌트 가져오기
    }

    private void Update() // 매 프레임마다 호출
    {
        Vector3 direction = Vector3.zero; // 이동 방향 초기화
        direction.x = Input.GetAxis("Horizontal"); // 좌우 이동
        direction.z = Input.GetAxis("Vertical"); // 상하 이동

        if (direction.magnitude > 1f) // 정규화
        {
            direction.Normalize(); // 방향 벡터의 크기를 1로 만들어줌
        }

        rgdbody.linearVelocity = direction * speed; // 등속도 운동 구하는 공식

        // Vector3 delta = direction * speed * Time.deltaTime; // 등속도 운동 구하는 공식
        // transform.position += delta; // 플레이어 이동
    }
}

PlayerController 코드 요약

코드한 줄 요약
using UnityEngine;Unity에서 제공하는 기능을 사용하기 위한 선언
public class PlayerController : MonoBehaviour플레이어를 제어하는 클래스를 선언하고 Unity의 MonoBehaviour를 상속
[SerializeField]private 변수도 Inspector 창에서 확인하고 수정할 수 있게 함
private float speed = 10f;이동 속도를 저장하는 실수형 변수 선언
private Rigidbody rgdbody;Rigidbody 컴포넌트를 저장할 변수 선언
private void Start()스크립트가 시작될 때 초기화 작업을 수행하는 메서드
rgdbody = GetComponent<Rigidbody>();현재 게임 오브젝트에 붙어 있는 Rigidbody 컴포넌트를 가져옴
private void Update()활성화된 동안 매 프레임마다 호출되는 메서드
Vector3 direction = Vector3.zero;이동 방향을 나타내는 3차원 벡터를 (0, 0, 0)으로 초기화
direction.x = Input.GetAxis("Horizontal");입력값을 받아 좌우 이동 방향을 설정
direction.z = Input.GetAxis("Vertical");입력값을 받아 앞뒤 이동 방향을 설정
if (direction.magnitude > 1f)이동 방향 벡터의 크기가 1보다 큰지 확인
direction.Normalize();벡터의 방향은 유지하면서 크기를 1로 정규화
rgdbody.linearVelocity = direction * speed;이동 방향과 속도를 곱해 Rigidbody의 선속도를 설정
Vector3 delta = direction * speed * Time.deltaTime;속도와 프레임 간 시간 간격을 곱해 이동 거리를 계산
transform.position += delta;계산한 이동 거리를 현재 위치에 더해 오브젝트를 이동

핵심 개념 정리

  • Vector3 : 3차원 공간의 위치나 방향을 표현하는 자료형
  • Input.GetAxis() : 키보드 등의 입력을 -1부터 1 사이의 값으로 반환
  • magnitude : 벡터의 크기를 구함
  • Normalize() : 벡터의 크기를 1로 만듦
  • Time.deltaTime : 이전 프레임부터 현재 프레임까지 걸린 시간(초)

Bullet

csharp
using UnityEngine;

public class Bullet : MonoBehaviour
{
    public float speed = 8f; // 총알 이동 속도
    private Rigidbody rgdbody; // 총알의 Rigidbody 컴포넌트

    private void Start() // 초기화
    {
        rgdbody = GetComponent<Rigidbody>(); // Rigidbody 컴포넌트 가져오기
        rgdbody.linearVelocity = transform.forward * speed; // 총알이 발사되는 방향으로 속도 적용
    }

    private void OnTriggerEnter(Collider other) // 충돌 감지
    {
        if (other.CompareTag("Player")) // 충돌한 오브젝트가 Player라면
        {
            other.gameObject.SetActive(false); // Player 오브젝트 비활성화
        }

        if(!other.CompareTag("Bullet")) // 충돌한 오브젝트가 Bullet이라면
        {
            Destroy(gameObject); // 총알 오브젝트 제거
        }
    }
    // private void OnTriggerStay(Collider other){} // 충돌 중일 때 호출

    // private void onTriggerExit(Collider other){} // 충돌이 끝났을 때 호출
}

Bullet 코드 요약

코드한 줄 요약
public class Bullet : MonoBehaviour총알을 제어하는 클래스를 선언하고 Unity의 MonoBehaviour를 상속
public float speed = 8f;총알의 이동 속도를 저장하는 실수형 변수 선언
private Rigidbody rgdbody;Rigidbody 컴포넌트를 저장할 변수 선언
private void Start()스크립트가 시작될 때 초기화 작업을 수행하는 메서드
GetComponent<Rigidbody>()현재 오브젝트에 붙어 있는 Rigidbody 컴포넌트를 가져옴
rgdbody.linearVelocity = transform.forward * speed;오브젝트의 앞쪽 방향으로 속도를 설정
private void OnTriggerEnter(Collider other)다른 오브젝트가 Trigger 영역에 들어왔을 때 호출되는 메서드
other.CompareTag("Player")충돌한 오브젝트의 Tag가 Player인지 확인
other.gameObject.SetActive(false);충돌한 오브젝트를 비활성화
!other.CompareTag("Bullet")충돌한 오브젝트의 Tag가 Bullet이 아닌지 확인
Destroy(gameObject);현재 총알 오브젝트를 제거
OnTriggerStay(Collider other)다른 오브젝트가 Trigger 영역 안에 머무는 동안 호출되는 메서드
OnTriggerExit(Collider other)다른 오브젝트가 Trigger 영역에서 벗어났을 때 호출되는 메서드

핵심 개념 정리

  • transform.forward : 오브젝트가 바라보는 앞쪽 방향을 나타내는 벡터
  • CompareTag() : 오브젝트의 Tag가 지정한 값과 일치하는지 확인
  • ! : 조건의 결과를 반대로 바꾸는 논리 NOT 연산자
  • SetActive(false) : 게임 오브젝트를 비활성화
  • Destroy() : 게임 오브젝트를 제거
  • Collider other : 충돌 이벤트에서 상대 오브젝트의 Collider 정보를 전달받음
  • gameObject : 해당 컴포넌트가 붙어 있는 게임 오브젝트를 가리킴

BulletSpawner

csharp
using UnityEditor.Rendering;
using UnityEngine;

public class BulletSpawner : MonoBehaviour
{
    public GameObject bulletPrefab; // 총알 프리팹
    private Transform target; // 플레이어의 Transform 컴포넌트

    public float interval = 1f; // 총알 발사 간격 (초)
    private float timer = 0; // 타이머 변수


    private void Start() // 초기화
    {
        GameObject findGo = GameObject.FindWithTag("Player"); // Player 태그를 가진 오브젝트 찾기
        target = findGo.transform; // Player 오브젝트의 Transform 컴포넌트 가져오기
    }

    private void Update() // 매 프레임마다 호출
    {
        timer += Time.deltaTime; // 타이머 증가
        if (timer > interval) // 타이머가 발사 간격보다 크면 총알 발사
        {
            timer = 0f; // 타이머 초기화
            Spawn(); // 총알 발사
        }
    }

    private void Spawn() // 총알 발사
    {
        Vector3 position = transform.position; // 총알이 발사될 위치 (BulletSpawner 오브젝트의 위치)
        Vector3 direction = (target.position - transform.position); // 총알이 향할 방향 (Player 오브젝트의 위치 - BulletSpawner 오브젝트의 위치)
        direction.Normalize(); // 방향 벡터의 크기를 1로 만들어줌
        Quaternion rotation = Quaternion.LookRotation(direction); // 총알이 향할 방향으로 회전 (LookRotation은 방향 벡터를 받아서 회전값을 반환)
        Instantiate(bulletPrefab, position, rotation); // 총알 프리팹을 생성 (위치, 회전값)
    }
}

BulletSpawner 코드 요약

코드한 줄 요약
using UnityEditor.Rendering;Unity 에디터 렌더링 관련 기능을 사용하기 위한 네임스페이스 선언
public class BulletSpawner : MonoBehaviour총알 생성 기능을 담당하는 클래스를 선언하고 MonoBehaviour를 상속
public GameObject bulletPrefab;생성할 총알 프리팹을 저장하는 변수
private Transform target;목표 오브젝트의 위치와 회전 정보를 저장하는 변수
public float interval = 1f;총알 발사 간격을 초 단위로 설정
private float timer = 0;발사 간격을 계산하기 위한 타이머 변수
GameObject.FindWithTag("Player")Player 태그를 가진 게임 오브젝트를 찾아 반환
target = findGo.transform;찾은 플레이어의 Transform 컴포넌트를 저장
timer += Time.deltaTime;이전 프레임부터 지난 시간을 타이머에 누적
if (timer > interval)타이머가 설정한 발사 간격을 초과했는지 확인
timer = 0f;타이머를 0으로 초기화
Spawn();총알 생성 메서드를 호출
private void Spawn()총알 생성 작업을 수행하는 메서드
Vector3 position = transform.position;총알이 생성될 위치를 현재 오브젝트의 위치로 설정
Vector3 direction = (target.position - transform.position);현재 위치에서 목표 위치를 향하는 방향 벡터를 계산
direction.Normalize();방향 벡터의 크기를 1로 정규화
Quaternion.LookRotation(direction);지정한 방향을 바라보도록 회전값을 계산
Instantiate(bulletPrefab, position, rotation);지정한 위치와 회전값으로 총알 프리팹을 생성

핵심 개념 정리

  • GameObject.FindWithTag() : 특정 Tag를 가진 게임 오브젝트를 찾음
  • Transform : 오브젝트의 위치, 회전, 크기 정보를 관리하는 컴포넌트
  • Time.deltaTime : 이전 프레임부터 현재 프레임까지 걸린 시간(초)
  • Vector3 : 3차원 공간의 위치나 방향을 표현하는 자료형
  • Normalize() : 벡터의 방향은 유지하면서 크기를 1로 만듦
  • Quaternion.LookRotation() : 특정 방향을 바라보도록 회전값을 계산
  • Instantiate() : 프리팹이나 오브젝트를 복제하여 생성
  • Spawn() : 총알 생성 작업을 수행하도록 직접 만든 메서드

매일 검은 콘솔 화면 창만 보다가 Unity 엔진이라는 것을 사용해보니 가슴이 두근거린다.
아직은 큰 기능은 사용하지 못하지만 점차 실력이 늘어날 것 생각하니 벌써 머릿속에 어떤 게임을 만들어 봐야 하는 생각도 든다.
처음 보는 기능들과 처음 보는 언어들이 아직은 낯설기만 하지만 C#을 처음 배웠을 때처럼 차차 알아가면 된다고 생각한다.
얼른 나의 게임을 만들어보고 플레이 해보고 싶다.