Unity 강의 정리 6-2장: [게임 제작 : 어메이징 볼링] 프롭 + 데미지 시스템🎮

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

Unity

목록 보기
19/21
post-thumbnail

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

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


1. 프롭 제작: Ball의 주변 오브젝트에 대한 설명 📦

프롭(Prop)은 게임 환경에서 Ball 오브젝트 주변에 배치되어 있는 큐브 형태의 오브젝트이다.

기본 프롭 스크립트의 구성 요소

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

public class Prop : MonoBehaviour
{
    public int score = 5;
    public ParticleSystem explosionParticle;
    public float hp = 10f;

    public void TakeDamage(float damage)
    {
        hp -= damage;

        if (hp <= 0)
        {
            ParticleSystem instance = Instantiate(explosionParticle, transform.position, transform.rotation);
            Destroy(instance.gameObject, instance.duration);
            gameObject.SetActive(false);
        }
    }
}

변수 설명

  • public int score = 5;: 프롭이 파괴될 때 플레이어에게 주어지는 점수. 기본값은 5점이다.
  • public ParticleSystem explosionParticle;: 프롭이 파괴될 때 발생하는 파티클 시스템.
  • public float hp = 10f;: 프롭의 초기 체력. 이 값이 0 이하가 되면 프롭은 파괴된다.

메서드 설명

  • public void TakeDamage(float damage): 외부에서 호출될 수 있는 메서드로, 프롭에 데미지를 적용한다. 이 메서드는 Ball 오브젝트와의 상호작용 시 호출된다.

파티클 효과 및 효과음 추가

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

public class Prop : MonoBehaviour
{
    public int score = 5;
    public ParticleSystem explosionParticle;
    public float hp = 10f;

    public void TakeDamage(float damage)
    {
        hp -= damage;

        if (hp <= 0)
        {
            ParticleSystem instance = Instantiate(explosionParticle, transform.position, transform.rotation);

            AudioSource explosionAudio = instance.GetComponent<AudioSource>();
            explosionAudio.Play();

            Destroy(instance.gameObject, instance.duration);
            gameObject.SetActive(false);
        }
    }
}

기존의 프롭 스크립트에 효과음을 추가하였다. 파티클 시스템 인스턴스가 생성될 때 같이 AudioSource 컴포넌트를 가져와서 효과음을 재생한다.


2. 데미지 시스템: 폭발 반경 내의 Prop에 대한 데미지 적용 🎯

데미지 시스템을 통해 Ball이 떨어지는 위치의 폭발 반경 내에 있는 Prop 오브젝트들에게 데미지를 주는 역할을 한다. 이를 위해 Unity의 물리 엔진과 레이어 마스크를 활용하여, 폭발 반경 내에 있는 Prop 오브젝트들을 판별하고 데미지를 적용한다.

레이어 마스크를 이용한 Prop 판별

Unity에서 제공하는 레이어 마스크 기능을 활용하여, 폭발 반경 내에 있는 Prop 오브젝트를 판별한다. 이를 위해 WhatIsProp라는 레이어 마스크 변수를 사용한다.

public LayerMask WhatIsProp;

이 레이어 마스크는 Physics.OverlapSphere 메서드에서 사용되며, 폭발 반경 내에 있는 오브젝트 중에서 WhatIsProp 레이어에 속하는 오브젝트만을 선택하여 데미지를 적용한다.

폭발 반경 내의 Prop 오브젝트 찾기

Unity의 Physics.OverlapSphere 메서드를 사용하여 폭발 반경(explosionRadius) 내의 모든 오브젝트를 찾는다. 이 메서드는 Collider 배열을 반환한다.

Collider[] colliders = Physics.OverlapSphere(transform.position, explosionRadius, WhatIsProp);

이 배열은 폭발 반경 내에 있는 모든 오브젝트의 Collider 컴포넌트를 포함한다. 이 중에서 레이어 마스크(WhatIsProp)에 해당하는 오브젝트만을 대상으로 데미지를 적용한다.

데미지 적용하기

Prop 오브젝트의 TakeDamage 메서드를 호출하여 데미지를 적용한다.

Prop targetProp = collider.GetComponent<Prop>();
float damage = CalculateDamage(collider.transform.position);
targetProp.TakeDamage(damage);

CalculateDamage 메서드는 폭발의 중심부터 대상 오브젝트까지의 거리를 계산하여, 그에 따라 적용할 데미지 값을 반환한다.

물리 효과 적용하기

물리 효과는 Rigidbody 컴포넌트를 이용하여 적용한다. AddExplosionForce 메서드를 사용하여 폭발의 힘을 실제로 오브젝트에 적용한다.

Rigidbody targetRigidbody = collider.GetComponent<Rigidbody>();
targetRigidbody.AddExplosionForce(explosionForce, transform.position, explosionRadius);

이 메서드는 폭발의 힘(explosionForce), 폭발의 중심 위치(transform.position), 폭발 반경(explosionRadius)을 파라미터로 받아, 해당 정보에 기반하여 물리 효과를 적용한다.

파티클 효과와 오디오 적용

마지막으로, 폭발이 발생하면 그에 따른 시각적, 청각적 효과를 적용한다. 이는 ParticleSystemAudioSource 컴포넌트를 사용한다.

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

이제 폭발 반경 내의 모든 Prop 오브젝트에 물리 효과와 데미지, 파티클 효과를 적용할 수 있다.

profile
개인 공부를 정리함니다

0개의 댓글