나 개발자 진짜 되냐?

[ Unity 3D 서바이벌 게임 만들기 3 ] 플레이어 대미지 처리 본문

유니티를 공부해봐요!/중급이에요!

[ Unity 3D 서바이벌 게임 만들기 3 ] 플레이어 대미지 처리

Snow Rabbit 2024. 10. 28. 00:49

 

 

이제 플레이어 피격을 해볼 것이다.

 

몬스터가 공격할 때,

뭐 불에 닿았을 때

물에 잠겼을 때

등등을 

구현해보려고 한다!

 

그전에 필요한 문법들을 적어보고 코드를 짜보자!

 


1.

🌟 TryGetComponent 🌟

    
  TryGetComponent

GetComponent을 보면서 유추할 수 있듯,

게임 오브젝트의 컴포넌트를 가져오는 기능이다.

 

그냥 Get과 차이점은

특정 컴포넌트가 게임 오브젝트에 연결되어 있는지 확인하고,

연결되어 있다면 해당 컴포넌트를 가져올 수 있다.

얘는 true false를 가져온다.

 

즉 무조건 가져오는 게 아니라

연결되어 있다면 컴포넌트를 실행할 수 있게 되고

약간의 조건? 을 걸어두는 느낌이다.

예외를 발생시키지 않기 때문에

안전하게 컴포넌트를 가져오고 사용할 수 있다.
    
    public bool TryGetComponent <T>(out T component) where T : Component;

  여기서 T는   
가져오려는 컴포넌트의 타입!

클래스나 자료형식에 대응 가능한 키워드이다.

 

out 은 메서드에서 반환 값을 매개변수로 전달하는 경우 사용

 

using UnityEngine;

public class ExampleScript : MonoBehaviour
{
    private void Start()
    {
        // 게임 오브젝트에 Rigidbody 컴포넌트가 있는지 확인하고 가져옵니다.
        Rigidbody rb;
        if (TryGetComponent<Rigidbody>(out rb))
        {
            // Rigidbody 컴포넌트가 있다면 해당 컴포넌트로 원하는 동작을 수행합니다.
            rb.AddForce(Vector3.up * 100f);
        }
        else
        {
            // Rigidbody 컴포넌트가 없다면 다른 처리를 수행합니다.
            Debug.Log("Rigidbody component not found.");
        }
    }
}

 

TryGetComponent <Rigidbody>(out rb)

 

여기서도 if문에

<>  여기 안에 타입을 넣어주고

out뒤에는 컴포넌트를 넣어주었다.

 

이따 코드에서 다시 살펴보자!

 

 

2.

🌟 카메라 절두체 🌟

 

카메라 절두체(뷰 절두체)는 

사다리꼴 느낌으로

피라미드 같은 모양의 윗부분을 

밑면에 병렬로 잘라낸 입체 형상인 절두체를 

카메라 랜더링에 적용한 것을 말합니다.

 

렌더링이란 3차원 공간에 물체를 표현하는 의미!!

 

 

시야 범위(FOV)와

Near Clipping Plane ( 작은 네모 )

 Far Clipping Plane ( 큰 네모 )

등의 값을 조절해

절두체의 모양을 바꿀 수 있으며,

랜더링 할 범위를 지정해 줄 수 있습니다.

 

 

3.

🌟 Coroutine 🌟

 

코루틴

저번에도 한번 이야기한 적 있었는데

이 친구는 누구냐!

 

멋있는 말로

작업을 다수의 프레임에 분산하는 메서드로

 

Unity에서 코루틴은 실행을 일시 정지하고 제어를 Unity에 반환하지만

중단한 부분에서 다음 프레임을 계속할 수 있는 메서드이다.

 

?? 이게 무슨 말이냐!!!

??? 무슨 뜻이냐

 

간단하게 정리해 보자

컴퓨터는

비동기와 동기로

일을 하는 능력을 구분한다.

 

동기는

클라이언트가 뭘 물어보면

서버가 답을 해줄 때까지 가만히 기다려야 한다.

뭐, 아무것도 못한다.

 

서버가 답을 해주고 나면

클라이언트가 다시 답을 줄 때까지

가마아아안히 서버는 기다린다

 

전에 일이 끝나지 않으면 다음 일을 실행할 수 없는 것!

이것을 동기!

 

비동기는 무엇이냐

뭐 언제든지 클라이언트가 뭘 보내고

서버는 언제든지 답장하게 되는 방식이다.

동시에 이것저것 가능!

 

 

코루틴은

코드 내에서 쉬는 시간을 줄 수 있게 해주는 친구이다.

 

코드 녀석.. 많이 힘겨워보였나보다

 

 

코루틴을 이용하면

중간에 쉬는 시간? 을 만들어줘서

사이사이에 텀을 줄 수 있다.

 

오 그러면 얘는 생긴 게 비동기군요!

 

같아 보이지만

사실은 얘는 동기이다.

 

사실은 원래 코드를 멈춰두고

본인코드 실행하고 다시 원래코드 갔다가 일시정지하고

왔다 갔다 하는 것이었다.

 

그래서 비동기 같아 보이지만 사실 동기인

비동기적 동기인

코루틴을 이따가 사용해 보자!

 

 


 

 

자! 이제 진짜 코드를 작성해 보자!!

 

먼저 우리는 불에 가까이 가면 아야! 하게끔 만들 것이다.

 

불을 만들어보자

에셋에 검색하면 잘 나온다.

 

거기에 원 콜라이더 생성!

값을 잘 맞춰주어요!

중요한 건 Is Trigger

즉, 닿았을 때!라는 것

 

또,

 

대미지에 맞았을 때 표현되는 UI도 하나 만들어주자

 

 

캠버스 안에 사진을 하나 넣고

사이즈는 Alt Shift로 왕 크게 해 준 다음,

 

유니티에서는 위에 있는 친구가

더 뒤에 있는 친구이다.

 

우리는 맨 위에 게이지를 표시해 줄 예정이니

맨 밑으로 보내둔다.

 

사진 색은

255 80 80 80으로 해준다.

 

우리는 이 사진을 껐다 켜줬다해서

아야 아야 아야!

하는 느낌을 줄 것이다.

 

코드에서 사진을 껐다 켰다 해보자!

 

 

DamageIndicator.cs 만들기

+ 이미지에 미리 드래그 드롭 해놓기

 

 

자 스크립트 작성 전에 해야 할 부분을 정리해 보자

 

캠프파이어 근처에 플레이어가 다가가면

플레이어의 대미지를 받아 체력이 깎이고 + 그림이 껐다 켜졌다 해야 한다.

 

즉 플레이어 컨디션도 만져주어야 한다는 뜻이 된다.

체력이 깎이기 때문

 

체력이 깎이는 건

사실 맨 위에서도 적어주었지만

뭐 불에닿든

몬스터한테 맞든

다양하게 사용될 것이기 때문에

다중상속이 가능한

Interface를 사용할 것이다.

 

 

그리고 우리는 class에서 상속받는다는 의미로 옆에 써준다

어 아직도 빨간색인 이유는 선언을 안 해줘서 그렇다 

ctrl. 을 눌러주면

인터페이스 구현이라고 뜬다

엔터를 눌러주면 자동으로 밑에 함수가 생긴다.

 

 

이렇게!

안에는

체력이 깎이는 함수와

화면 깜박이는 친구를 넣어줄 것이다.

 

화면 깜박이는 이미지는 델리게이트로 받을 것이기 때문에

event Action으로 가져오자!

 

우리는 

DamageIndicator.cs 에서 PlayerCondition.cs로 접근해서

이벤트를 등록해 주면 된다.

 

이벤트는 다른 cs에서 해줄 테니

우리는 호출만 해주면 된다.

 

 

대미지 호출은 누가 해줄 거냐?

바로 캠프파이어가 해줄 것이다.

 

캠프파이어 스크립트도 만들어보자

 

CampFire.cs

 

 

함수는 어려워 보이지만

간단하게 말하면

triggerEnter

만약에 콜라이더가 있는 other과 무언가가 닿았다면

그것을 리스트에 넣어준다.

계속 딜이 들어가는 느낌!

 

반대로 exit는

리스트의 값을 지워줌으로써 딜이 더 이상 들어가지 않게 한다.

 

이제 트리거 덕분에

리스트에 넣었다 빠졌다 할 텐데

그 리스트의 값이 있으면 딜이 들어가야 하니

딜대미지 함수를 만들어주고,

 

리스트에 들어있는가를 돌려주는 조건문이 있어야 한다.

 

for문을 돌려서

리스트에 있는지 확인하고

리스트에 있다면

대미지를 주는 것을 실행해야 한다.

 

대미지는 아까 우리가 

interface에서 만들었던

 

이 친구가 for문에 들어가게 된다.

 

그다음에 얼마나 자주 실행할 건지 적어줘야 하기 때문에

우리는

InvokeRepeating을 써준다.

여기에는 3개 매개변수가 들어간다.

 

 

어떤 함수 실행

바로 실행할 건지

얼마나 자주 실행할 건지

 

Invoke는 지연시간만큼 후에 

한번 실행한다 라는 뜻이고

 

InvokeRepeating은

지연시간 후

지정한 주기로 반복 실행이 된다라는 차이가 있다.

 

유니티로 돌아가서

1초에 한 번씩 대미지를 주도록

넣어주고

 

DamageIndicator.cs를 작성해 보자

 

우리는 

 

깜빡깜빡하게 해주어야 하기 때문에

 

코루틴을 사용하여 진행하고

그 속도는 flashSpeed로 제어할 것이다.

코루틴을 사용하기 위해서는 코루틴 변수가 필요하다!!

 

코루틴은 특별한 함수라서 앞에 

IEnumerator을 써주고,

return 또한 yield을 붙여준다.

 

 

코루틴을 실행하기 위한 함수

 

 

if문을 사용해서

코루틴이 돌고 있다면 꺼주고

그렇지 않다면

이미지를 켜주고

코루틴을 시작시킨다!

 

 

실행할 수 있게 해 준다.

 

 

이 함수가 호출될 때마다

onTakeDamage라는 델리게이트가 호출되고,

 

위에 flash 가 구독 되어있고

이 flash에는

 

alpha 값으로 인해

이미지가 서서히 사라지게 되는 효과를 보여주고 있다.

 

 

설정해 주고 실행해 주면

 

끝!

 

다음에는 빛을 이용해서

밤낮을 만들어보자!!