Unity로 사냥 게임 만들기
이 튜토리얼에서는 Unity에서 기본 사냥 게임을 만드는 과정을 살펴보겠습니다. 이 게임에는 플레이어 이동, 동물 AI, 사격 메커니즘, 득점 시스템과 같은 요소가 포함됩니다. 다룰 내용은 다음과 같습니다.
- 프로젝트 및 환경 설정
- 플레이어 컨트롤 생성
- 동물 AI 구현
- 슈팅 메커니즘 추가
- 점수 시스템 설정
프로젝트 설정
새로운 Unity 프로젝트를 설정하고 환경을 만드는 것부터 시작해 보겠습니다.
프로젝트 생성
- Unity을 열고 새로운 3D 프로젝트를 만듭니다.
- 프로젝트 이름을
HuntingGame
로 지정하고생성
을 클릭합니다. - 프로젝트 창에서
Scripts
,Prefabs
,Materials
이라는 이름의 폴더를 만들어 자산을 정리합니다.
환경 설정하기
- 계층 구조에서 마우스 오른쪽 버튼을 클릭하고
3D 개체 > 지형
을 선택하여 지형을 만듭니다. 지형 도구
를 사용하여 텍스처를 칠하고, 나무를 추가하고, 풀이나 다른 세부 사항을 배치하여 지형을 사용자 지정합니다.- 바위와 나무 등 3D 객체를 몇 개 추가하면 주변환경이 더욱 현실적으로 보입니다.
플레이어 컨트롤 생성
다음으로, 플레이어 캐릭터를 만들고 물리 기반 동작 제어를 구현해 보겠습니다.
플레이어 캐릭터
- 계층 구조에서 마우스 오른쪽 버튼을 클릭하고
3D 개체 > 캡슐
을 선택하여 플레이어 캐릭터를 만듭니다. - 캡슐의 이름을
Player
로 바꾸고 지형 위에 배치합니다. - 물리 기반 움직임을 위해
Player
객체에Rigidbody
컴포넌트를 추가합니다. - 플레이어의 관점 역할을 할
Camera
을Player
객체의 자식으로 추가합니다.
플레이어 이동 스크립트
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float moveSpeed = 5f;
public float rotationSpeed = 100f;
private Rigidbody rb;
void Start()
{
rb = GetComponent();
rb.freezeRotation = true;
}
void FixedUpdate()
{
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = transform.forward * moveVertical * moveSpeed * Time.deltaTime;
rb.MovePosition(rb.position + movement);
float rotation = Input.GetAxis("Mouse X") * rotationSpeed * Time.deltaTime;
Quaternion turnRotation = Quaternion.Euler(0f, rotation, 0f);
rb.MoveRotation(rb.rotation * turnRotation);
}
}
Scripts
폴더에PlayerMovement.cs
이라는 이름의 새 C# 스크립트를 만듭니다.PlayerMovement
스크립트를Player
객체에 연결합니다.
동물 AI 구현
우리는 환경 속을 돌아다니고 플레이어에 반응하는 간단한 동물 AI를 만들 것입니다.
동물 조립식
- 동물(예: 사슴)에 대한 3D 모델을 가져오거나 만듭니다.
- 모델을 장면으로 끌어서 지형에 배치합니다.
- 계층 구조에서 모델을 마우스 오른쪽 버튼으로 클릭하고
Create Empty
을 선택하여 부모 객체를 만듭니다. 이름을Deer
로 지정합니다. - 3D 모델을
Deer
개체로 끌어다 놓고 변형을 재설정합니다. Deer
객체를Prefabs
폴더로 끌어서 프리팹으로 저장합니다.
동물 AI 스크립트
using UnityEngine;
using UnityEngine.AI;
public class AnimalAI : MonoBehaviour
{
public Transform[] waypoints;
private NavMeshAgent agent;
private int currentWaypoint = 0;
void Start()
{
agent = GetComponent();
agent.SetDestination(waypoints[currentWaypoint].position);
}
void Update()
{
if (agent.remainingDistance < agent.stoppingDistance)
{
currentWaypoint = (currentWaypoint + 1) % waypoints.Length;
agent.SetDestination(waypoints[currentWaypoint].position);
}
}
}
Scripts
폴더에AnimalAI.cs
이라는 이름의 새 C# 스크립트를 만듭니다.AnimalAI
스크립트를Deer
프리팹에 첨부합니다.Deer
프리팹에NavMeshAgent
컴포넌트를 추가합니다.- 빈 GameObject를 생성하고 원하는 대로 배치하여 장면에 웨이포인트를 설정합니다. 이러한 웨이포인트를
AnimalAI
스크립트의waypoints
배열에 할당합니다.
슈팅 메커니즘 추가
플레이어가 동물을 쏠 수 있는 기능을 구현하겠습니다.
촬영 스크립트
using UnityEngine;
public class PlayerShooting : MonoBehaviour
{
public Camera playerCamera;
public float range = 100f;
public GameObject impactEffect;
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
Shoot();
}
}
void Shoot()
{
RaycastHit hit;
if (Physics.Raycast(playerCamera.transform.position, playerCamera.transform.forward, out hit, range))
{
AnimalAI animal = hit.transform.GetComponent();
if (animal != null)
{
Destroy(hit.transform.gameObject);
}
GameObject impactGO = Instantiate(impactEffect, hit.point, Quaternion.LookRotation(hit.normal));
Destroy(impactGO, 2f);
}
}
}
Scripts
폴더에PlayerShooting.cs
이라는 이름의 새 C# 스크립트를 만듭니다.PlayerShooting
스크립트를Player
객체에 연결합니다.- 충격 효과(예: 입자 시스템)를 만들고 스크립트의
impactEffect
필드에 할당합니다.
점수 시스템 설정
플레이어의 성공적인 사냥을 추적하기 위해 간단한 점수 시스템을 추가하겠습니다.
점수 관리자 스크립트
using UnityEngine;
using UnityEngine.UI;
public class ScoreManager : MonoBehaviour
{
public static int score = 0;
public Text scoreText;
void Update()
{
scoreText.text = "Score: " + score.ToString();
}
public static void AddScore(int points)
{
score += points;
}
}
Scripts
폴더에ScoreManager.cs
이라는 이름의 새 C# 스크립트를 만듭니다.ScoreManager
스크립트를GameManager
이라는 이름의 새 빈 GameObject에 연결합니다.- 점수를 표시하기 위한 UI 텍스트 요소를 만들고
ScoreManager
스크립트의scoreText
필드에 할당합니다.
점수 추적을 위한 슈팅 스크립트 업데이트
void Shoot()
{
RaycastHit hit;
if (Physics.Raycast(playerCamera.transform.position, playerCamera.transform.forward, out hit, range))
{
AnimalAI animal = hit.transform.GetComponent();
if (animal != null)
{
Destroy(hit.transform.gameObject);
ScoreManager.AddScore(10);
}
GameObject impactGO = Instantiate(impactEffect, hit.point, Quaternion.LookRotation(hit.normal));
Destroy(impactGO, 2f);
}
}
결론
우리는 Unity에서 기본적인 사냥 게임을 만들었습니다. 프로젝트와 환경을 설정하고, 물리 기반 움직임으로 플레이어 컨트롤을 만들고, 동물 AI를 구현하고, 사격 메커니즘을 추가하고, 스코어링 시스템을 설정했습니다. 이 기본 지식은 더 복잡한 행동, 추가 동물, 세련된 게임 메커니즘을 포함하도록 확장하여 사냥 게임을 향상시킬 수 있습니다.