Unity로 사냥 게임 만들기

이 튜토리얼에서는 Unity에서 기본 사냥 게임을 만드는 과정을 살펴보겠습니다. 이 게임에는 플레이어 이동, 동물 AI, 사격 메커니즘, 득점 시스템과 같은 요소가 포함됩니다. 다룰 내용은 다음과 같습니다.

  • 프로젝트 및 환경 설정
  • 플레이어 컨트롤 생성
  • 동물 AI 구현
  • 슈팅 메커니즘 추가
  • 점수 시스템 설정

프로젝트 설정

새로운 Unity 프로젝트를 설정하고 환경을 만드는 것부터 시작해 보겠습니다.

프로젝트 생성

  1. Unity을 열고 새로운 3D 프로젝트를 만듭니다.
  2. 프로젝트 이름을 HuntingGame로 지정하고 생성을 클릭합니다.
  3. 프로젝트 창에서 Scripts, Prefabs, Materials이라는 이름의 폴더를 만들어 자산을 정리합니다.

환경 설정하기

  1. 계층 구조에서 마우스 오른쪽 버튼을 클릭하고 3D 개체 > 지형을 선택하여 지형을 만듭니다.
  2. 지형 도구를 사용하여 텍스처를 칠하고, 나무를 추가하고, 풀이나 다른 세부 사항을 배치하여 지형을 사용자 지정합니다.
  3. 바위와 나무 등 3D 객체를 몇 개 추가하면 주변환경이 더욱 현실적으로 보입니다.

플레이어 컨트롤 생성

다음으로, 플레이어 캐릭터를 만들고 물리 기반 동작 제어를 구현해 보겠습니다.

플레이어 캐릭터

  1. 계층 구조에서 마우스 오른쪽 버튼을 클릭하고 3D 개체 > 캡슐을 선택하여 플레이어 캐릭터를 만듭니다.
  2. 캡슐의 이름을 Player로 바꾸고 지형 위에 배치합니다.
  3. 물리 기반 움직임을 위해 Player 객체에 Rigidbody 컴포넌트를 추가합니다.
  4. 플레이어의 관점 역할을 할 CameraPlayer 객체의 자식으로 추가합니다.

플레이어 이동 스크립트

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);
    }
}
  1. Scripts 폴더에 PlayerMovement.cs이라는 이름의 새 C# 스크립트를 만듭니다.
  2. PlayerMovement 스크립트를 Player 객체에 연결합니다.

동물 AI 구현

우리는 환경 속을 돌아다니고 플레이어에 반응하는 간단한 동물 AI를 만들 것입니다.

동물 조립식

  1. 동물(예: 사슴)에 대한 3D 모델을 가져오거나 만듭니다.
  2. 모델을 장면으로 끌어서 지형에 배치합니다.
  3. 계층 구조에서 모델을 마우스 오른쪽 버튼으로 클릭하고 Create Empty을 선택하여 부모 객체를 만듭니다. 이름을 Deer로 지정합니다.
  4. 3D 모델을 Deer 개체로 끌어다 놓고 변형을 재설정합니다.
  5. 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);
        }
    }
}
  1. Scripts 폴더에 AnimalAI.cs이라는 이름의 새 C# 스크립트를 만듭니다.
  2. AnimalAI 스크립트를 Deer 프리팹에 첨부합니다.
  3. Deer 프리팹에 NavMeshAgent 컴포넌트를 추가합니다.
  4. 빈 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);
        }
    }
}
  1. Scripts 폴더에 PlayerShooting.cs이라는 이름의 새 C# 스크립트를 만듭니다.
  2. PlayerShooting 스크립트를 Player 객체에 연결합니다.
  3. 충격 효과(예: 입자 시스템)를 만들고 스크립트의 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;
    }
}
  1. Scripts 폴더에 ScoreManager.cs이라는 이름의 새 C# 스크립트를 만듭니다.
  2. ScoreManager 스크립트를 GameManager이라는 이름의 새 빈 GameObject에 연결합니다.
  3. 점수를 표시하기 위한 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를 구현하고, 사격 메커니즘을 추가하고, 스코어링 시스템을 설정했습니다. 이 기본 지식은 더 복잡한 행동, 추가 동물, 세련된 게임 메커니즘을 포함하도록 확장하여 사냥 게임을 향상시킬 수 있습니다.