Chapter 3-1. 파괴 가능한 환경들 : 광석 채굴

Date:     Updated:

카테고리:

태그:

인프런에 있는 케이디님의 [유니티 3D] 실전! 생존게임 만들기 - Advanced 강의를 듣고 정리한 필기입니다. 😀
🌜 강의 들으러 가기 Click


Chapter 3. 파괴 가능한 환경들

광석 채굴

바위를 곡괭이로 부수면 바위가 부숴지는 이펙트 효과를 구현해 보자.

🚖 바위 오브젝트 추가

  • Rock
    • 👉 빈 오브젝트이며 바위의 Transform을 대신 담당한다.
    • Tag로 "Rock"을 지정하여 바위로 구분되게 하였다.
    • Sphere Collider 로 바위의 콜라이더가 되 줄 것이다.
      • Sphere Collider 붙여 주었음. 반지름 1, 중심점 (0, 0.1, 0) image
    • Rock_Mesh
      • 바위가 깨지기 전의 평소 바위 오브젝트로 깨질 때 비활성화
    • Rock_Debris
      • 👉 빈 오브젝트이며 26 개의 ‘바위 파편’ Mesh 오브젝트들로 이루어져 있다.
      • 평소엔 비활성화, 바위가 깨질 때 활성화할 오브젝트
        • 파편 하나 하나 들은 Mesh 를 가지고 있고
        • Rigidbody 를 가진다.
          • Rock_Debris가 활성화되면 자동으로 중력과 마찰력 등등의 물리 현상에 의해 파편 오브젝트들이 퍼져 날라가게 된다.
            • Mass 0.1 질량을 가볍게 하여 잘 날라가게 하였다.
            • Drag 1 (저항)
            • Augular drag 1 (밀리는 정도)
        • Box Collider를 가진다.
          • 파편들끼리 서로 충돌 체크를 할 수 있다.
          • Rigidbody 에 의해 물리적인 충돌이 일어나면 Collider를 사용하여 물리적 충돌을 체크하고 날라감.

image

image

image

Rock_MeshRock_Debris의 크기는 150, 150, 150 으로 키워주고 위치는 원점으로 맞추었다. (Rock 기준 원점. 실제 월드 좌표 위치는 부모인 Rock이 대신 결정해줄 것이다.) Rock_Debris는 비활성화 해두고 게임을 시작하자.


🚖 바위 채굴하기

📜Rock.cs

Rock에 붙여준다.

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

public class Rock : MonoBehaviour
{
    [SerializeField]
    private int hp; // 바위의 체력. 0 이 되면 파괴됨

    [SerializeField]
    private int destroyTime; // 파괴된 바위의 파편들의 생명 (이 시간이 지나면 Destroy)

    [SerializeField]
    private SphereCollider col; // 구체 콜라이더. 바위 파괴시키면 비활성화시키 ㄹ것.

    [SerializeField]
    private GameObject go_rock;  // 일반 바위 오브젝트. 평소에 활성화, 바위 깨지면 비활성화
    [SerializeField]
    private GameObject go_debris;  // 깨진 바위 오브젝트. 평소에 비활성화, 바위 깨지면 활성화

    public void Mining()
    {
        hp--;
        if (hp <= 0)
            Destruction();
    }

    private void Destruction()
    {
        col.enabled = false;
        Destroy(go_rock);

        go_debris.SetActive(true);
        Destroy(go_debris, destroyTime);
    }
}

평상시엔 go_rock 오브젝트 활성화 (“Rock_Mesh”), 깨진 파편들의 모음인 go_debris 오브젝트 비활성화 (“Rock_Debris”)

  • Mining() 👉 채굴.
    • 한번 실행 때마다 hp 를 1 씩 깎는다.
    • public. 📜PickaxeController.cs 곡괭이로 바위를 캘 때 호출.
  • Destruction() 👉 hp 바위의 체력이 0이 되어 파괴되면 바위 파괴
    • Rock에 붙어서 바위의 Collider 역할을 하는 SphereCollider 컴포넌트 비활성화
      • 이 바위는 파괴된 바위이므로 더 이상 충돌처리 되지 않게 하기 위하여
    • go_rock 오브젝트 파괴
    • go_debris 오브젝트 활성화
      • 👉 파편들은 Rigidbody, Collider 를 가지고 있어 활성화 되자마자 각자 부딪쳐 날라가게 됨
      • destroyTime만큼의 시간을 가진 후 go_debris 오브젝트도 파괴

image


📜PickaxeController.cs

곡괭이로 바위를 한번 때릴 때마다 Mining() 바위의 체력을 1 씩 깎음

    protected override IEnumerator HitCoroutine()
    {
        while (isSwing)
        {
            if (CheckObject())
            {
                if (hitInfo.transform.tag == "Rock")
                {
                    hitInfo.transform.GetComponent<Rock>().Mining();
                }
                isSwing = false;
                Debug.Log(hitInfo.transform.name);
            }
            yield return null;
        }
    }
                if (hitInfo.transform.tag == "Rock")
                {
                    hitInfo.transform.GetComponent<Rock>().Mining();
                }

피격한 충돌 대상의 태그가 “Rock”이라면 충돌한 그 오브젝트(Rock)의 Mining() 함수 호출. 바위의 체력 1 씩 감소.


🚖 바위 때릴 때 마다 이펙트 효과 주기

때릴 때마다 때린 위치에 크기를 대폭 줄인 go_debris 를 활성화 해주면 된다!

  • 이펙트 효과로써 사용할 “Rock_Debris” 3 D 모델을 임포트 한 뒤 이름을 Rock_Effect_Prefab으로 변경.
  • 파편 오브젝트들에게 Rigidbody 와 Box Collider를 붙여주자.
    • 이펙트 효과니까 질량 0.0001 로 주어서 엄청 가볍게 해줬고
    • drag 와 augular drag 는 1 씩
  • 활성화 되기만 하면 알아서 자식 파편 오브젝트들이 Rigidbody, Collider에 의해서 서로 부딪치고 중력의 영향을 받는 등 물리적인 힘에 의해 팍팍 날아가게 된다.
  • 🟦프리팹화 해주기
    • 게임 도중에 바위를 때릴 때만 생성해줄 것이기 때문에


📜Rock.cs

    [SerializeField]
    private GameObject go_effect_prefabs;  // 채굴 이펙트 효과로 사용할 깨진 바위 오브젝트.

    public void Mining()
    {
        GameObject clone = Instantiate(go_effect_prefabs, col.bounds.center, Quaternion.identity);
        Destroy(clone, destroyTime);

        hp--;
        if (hp <= 0)
            Destruction();
    }
  • Mining()
    • 바위를 때릴 때마다
      • 바위 이펙트 효과로 사용할 오브젝트를 생성하고 destroyTime 시간 뒤 파괴.
        • 생성 위치는 Rock의 Sphere Collider 의 정 가운데 위치 벡터
        • go_effect_prefabs에 미리 만들어둔 프리팹 할당
      • 바위의 체력 1 씩 감소
      • 바위의 체력이 0 이하면 파괴

image


🚖 바위 때릴 때, 파괴시 사운드 재생

📜Rock.cs

    [SerializeField]
    private AudioSource audioSource;
    [SerializeField]
    private AudioClip effect_sound_1;  // 바위 때릴 때 사운드
    [SerializeField]
    private AudioClip effect_sound_2;  // 바위가 파괴될 때 사운드

    public void Mining()
    {
        // 바위 때릴 때마다 effect_sound_1 오디오 클립 재생
        audioSource.clip = effect_sound_1;
        audioSource.Play();

        GameObject clone = Instantiate(go_effect_prefabs, col.bounds.center, Quaternion.identity);
        Destroy(clone, destroyTime);

        hp--;
        if (hp <= 0)
            Destruction();
    }

    private void Destruction()
    {
        // 바위가 파괴될 때 effect_sound_2 오디오 클립 재생
        audioSource.clip = effect_sound_2;
        audioSource.Play();

        col.enabled = false;
        Destroy(go_rock);

        go_debris.SetActive(true);
        Destroy(go_debris, destroyTime);
    }

image

오디오 클립 할당하고 Audio Source 컴포넌트 붙이기


🚖 Rock 프리팹화

Rock도 게임을 실행하면 게임 월드에 랜덤으로 여러개 배치가 되야 하므로 일단 🟦프리팹화 시키자. 언제든지 게임 월드에 찍어낼 수 있도록.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

댓글남기기