프롭(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 컴포넌트를 가져와서 효과음을 재생한다.
데미지 시스템을 통해 Ball이 떨어지는 위치의 폭발 반경 내에 있는 Prop 오브젝트들에게 데미지를 주는 역할을 한다. 이를 위해 Unity의 물리 엔진과 레이어 마스크를 활용하여, 폭발 반경 내에 있는 Prop 오브젝트들을 판별하고 데미지를 적용한다.
Unity에서 제공하는 레이어 마스크 기능을 활용하여, 폭발 반경 내에 있는 Prop 오브젝트를 판별한다. 이를 위해 WhatIsProp
라는 레이어 마스크 변수를 사용한다.
public LayerMask WhatIsProp;
이 레이어 마스크는 Physics.OverlapSphere
메서드에서 사용되며, 폭발 반경 내에 있는 오브젝트 중에서 WhatIsProp
레이어에 속하는 오브젝트만을 선택하여 데미지를 적용한다.
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
)을 파라미터로 받아, 해당 정보에 기반하여 물리 효과를 적용한다.
마지막으로, 폭발이 발생하면 그에 따른 시각적, 청각적 효과를 적용한다. 이는 ParticleSystem
과 AudioSource
컴포넌트를 사용한다.
explosionParticle.Play();
explosionAudio.Play();
이제 폭발 반경 내의 모든 Prop 오브젝트에 물리 효과와 데미지, 파티클 효과를 적용할 수 있다.