게임프로그래밍 개발 수업/유니티 수업

유니티 (10) FPS 게임, 플레이어의 피격 효과 구현 하기, 애니메이션 이벤트 삽입

막뇌 2023. 3. 28. 15:34

03/28 수업 내용입니다.

 

UI를 만들기 위해 Canvas를 생성

Canvas 아래에 Panel 오브젝트 생성했습니다.

아래 움짤은 Panel 오브젝트의 Inspector 창입니다.

shift 와 alt를 동시에 누른 상태로 Top Left를 선택했습니다.

panel 의 Color를 블랙 색상으로, 하위항목으로 Image와 Text를 생성해줍니다.

Image 항목의 소스 이미지는 AI의 체력바와 같은 Fade White로 지정했습니다.

그외 체력바의 속성도 동일하게 설정해 주었습니다.

텍스트 컴포넌트의 속성은 위와 같습니다.

Overflow를 설정해주어야 Font Size가 커져도 폰트가 제대로 표시됩니다.

 

역시 UI 컴포넌트를 스크립트에서 활용하려면

using UnityEngine.UI;

using 지시문이 있어줘야 합니다. 

 

플레이어의 체력을 소모시키고, 사망까지 담당시킬 스크립트를 완성했습니다.

 

사망처리는 아직 구현하지 않았고요, Debug로 콘솔에 출력되도록 하였습니다.

 

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

public class Damage : MonoBehaviour
{
    public Image hpBar;
    public Text hptxt;

    private int hp = 0;
    private int hpInit = 100;
    void Start()
    {
        hpBar.color = Color.green;
        hp = hpInit;
    }

    private void OnTriggerEnter(Collider col)
    {
        if (col.gameObject.tag == "PUNCH")
        {
            hp -= 5;
            hp = Mathf.Clamp(hp, 0, 100);
            hptxt.text = "HP:  " +"<color=#ff0000>"+ hp.ToString()+"</color>";    //문자끼리 결합시켰다.
            //맞으면 HP 텍스트가 빨간색으로 변한다.
            hpBar.fillAmount = (float)hp / (float)hpInit;
            if (hp <= 0)
                PlayerDie();

        }
        if (col.gameObject.tag == "SWORD")
        {
            hp -= 10;
            hp = Mathf.Clamp(hp, 0, 100);
            hptxt.text = "HP:  " + "<color=#ff0000>" + hp.ToString() + "</color>";    //문자끼리 결합시켰다.
            //맞으면 HP 텍스트가 빨간색으로 변한다.
            hpBar.fillAmount = (float)hp / (float)hpInit;
            if (hp <= 0)
                PlayerDie();
        }
        
    }

    void PlayerDie()
    {
        Debug.Log("사망");
    }
}

콜라이더 충돌로 HP를 깎이게 설정하였는데 Tag명 "PUNCH" 와 "SWORD" 콜라이더는 AI의 모델에서 설정하였습니다.

모델을 잘 살펴보면 뼈대에 살이 붙어있는 구조인데 그중에서 손끝 부분의 모델을 찾아

Rigidbody와 Sphere Collider를 추가했습니다. 또한 콜라이더를 추가한 오브젝트에 태그로 PUNCH를 달아주었어요.

(Tag는 오브젝트를 구분하기 위해서 추가합니다.)

콜라이더의 IsTrigger 부분을 체크하고, OnTriggerEnter에 작동하도록 위치를 조절해주면, 좀비가 공격하는 팔에 닿을 때마다 플레이어의 HP가 깎이는걸 볼 수 있습니다.

Gravity를 끄고 Is Kinematic을 켜줍니다. << 이게 뭔지는 아래에 사진에 설명

 

 

스켈레톤 AI에는 칼을 휘두르는 동작이 있었는데요

 

스켈레톤 프리팹에 서 공격 Zone을 만들기 위해

BoxCollider, Rigidbody를 설치 하고IsTrigger에 체크

MeshRenderer를 비활성화 해줍니다.

 

전자는 충돌을 구현하기 위해 필요한 컴포넌트들이고 후자는, 공격존은 눈에 보이면 안되니까 체크 해제 한 것입니다.

BoxCollider도 평소에 체크되어있으면 공격이 시작되지 않았는데도, 공격존에 있으면 데미지가 들어오겠죠.

공격이 시작되는 타이밍에만 켜주면 되는거예요. 체크해제해줍니다.

 

박스 콜라이더의 태그는 당연히 "SWORD"로 해줘야 합니다. 이것도 잊지말고 설정합니다.

 

스켈레톤 프리팹 > 큐브 오브젝트에서 Ctrl + 6을 눌러서 애니메이션 창을 열어 좌상단 애니메이션을 Attack으로 보면 

타임라인을 움직여 키프레임을 볼 수 있습니다.

 

타임라인을 움직여보면 휴머노이드가 움직이는데, 공격판정이 발생하면 좋을만한 곳에 이벤트를 삽입합니다. 

프레임 숫자가 변하는 곳의 바로 아래에 이벤트 아이콘이 있습니다. 클릭해서 추가 가능 합니다.

 

이벤트의 이름을 각각 함수로 사용 가능하다.

이벤트가 실행될 때, 콜라이더 충돌 처럼 브로드캐스팅 메시지를 유니티가 뿌리는 개념일까?

이건 내일 강사님께 여쭤 보기로..

 

함수이름을 아래처럼 지어서 Skeleton Damage클래스에 추가하여 만들었다.

public void swordBoxActive()
    {
        swordBoxCol.enabled = true;
    }

    public void swordBoxDeActive()
    {
        swordBoxCol.enabled = false;
    }

 

 

Event 키를 선택 한 후 Inspector 창의 Function 드롭다운 메뉴를 펼쳐 보세요!

Skeleton Damage 클래스도 스켈레톤 오브젝트에 존재하는 프리팹이고, 애니메이션도 하나의 컴포넌트인데, 같은 컴포넌트 내에서 생성된 함수는 볼수 있는건가 봅니다.

 

Function컴포넌트에서 공격을 시작하는 이벤트이니까 swordBoxActive() 를 선택하면 되겠죠

뒤에있는 이벤트는 공격 종료를 알리는 이벤트이니까 *DeActive()를 선택 해주면 이벤트 타이밍에 함수가 호출됩니다.

 

실제로 동작하는지 보겠습니다.

HP가 깎이는것을 확인 했습니다.

스켈레톤 뿐만 아니라 좀비도 잘 작동하네요.