28.함정 발동
using UnityEngine;
public class SimpleTrap : MonoBehaviour
{
private Rigidbody[] rigid;//리지드 바디들
[SerializeField] private GameObject go_Meat;//고기 오브젝트
[SerializeField] private int damage;//데미지
private bool isActivated = false;//함정 활성화 여부
private AudioSource theAudio;//오디오 소스
[SerializeField] private AudioClip sound_Activate;//오디오 칩
private StatusController theStatusCtrl;//필자가 작성
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
rigid = GetComponentsInChildren<Rigidbody>();
theAudio =GetComponent<AudioSource>();
theStatusCtrl = FindAnyObjectByType<StatusController>();//필자가 작성
}
private void OnTriggerEnter(Collider other)
{
if (!isActivated)
{
if(other.transform.tag != "Untagged")
{
isActivated = true;
theAudio.clip = sound_Activate;
theAudio.Play();
Destroy(go_Meat);//고기 제거
for(int i = 0; i < rigid.Length; i++)
{
rigid[i].useGravity = true;
rigid[i].isKinematic = false;
}
if(other.transform.name == "Player")
{
theStatusCtrl.DecreaseHP(damage);//필자가 작성
}
}
}
}
}
이번 강좌에는 간단한 함정을 만들고 함정에 들어가면 데미지를 입는 등
간단한 함정을 만들 것이다
일단 3D모델에서 위 객체 3개를 가지고 오고 아래 스샷처럼 배치를 해준다
그 뒤 빈객체를 만들고 SimpleTrap 라고 명명한다 그 뒤에 배치한 3D모델을 전부 집어 넣어서 묶어준다
그 다음 위 스샷을 참고하여 나뭇가지와 발판의 Rigidbody를 세팅해준다
이제 C#스크립트를 작성하고 SimpleTrap 이라고 명명한다
기본적으로 선언되는 변수이다
15번의 줄은 UI와 데미지 작용을 위해 필자가 임의로 적어두었다
장착할 변수들이다
20번 줄의 rigid는 GetComponentsInChildren이라고 작성하여서 s와 InChildren으로 여러개의 안의 객체들의 Rigidbody를 받아왔다
21번 줄은 오디오 소스이고
22번은 UI게이지와 연동해 둔 것이다
OnTriggerEnter함수이다 인수로 Collider other을 받아온다
이 함수는 게임 오브젝트와 접촉 했을때 실행되는 함수이다 Collider other은 부팃친 객체의 속성을 받아온다
if문으로 isActivated가 아닐때
if문으로 Untagged가 아닐때 실해된다
31줄의 isActivated가 true;가 되고
오디오 칩에 사운드가 장착되고
오디오를 플레이 해준다
그리고 34번줄에 고기 오브젝트를 제거한다
36번줄은 for문으로 반복하여 i 는 0이고 i 는 rigid.Length 보다 작고 i를 증감해준다
반복되면서 하위에 있는 오브젝트의 rigid컴포넌트의 useGravity를 ture로 해주고 isKinematic를 false해준다
42번의 if문으로 부딧힌 대상이 Player일때
UI게이지의 DecreaseHP를 호출하고 인수로 damage를 넣어준다
이제 유니티 엔진으로 돌아가서
Simple Trap 스크립트를 넣어주고 Layer을 Building로 바꾸면서 하위 오브젝트까지 적용해준다
그뒤 BoxCollider과 Audio Source 컴포넌트도 추가해준다
참고로 Player객체에 Tag와 Layer을 Player로 변경해주자
이제 테스트해보면...
깔끔하게 구현되었다
필자는 Player객체의 Tag 수정 안해놔서 작동되지 않았다
다행이 금방 찾아서 수정했다