Hello Unity
오늘은 Unity엔진을 사용해보았다.
C# 언어를 배우며 흐름을 배운다고 생각하고 있었는데 Unity엔진을 사용하니 처음 보는 단어들이 나왔다.
흐름은 비슷해 보였지만 처음 보는 언어 및 기능들에 다시 머리가 멍해졌다.
그래서 오늘은 처음 보는 언어 및 기능들을 정리해보려 한다.
오늘은 Dodge 게임에 사용 된 언어 및 기능들을 정리해보겠다.
먼저 볼 것은 작성된 코드의 흐름이다. (기능을 보기 편하게 주석 처리 해뒀다.)
PlayerController
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
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
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#을 처음 배웠을 때처럼 차차 알아가면 된다고 생각한다.
얼른 나의 게임을 만들어보고 플레이 해보고 싶다.



