Chapter 3-3. 파괴 가능한 환경들 : 나뭇 가지 베기, 풀 베기

Date:     Updated:

카테고리:

태그:

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

Chapter 3. 파괴 가능한 환경들


나뭇가지 베기

🚖 나뭇 가지 오브젝트

빈 오브젝트 Branch를 만들고 Transform 위치 회전 값은 부모인 얘가 담당하게 한다.

image

branch 나뭇가지 3 D 모델을 임포트.

  • 나뭇 가지가 맞았는지 알아야 하므로 Box Collider도 붙여 준다.
    • Is Trigger에 체크한다. 나뭇가지를 때릴 때나 플레이어가 나뭇가지를 지나갈 때 관통할 수 있도록.
      • 다만 Rigidbody가 없어 중력에 의해 떨어지지는 않는다!
  • Tag 로 “Twig”를 붙여주었다.
    • Rock과 같이 때린게 나뭇 가지라면 처리를 다르게 해주어야 하니까

image


🚖 나뭇가지 때릴때 생성할 파티클 시스템

나뭇가지를 한번 칠 때마다 나뭇 잎들이 튀는 파티클 시스템을 만들어 보자.

image

이름은 Leaf_Hit_Effect. 다 만든 후에는 나뭇 가지를 칠 때만 파티클이 생성될 수 있도록 프리팹화 한다.

  • Transform Scale은 (2, 2, 2) 로 두배 키워 줌.
  • 메인 모듈
    • Duration 은 5. 5초 지나면 자동으로 사라지게.
    • Looping 해제
    • Play On Awake 는 체크. 파티클이 생성 되자마자 바로 재생을 시작할 수 있게.
    • Gravity 는 0.05 약간의 중력을 주어 천천히 떨어질 수 있게 하였다.
    • Start Speed 는 0.1 로 천천히
    • Start RotationRandom Between Two Constants 로 하여 파티클의 입자가 90도 ~ 270도 사이에서 랜덤한 회전값을 가지고 태어나게 한다.
  • Emission
    • Rate over Time 은 0
    • 한번에 20 발 튀어나오게 Bursts 를 생성하고 Count 는 20.
  • Shape
    • 파티클들이 태어나느 곳 모양을 Sphere 로
    • 반지름 0.01, 반지름 두께 0 으로 최소로 해주었다. 한 점에서 20 개가 다같이 태어나게.
  • Noise 👉 파티클 움직임에 역동성을 더해주는 모듈이다.
    • Strength 노이즈 효과가 파티클에 얼마나 강하게 적용되는지. 높게 설정할 수록 파티클이 더 빠르고 멀리 이동한다.
      • 0.1 로 설정
    • Frequency 낮게 설정하면 노이즈가 부드럽고 매끄럽게 생성되고, 높게 설정하면 빠르게 변화하는 노이즈로 생성된다. 얼마나 갑작스럽게 바뀌는지의 정도. 이동 방향이 바뀌는 빈도. 왔다 갔다 움직이는 빈도 수.
      • 0.5 로 설정
    • Scroll Speed 값이 높으면 높을수록 불규칙하고 흔들리면서 움직이게 된다. 높으면 높을 수록 입자들이 부들부들 떨림.
      • 1 으로 설정
    • Damping 활성화 하면 노이즈 세기가 Frequency 에 비례하게 된다.
      • 체크 해제한다.
    • Octaves 몇개의 노이즈 레이어를 겹칠지 설정. 이 값이 높으면 높을 수록 노이즈 레이어를 많이 두어서 노이즈 모양이 더 풍부해진다는 뜻이다. 다만 성능 저하 문제가 발생할 수 있음.
      • 2 로 설정
    • Remap 연산된 최종 노이즈 값을 다른 범위에 다시 맵핑한다.
      • 아래 그래프로 Remap Curve를 설정했다면 노이즈 모양은 위로 갔다가 아래로 갔다가 다시 위로 가는 형태로 노이즈가 작용할 것이다. image
  • Renderer
    • Renderer Mode 는 Mesh로 설정
      • 파티클을 텍스처 대신 3 D 메시로 렌더링 하고 할 때.
      • 나뭇잎 Mesh 로 할 거라서 선택.
        • Branch 나뭇잎 3D 메시를 할당해 주었다.
    • Material 은 초록색 Material 을 할당해주었다.
      • 나뭇잎 파티클 효과에 색을 초록색으로 입혀 줌.


🚖 두 동강난 나뭇 가지를 표현할 작은 나뭇 가지

이름은 Little_Twig. 나뭇 가지 3 D 모델의 Scale 을 줄여서 작은 나뭇 가지 🟦프리팹을 만들자. 나뭇 가지가 파괴되어 두 동강 나는 효과를 주기 위해 이 프리팹을 나뭇가지가 파괴된 자리에 2 개 생성할 것이다.

image

  • Rigidbody 붙여 주기
    • 생성시 중력에 의하여 땅에 떨어지도록
  • Box Collider 붙여 주기
    • 생성시 Rigidbody의 중력에 의하여 떨어지면 바닥에 닿았을 때 뚫고 지나가지 않도록 충돌체 만들어 줌.
    • Is Trigger는 체크 되어있다. 중력이 있으니 이게 체크 해제되면 지형을 관통해서 떨어지게 된다.


🚖 나뭇가지 때리는 처리

📜Twig.cs

나뭇 가지 브젝트인 branch에 붙여 준다.

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

public class Twig : MonoBehaviour
{
    [SerializeField]
    private int hp;  // 나뭇 가지 체력. 0 이 되면 파괴.

    [SerializeField]
    private float destroyTime;  // 나뭇 가지 이펙트 (파티클 시스템) 삭제 시간

    [SerializeField]
    private GameObject go_little_Twig;  // `Little_Twig` 할당. 나뭇가지가 파괴될 때 두 동강나게. 더 작은 나뭇가지 프리팹.
    [SerializeField]
    private GameObject go_twig_hit_effect_prefab;  // `Leaf_Hit_Effect` 나뭇 가지 때릴 때 생성할 이펙트 프리팹

    [SerializeField]
    private float force;  // 생성된 두 개의 작은 나뭇가지를 밀어줄 힘의 크기

    /* 회전값 변수 */
    private Vector3 originRot;   // 나뭇 가지 원래 회전 값. (나뭇 가지 때리면 기울이게 할 것이라서 나중에 원래대로 돌아 올 때 필요)
    private Vector3 wantedRot;   // 나뭇 가지 때릴 때 회전 되길 원하는 값.
    private Vector3 currentRot;  // wanted_Rot 이 되기 위해 계속 업뎃해나갈 회전 값

    /* 필요한 사운드 이름.  (재생은 📜SoundManager.cs 싱글톤으로 하니까 곡 이름 string만 알면 됨) */
    [SerializeField]
    private string hit_Sound;
    [SerializeField]
    private string broken_Sound;

    void Start()
    {
        originRot = transform.rotation.eulerAngles;  // 보기 편하게 Vector3 로.
        currentRot = originRot;  // currentRot 초기값
    }

    public void Damage(Transform _playerTf)  
    {
        hp--;

        Hit();

        StartCoroutine(HitSwayCoroutine(_playerTf));

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

    private void Hit()
    {
        SoundManager.instance.PlaySE(hit_Sound);

        GameObject twig_particles = Instantiate(go_twig_hit_effect_prefab,
            gameObject.GetComponent<BoxCollider>().bounds.center + (Vector3.up * 0.5f),
            Quaternion.identity);

        Destroy(twig_particles, destroyTime);
    }

    IEnumerator HitSwayCoroutine(Transform _target)
    {
        Vector3 direction = (_target.position - transform.position).normalized; // 플레이어 👉 나뭇가지 로 향하는 방향 

        Vector3 rotationDir = Quaternion.LookRotation(direction).eulerAngles;  // 플레이어 👉 나뭇가지 방향을 바라보는 방향의 각도 값.

        CheckDirection(rotationDir);

        while(!CheckThreadhold())
        {
            currentRot = Vector3.Lerp(currentRot, wantedRot, 0.25f);
            transform.rotation = Quaternion.Euler(currentRot);
            yield return null;
        }

        wantedRot = originRot;

        while (!CheckThreadhold())
        {
            currentRot = Vector3.Lerp(currentRot, originRot, 0.15f);
            transform.rotation = Quaternion.Euler(currentRot);
            yield return null;
        }
    }

    private bool CheckThreadhold()
    {
        if (Mathf.Abs(wantedRot.x - currentRot.x) <= 0.5f && Mathf.Abs(wantedRot.z - currentRot.z) <= 0.5f)
            return true;
        return false;
    }

    private void CheckDirection(Vector3 _rotationDir)  // 어느 방향으로 나뭇 가지를 눕힐지.
    {
        Debug.Log(_rotationDir);

        if (_rotationDir.y > 180)
        {
            if(_rotationDir.y > 300)  // 300 ~ 360 
                wantedRot = new Vector3(-50f, 0f, -50f);
            else if (_rotationDir.y > 240) // 240 ~ 300
                wantedRot = new Vector3(0f, 0f, -50f);
            else    // 180 ~ 240
                wantedRot = new Vector3(50f, 0f, -50f);
        }
        else if (_rotationDir.y <= 180)
        {
            if (_rotationDir.y < 60)  // 0 ~ 60
                wantedRot = new Vector3(-50f, 0f, 50f);
            else if (_rotationDir.y > 120)  // 120 ~ 180
                wantedRot = new Vector3(0f, 0f, 50f);
            else  // 60 ~ 120
                wantedRot = new Vector3(50f, 0f, 50f);
        }
    }

    private void Destruction()
    {
        SoundManager.instance.PlaySE(broken_Sound);

        GameObject little_twig_1 = Instantiate(go_little_Twig,
                            gameObject.GetComponent<BoxCollider>().bounds.center + (Vector3.up * 0.5f),
                            Quaternion.identity);
        GameObject little_twig_2 = Instantiate(go_little_Twig,
                            gameObject.GetComponent<BoxCollider>().bounds.center - (Vector3.up * 0.5f),
                            Quaternion.identity);
        
        little_twig_1.GetComponent<Rigidbody>().AddForce(Random.Range(-force, force), 0, Random.Range(-force, force));
        little_twig_2.GetComponent<Rigidbody>().AddForce(Random.Range(-force, force), 0, Random.Range(-force, force));

        Destroy(little_twig_1, destroyTime);
        Destroy(little_twig_2, destroyTime);

        Destroy(gameObject);
    }
}

  • Start() 👉 초기화
    • originRot에 자기 자신인 나뭇 가지(Branch) 현재 회전 값 넣어두기
    • 다루기 편하게 Vector3로 저장. eulerAngles
    • currentRotoriginRot로 초기화
  • Damage(Transform _playerTf) 👉 도끼로 나뭇 가지를 때릴 때마다 실행 됨.
    • 1️⃣ hp 깎고 Hit() 실행
      • Hit() 👉 때릴 때마다 실행할 부분
        • 나뭇가지 타격 사운드 재생
        • 나뭇잎 이펙트 효과로 만들어 둔 프리팹 생성
          • 자기 자신인 나뭇가지의 Box Collider 바운드의 정가운데 지점에서 (Vector3.up * 0.5f) 벡터만큼 더운 좀 윗 부분에서 생성되게끔 한다.
        • 나뭇잎 이펙트 5초(destroyTime) 뒤 파괴
    • 2️⃣ HitSwayCoroutine(Transform _target) 👉 플레이어 -> 나뭇가지 로 향하는 방향을 바라보는 방향으로 나뭇가지를 쓰러뜨림(X, Z 방향으로 회전)
      • 설명 그림 밑에
      • 1️⃣ rotationDir 👉 (플레이어 -> 나뭇가지 로 향하는 방향) 을 바라보는 방향 구하기
      • 2️⃣ CheckDirection(rotationDir) 👉 나뭇 가지가 쓰러져야 하는 그 각도, 회전값으로 wantedRot을 업데이트.
        • 설명 그림 밑에
        • 인수로 들어온 rotationDir의 y 값, 즉 나뭇 가지가 바라봐야 하는 y 방향에 따라 어떤 방향으로 쓰러뜨릴지 정하는 함수.
        • 1도 단위, 실수 단위로 쓰러뜨리는 방향을 다르게 해주면 성능이 저하되니깐 대충 360도를 구역별로 나워서 이쪽 방향이면 이런 회전 값으로 쓰러지게 만들고 이런식으로 하였다.
          • _rotationDir.y
      • 3️⃣ 실제로 나뭇가지 회전시키기
        • CheckThreadhold() 👉 wantedRotcurrentRot의 차이가 0.5 이하면 둘이 같다고 보기 위해 True 리턴, 아니면 False 리턴.
          • Lerp는 딱 떨어져서 나오기가 힘들다 보니 while문에 무한히 갇히게 되는 것 방지. CheckThreadhold()가 True가 되면 둘이 같아졌다고 보고 !CheckThreadhold()가 True가 되면 !while 문을 빠져 나옴.
        • 1️⃣ 나뭇 가지 눕히기
          • currentRot 👉 wantedRot이 되는 것을 목표로 부드럽게 Lerp + 한 프레임 쉬기 반복
          • 나뭇 가지의 현재 회전값을 wantedRot 값과 같아졌다고 판정된 currentRot으로 설정하여 나뭇 가지 실제로 회전시키기
        • 2️⃣ 나뭇 가지 다시 원래대로 일어나게 하기
          • wantedRotoriginRot로 초기화
          • currentRot 👉 originRot이 되는 것을 목표로 부드럽게 Lerp + 한 프레임 쉬기 반복
          • 나뭇 가지의 현재 회전값을 originRot 값과 같아졌다고 판정된 currentRot으로 설정하여 나뭇 가지 실제로 회전시키기
    • 3️⃣ hp 가 0 이하면 나뭇 가지 파괴 처리 하기 Destruction() 실행
      • 나뭇 가지 파괴 소리 재생
      • 두 동강 내기
        • 작은 나무 1 생성 (좀 위에 생성 + Vector3.up)
        • 작은 나무 2 생성 (좀 아래에 생성 - Vector3.up)
      • 생성된 두 작은 나무들을 (-force, force) 사이의 랜덤한 힘의 벡터를 X, Z 방향으로 가해 밀어준다.
        • 밀어주지 않으면 너무 정직하게 위 나뭇가지가 떨어질 때 아랫 나뭇가지 위에 딱 서있게 된다.. ㅠ ㅠ 그래서 자연스럽게 땅 아래로 떨어지도록 X,Z 앞뒤 좌우로 랜덤한 크기의 밀어주는 힘을 준 것이다.
          little_twig_1.GetComponent<Rigidbody>().AddForce(Random.Range(-force, force), 0, Random.Range(-force, force));
          little_twig_2.GetComponent<Rigidbody>().AddForce(Random.Range(-force, force), 0, Random.Range(-force, force));
          
      • 두 동강난 두 작은 나무는 5초 뒤 삭제
      • 자기 자신(나뭇 가지)은 눈 깜짝할 새에 바로 삭제

image

플레이어는 나뭇 가지를 중심으로 회전하면서 때릴 수 있다. 즉, 플레이어에서 👉 나뭇 가지로 향하는 방향의 Vector3 값은 y값만 변화하게 된다.

image

나뭇 가지가 쓰러져야 하는 방향은 플레이어에서 👉 나뭇 가지로 향하는 방향과 일치한다. 플레이어에서 👉 나뭇 가지로 향하는 방향의 Vector3 값은 y값만 변화하게 되므로 이 y값을 보면 나뭇 가지가 어느 방향으로 쓰러져야 하는지를 알 수 있다. 그냥 나무를 쓰러뜨리고 넘어지게만 하면 되서 X, Z축 회전만 하면 되고, 나무가 쓰러지는 방향을 바라보게 끔 Y 축 회전까지 해 줄 필요는 없다. 그러나 플레이어에서 👉 나뭇 가지로 향하는 방향, 즉 나무가 쓰러져야 하는 방향의 Y 값을 보면 나무가 실제로 쓰러져야 하는 방향을 알 수 있고 그 쪽으로 쓰러지고 넘어지게끔 X, Z 회전값을 설정해주면 된다! 나무가 쓰러지는 방향으로 고개를 돌릴 필요까진 없으니 Y 값 설정은 X

image

  • 나뭇 가지가 Z 축을 향하고 있는 기준, 즉 나뭇 가지의 앞 모습을 기준으로
    • Z 회전값이 음수면 왼 쪽으로 넘어지는 거고
    • Z 회전값이 양수면 오른 쪽으로 넘어지는 거고
    • X 회전값이 음수면 뒤 쪽으로 넘어지는 거고
    • X 회전값이 양수면 앞 쪽으로 넘어지는 것이다.
  • 360도를 60도 단위로 6 개의 구역으로 나눠서 넘어질 방향(X, Z 회전값)을 같게 해주었다. 성능을 위해서!
    • 나무가 쓰러져야 하는 방향이 Y 축을 중심으로 0 ~ 60도 회전한 방향이라면
      • 오른쪽 + 뒤로 넘어져야 한다. X 회전값 음수, Z 회전값 양수
    • 나무가 쓰러져야 하는 방향이 Y 축을 중심으로 60 ~ 120도 회전한 방향이라면
      • 오른쪽으로 넘어져야 한다. 앞 뒤로 넘어질 필요는 없으므로 X 회전값 0, Z 회전값 양수
    • 나무가 쓰러져야 하는 방향이 Y 축을 중심으로 120 ~ 180도 회전한 방향이라면
      • 오른쪽 + 앞으로 넘어져야 한다. X 회전값 양수, Z 회전값 양수
    • 나무가 쓰러져야 하는 방향이 Y 축을 중심으로 180 ~ 240도 회전한 방향이라면
      • 왼쪽 + 앞으로 넘어져야 한다. X 회전값 양수, Z 회전값 음수
    • 나무가 쓰러져야 하는 방향이 Y 축을 중심으로 240 ~ 300도 회전한 방향이라면
      • 왼쪽으로 넘어져야 한다. 앞 뒤로 넘어질 필요는 없으므로 X 회전값 0, Z 회전값 음수
    • 나무가 쓰러져야 하는 방향이 Y 축을 중심으로 300 ~ 360도 회전한 방향이라면
      • 왼쪽 + 뒤로 넘어져야 한다. X 회전값 음수, Z 회전값 음수
    private void CheckDirection(Vector3 _rotationDir)  // 어느 방향으로 나뭇 가지를 눕힐지.
    {
        Debug.Log(_rotationDir);

        // 대충 50 도 크기로 넘어진다고 설정

        if (_rotationDir.y > 180)
        {
            if(_rotationDir.y > 300)  // 300 ~ 360 
                wantedRot = new Vector3(-50f, 0f, -50f);
            else if (_rotationDir.y > 240) // 240 ~ 300
                wantedRot = new Vector3(0f, 0f, -50f);
            else    // 180 ~ 240
                wantedRot = new Vector3(50f, 0f, -50f);
        }
        else if (_rotationDir.y <= 180)
        {
            if (_rotationDir.y < 60)  // 0 ~ 60
                wantedRot = new Vector3(-50f, 0f, 50f);
            else if (_rotationDir.y > 120)  // 120 ~ 180
                wantedRot = new Vector3(0f, 0f, 50f);
            else  // 60 ~ 120
                wantedRot = new Vector3(50f, 0f, 50f);
        }
    }

image

때릴 때마다 생성할 이펙트 효과 프리팹과(나뭇잎), 파괴되서 두동강 날 때 생성할 작은 나뭇 가지 프리팹 할당. 밀어 줄 힘의 크기 지정.

image

나뭇 가지 때릴 때, 파괴될 때 효과음 사운드 매니저에 추가.


📜PickaxeController.cs

나뭇 가지는 곡괭이로만 캘 수 있다.

    protected override IEnumerator HitCoroutine()
    {
        while (isSwing)
        {
            if (CheckObject())
            {
                if (hitInfo.transform.tag == "Rock")
                {
                    hitInfo.transform.GetComponent<Rock>().Mining();
                }
                else if (hitInfo.transform.tag == "Twig")
                {
                    hitInfo.transform.GetComponent<Twig>().Damage(this.transform);
                }

                isSwing = false;
                Debug.Log(hitInfo.transform.name);
            }
            yield return null;
        }
    }

곡괭이와 충돌한 대상에게 “Twig” 태그가 붙어있다면 나뭇 가지이므로 📜Twig.cs 의 Damage 함수를 호출한다. 인수는 곡괭이의 위치로 넘긴다. 곡괭이의 위치와 플레이어의 위치는 일치하기 때문에 괜찮다.


풀 베기

🚖 풀 오브젝트

image

image

  • Grass 👉 빈 오브젝트다.
    • Box Collider를 붙여주자
      • 충돌 처리가 되어 풀의 hp 가 깎일 수 있도록
      • Is Trigger는 체크. 플레이어가 관통할 수 있도록.
        • Rigidbody는 붙어있지 않으므로 Is Trigger 체크한다고 해서 중력에 의해 Terrain을 뚫고 영원히 떨어질 일은 없다!
    • Tag 는 “Grass”
      • Rock과 같이 때린게 풀이라면 처리를 다르게 해주어야 하니까


🚖 풀 조각 오브젝트들

image

image

풀의 전체적인 Mesh 를 자식 오브젝트들이 조각 조각으로 이루고 있다.

  • Grass의 모든 자식 오브젝트들 모두에게
    • Rigidbody를 붙인다. 👉 중력에 의해 떨어지도록.
      • Use Gravity 는 체크 해제 해준다. (풀이 파괴될 때 자동 체크되도록 할 것이다.)
        • 평소엔 중력을 받지 않아 원래 모습대로 붙어있다가 파괴될 때 중력에 의해 각각의 조각들이 떨어지게 할 것.
    • Box Collider를 붙인다. 👉 중력에 의해 떨어질 때 바닥을 통과하지 않고 충돌되도록.
      • Is Trigger는 체크.
      • 비활성화 해둔다. (풀이 파괴될 때 풀 조각들의 Box Collider를 활성화할 것이다.)


🚖 풀 베기 처리

📜Grass.cs

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

public class Grass : MonoBehaviour
{
    [SerializeField]
    private int hp;  // 풀의 체력

    [SerializeField]
    private float destroyTime;  // 풀 이펙트 사라질 시간
    [SerializeField]
    private float explosionForce;  // 폭발 세기


    [SerializeField]
    private GameObject go_hit_effect_prefab;  // 풀 떄릴때 마다 발생시킬 이펙트 효과 프리팹

    private Rigidbody[] rigidbodys;  // 풀 파괴시 자식인 풀 조각들에게 붙어있는 Rigidbody들의 중력 활성화하기 위하여
    private BoxCollider[] boxColiders;  // 풀 파괴시 자식인 풀 조각들에게 붙어있는 Box Collider 들을 활성화하기 위하여

    [SerializeField]
    private string hit_sound;  // 풀 타격시 소리

    void Start()
    {
        rigidbodys = this.transform.GetComponentsInChildren<Rigidbody>();
        boxColiders = this.transform.GetComponentsInChildren<BoxCollider>();
    }

    public void Damage()
    {
        hp--;

        Hit();

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

    private void Hit()
    {
        SoundManager.instance.PlaySE(hit_sound);

        var clone = Instantiate(go_hit_effect_prefab, transform.position + Vector3.up, Quaternion.identity);
        Destroy(clone, destroyTime);
    }

    private void Destruction()
    {
        for (int i = 0; i < rigidbodys.Length; i++)
        {
            rigidbodys[i].useGravity = true;
            rigidbodys[i].AddExplosionForce(explosionForce, transform.position, 1f); // 제자리에서 중력 받아 그냥 떨어지는게 아니라 폭발 효과를 줌 (폭발 세기, 폭발 위치, 폭발 반경)
            boxColiders[i].enabled = true;
        }

        Destroy(this.gameObject, destroyTime);
    }
}

  • Start()
    • rigidbodys 배열에 Grass의 자식들인 풀 조각들의 Rigidbody 컴포넌트들을 넣어준다.
    • boxColiders 배열에 Grass의 자식들인 풀 조각들의 Box Coliders 컴포넌트들을 넣어준다.
  • Hit()
    • 풀 때릴 때 효과음 재생
    • 풀 때릴 때 이펙트 프리팹 생성 (나뭇 가지 벨 때 만들었던 Leaf_Hit_Effect를 사용할 것)
    • 이펙트 5 초 있다가 삭제
  • Destruction() 👉 풀 파괴시 실행할 처리들
    • Grass의 자식들인 풀 조각들의 Rigidbody 컴포넌트들의 Use Gravity 를 체크해준다.
      • 중력을 활성화 하여 각기 땅에 떨어지도록 한다.
    • Grass의 자식들인 풀 조각들의 Rigidbody 컴포넌트들로 하여금 AddExplosionForce 함수를 실행시켜 폭발 효과를 준다.
      • 제자리에서 중력 받아 재미없게 그냥 떨어지는게 아니라 폭발 한 후에 중력을 받아 떨어지도록.
    • Grass의 자식들인 풀 조각들의 Box Coliders 컴포넌트들을 활성화시킨다.

image


📜AxeController.cs

풀은 도끼로만 캘 수 있다.

    protected override IEnumerator HitCoroutine()
    {
        while (isSwing)
        {
            if (CheckObject())
            {
                if(hitInfo.transform.tag == "Grass")
                {
                    hitInfo.transform.GetComponent<Grass>().Damage();
                }

                isSwing = false;
                Debug.Log(hitInfo.transform.name);
            }
            yield return null;
        }
    }

도끼와 충돌한 대상에게 “Grass” 태그가 붙어있다면 나뭇 가지이므로 📜Grass.cs 의 Damage 함수를 호출한다.



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

맨 위로 이동하기

댓글남기기