Unity 강의 정리 6-1장: [게임 제작 : 어메이징 볼링] 회전 포신, 포탄🎮

나무에물주기·2023년 9월 7일
1

Unity

목록 보기
18/21
post-thumbnail

인프런에 있는 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리하는 글입니다!

게임 제작: 어메이징 볼링 🎳


1. 에셋 임포트: 유니티 Assets Store에서 가져오기 📦

유니티의 Assets Store에서는 다양한 무료 및 유료 에셋을 제공한다. 이번 게임 "어메이징 볼링"에서는 다음의 무료 에셋을 사용한다:

  • Unity Particle Pack: 다양한 파티클 효과를 제공한다.
  • Free Music Bundle: 게임 배경음악을 위한 무료 음악 모음이다.
  • 8-Bit Sfx: 8비트 스타일의 사운드 이펙트 모음이다.

에셋 임포트 방법

  1. Unity Editor를 열고, Window > Asset Store를 선택한다.
  2. 검색창에 필요한 에셋 이름을 입력하고 검색한다.
  3. 원하는 에셋을 선택 후, Download 또는 Import를 클릭한다.


2. 회전 포신 만들기 🔄

오브젝트 구성

  • Ball Barrel Model: 볼링공을 발사할 포신의 모양이 될 오브젝트이다.
  • Shooter Pivot: 이 오브젝트는 회전 포신을 제어한다.

코드 구현: ShooterRotator.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;

public class ShooterRotator : MonoBehaviour
{
    private enum RotateState
    {
        Idle, Vertical, Horizontal, Ready
    }
    private RotateState state = RotateState.Idle;

    public float verticalRotateSpeed = 360f;
    public float horizontalRotateSpeed = 360f;

    private void Update()
    {
        switch (state)
        {
            case RotateState.Idle:
                if (Input.GetButtonDown("Fire1"))
                {
                    state = RotateState.Horizontal;
                }
                break;
            case RotateState.Horizontal:
                if (Input.GetButton("Fire1"))
                {
                    transform.Rotate(new Vector3(0, horizontalRotateSpeed * Time.deltaTime, 0));
                }
                else if (Input.GetButtonUp("Fire1"))
                {
                    state = RotateState.Vertical;
                }
                break;
            case RotateState.Vertical:
                if (Input.GetButton("Fire1"))
                {
                    transform.Rotate(new Vector3(-verticalRotateSpeed * Time.deltaTime, 0, 0));
                }
                else if (Input.GetButtonUp("Fire1"))
                {
                    state = RotateState.Ready;
                }
                break;
            case RotateState.Ready:
                break;
        }
    }
}

이 코드는 Shooter Pivot 오브젝트에 부착되어, 발사 버튼(Fire1)에 따라서 포신의 각도를 조절한다.

  • private enum RotateState: 포신의 현재 상태를 나타내는 열거형. Idle, Vertical, Horizontal, Ready 총 4가지 상태가 있다.
  • private RotateState state = RotateState.Idle;: 초기 상태를 Idle로 설정한다.
  • public float verticalRotateSpeed = 360f;: 수직 회전 속도를 설정한니다.
  • public float horizontalRotateSpeed = 360f;: 수평 회전 속도를 설정합니다.
  • private void Update(): 프레임마다 상태를 체크하고, 해당 상태에 따라 동작을 수행한다.

상세 동작 설명

  1. Idle 상태: 게임이 시작하거나 발사가 완료된 후, 포신은 Idle 상태로 돌아간다. 이 상태에서는 'Fire1' 버튼을 누르면 Horizontal 상태로 전환된다.
  2. Horizontal 상태: 'Fire1' 버튼을 누르고 있는 동안, 포신은 수평 방향으로 회전한다.
  3. Vertical 상태: 'Fire1' 버튼을 뗀 후, 다시 누르면 수직 방향으로 회전한다.
  4. Ready 상태: 수직 회전이 완료되면, 발사 준비가 완료된 상태이다. 이 상태에서 실제 발사 로직을 구현할 수 있다.

3. 포탄 및 바닥 오브젝트 만들기 💣

오브젝트 구성

  • Ball Prefab: 볼링공의 모양과 물리적 특성을 설정한다.
  • Ball Spawner: 볼링공을 발사하는 위치를 결정한다.


4. Import 받은 에셋 프리팹으로 만들기 🛠️

임포트한 에셋을 게임에 적용하기 위해선 프리팹(Prefab)으로 만드는 과정이 필요하다. 특히 파티클 시스템에서는 다음과 같은 옵션을 설정해야 한다.

Particle System 설정

  • Looping: 파티클이 계속해서 재생되도록 설정한다.
  • Play On Awake: 오브젝트가 활성화될 때 자동으로 파티클을 재생한다.


5. 포탄 구현: Ball.cs 🎳

포탄의 구성요소

  • Particle System: 발사되거나 폭발할 때 나타나는 효과를 구현한다.
  • Audio Source: 발사 소리나 폭발 소리 등을 재생한다.

Ball.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Ball : MonoBehaviour
{
    public ParticleSystem explosionParticle;
    public AudioSource explosionAudio;

    public float maxDamage = 100f;
    public float explosionForce = 1000f;
    public float lifeTime = 10f;

    private void Start()
    {
        Destroy(gameObject, lifeTime);
    }

    private void OnTriggerEnter(Collider other)
    {
        explosionParticle.transform.parent = null;

        explosionParticle.Play();
        explosionAudio.Play();

        Destroy(explosionParticle.gameObject, explosionParticle.duration);
        Destroy(gameObject);
    }
}

변수 설명

  • public ParticleSystem explosionParticle: 폭발 효과를 나타내는 파티클 시스템이다.
  • public AudioSource explosionAudio: 폭발 소리를 재생하는 오디오 소스이다.
  • public float maxDamage = 100f: 포탄이 가할 수 있는 최대 데미지이다.
  • public float explosionForce = 1000f: 폭발의 힘을 나타낸다.
  • public float lifeTime = 10f: 포탄의 수명이다.

메서드 설명

  • private void Start(): 게임 오브젝트가 생성되면서 호출되는 메서드로, 여기에서 포탄의 수명을 설정한다.
  • private void OnTriggerEnter(Collider other): 다른 오브젝트와 충돌이 감지되면 호출되는 메서드로, 폭발 효과와 소리를 재생하고, 포탄을 파괴한다.

정리 📝

이벤트 기반 입력 처리

  • ShooterRotator.cs에서 Unity의 Input 클래스를 이용하여 사용자의 입력을 이벤트 기반으로 처리한다. 이를 통해 게임 오브젝트의 상태를 더욱 정밀하게 제어할 수 있다.

상태 기계 (Finite State Machine)

  • ShooterRotator.cs 내에서 포신의 상태를 열거형 (enum)으로 관리한다. 이는 상태 기계(Finite State Machine)의 간단한 형태로 볼 수 있으며, 복잡한 로직을 효과적으로 관리할 수 있다.

물리 시뮬레이션과 콜라이더

  • Ball.cs에서는 Unity의 물리 엔진을 활용하여 실시간 충돌 감지를 한다. 이를 위해 콜라이더와 트리거 이벤트를 활용한다.

오디오와 비주얼 효과

  • 게임에서는 파티클 시스템과 오디오 소스를 활용하여 폭발 효과와 소리를 구현한다. 이는 게임에 몰입도를 높이는 중요한 요소이다.

프리팹과 에셋 관리

  • 유니티의 에셋 관리 기능을 통해 외부 에셋을 손쉽게 임포트하고, 프리팹을 통해 재사용 가능한 게임 오브젝트를 생성한다.
profile
개인 공부를 정리함니다

0개의 댓글