본문 바로가기
게임 프로그래밍/유니티 활용

[유니티 활용] ScriptableObject 로 HP Bar 만들기 - #2

by 레오란다 2022. 12. 30.
반응형

이 글은 "ScriptablObject 로 HP Bar 만들기 - #1" 에 이어서 작성하는 글입니다. 

 

▶ PlayerObj 스크립트 작성

  • Hierarchy 창에서 Player 객체를 선택하고 PlayerObj 이름으로 새 스크립트를 생성합니다.
  • PlayerObj 의 코드를 다음과 같이 작성합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerObj : MonoBehaviour
{
   // ScriptableObject로 만든 FloatVariable
   public FloatVariable floatHP;

   // ScriptableObject로 만든 GameEvent
   public GameEvent gameEvtHP;   
   
   public void GetHit(float dmg)
   {
      // 피해를 받으면 dmg 만큼 runtimeValue 에서 차감      
      floatHP.runtimeValue -= dmg;

      // 이벤트 발생 시킴
      gameEvtHP.Raise();
   }

   public void Heal(float heal)
   {
      // 치유를 받으면 heal 만큼 runtimeValue 증가
      floatHP.runtimeValue += heal;

      // 이벤트 발생 시킴
      gameEvtHP.Raise();
   }
}

 

  • 다음과 같이 [Assets > Scripts] 에 있는 FloatHP 와 HPEvent 를 연결해 줍니다.

PlayerObj 설정
FloatHP 와 HPEvent 연결

 

▶ HealthBar

  • Player 객체의 하위에 있는 HealthBar 를 선택하고 HPBar 이름으로 새 스크립트를 추가합니다.
  • HPBar 스크립트를 다음과 같이 작성합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class HPBar : MonoBehaviour
{
   // Image 객체
   public Image fill;
   
   // ScriptableObject로 만든 FloatVariable
   public FloatVariable hp;

   // Start is called before the first frame update
   void Start()
   {
      // HPBar 의 초기 설정
      fill.fillAmount = hp.runtimeValue / hp.initValue;
   }

   // GameEventListener 에 연결되는 이벤트 함수
   public void HPChanged()
   {  
      fill.fillAmount = hp.runtimeValue / hp.initValue;
   }
}
  • [Assets > Scripts] 에 있는 GameEventListener 스크립트를 HealthBar 객체에 추가합니다.
  • 각 스크립트의 설정을 다음과 같이 합니다.

HealthBar 설정
HealthBar 설정

 

▶ 테스트 버튼 생성

  • Player 캐릭터에 피해와 치료를 해주는 테스트 버튼을 생성하기 위해 Hierarchy 창에 빈 객체를 만들고 이름을 Test 라고 변경합니다.
  • Test 객체 TestScript 이름으로 새 스크립트를 추가하고 다음과 같이 코드를 작성합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestScript : MonoBehaviour
{
   public PlayerObj player;

   private void OnGUI()
   {
      if (GUI.Button(new Rect(750, 700, 150, 50), "피해"))
      {
         player.GetHit(10);
      }
      else if (GUI.Button(new Rect(910, 700, 150, 50), "치료"))
      {
         player.Heal(10);
      }
   }
}

 

  • Test 객체를 선택하고 Inspector 창에서 TestScript 의 Player 필드에 Player 객체를 연결합니다.

 

▶ 결과

실행하면 다음과 같이 캐릭터 아래에 버튼 두 개가 나타나고 각각 피해를 주거나 치료를 해주면 그에 따라 HPBar 가 변경되는 것을 볼 수 있습니다.

 

실행 화면
결과 화면

 

이 구현 방법의 핵심은 PlayerObj 에도 HPBar 에 대한 정보가 없고 HPBar 에도 PlayerObj 에 대한 정보가 전혀 없다는 것입니다. 이렇게 구현하면 HPBar 를 하나의 모듈로 사용할 수 있기 때문에 Player가 아닌 Monster 등 HPBar 가 필요한 객체에 그대로 사용할 수 있는 장점이 있습니다.

 

반응형

댓글