FPS서바이벌 디펜스

28.함정 발동

ruripanda 2025. 6. 3. 11:12

본 강좌는 케이디님의 유튜브강좌 영상을 보고 유니티6로 구현한 것 입니다 이렇게 멋진 강좌를 만드신 케이디님을 존경합니다

 

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 수정 안해놔서 작동되지 않았다

다행이 금방 찾아서 수정했다