
일단 캐릭터에 필요한 UI 를 만들것이다.
UI를 생성 한다.

캔버스 안에 체력과 배고픔 스태미너를 표현할 이미지를 만든다.
먼저 Health 를 만든다.

Health의 배경
Image Icon을 추가

2D Sprite Package를 설치하고 Square를 생성하고 Image를 추가생성한다.

빈 오브젝트를 생성한후 Conditions 생성

앞서 만든 Health를 이용해 3개의 속성 생성 (Health, Hunger, Stamina)
Image 추가 → Crosshair 생성
Image 추가 → DamageIndicator 생성 → 전체화면 늘리기
데미지를 받는이펙트를 화면의 색을 바꿔주게함.
using UnityEngine;
using UnityEngine.UI;
public class Condition : MonoBehaviour // MonoBehaviour를 상속받아 Unity 컴포넌트로 동작하는 클래스 정의
{
public float curValue; // 현재 값을 저장하는 변수
public float maxValue; // 최대 값을 저장하는 변수
public float startValue; // 시작 값을 저장하는 변수
public float regenRate; // 재생 속도를 저장하는 변수
public float decayRate; // 감소 속도를 저장하는 변수
public Image uiBar; // UI에서 값을 표시할 이미지 바
private void Start() // MonoBehaviour의 Start 메서드, 게임 시작 시 호출
{
curValue = startValue; // 현재 값을 시작 값으로 초기화
}
private void Update() // MonoBehaviour의 Update 메서드, 매 프레임마다 호출
{
uiBar.fillAmount = GetPercentage(); // 이미지 바의 채워진 정도를 현재 값의 비율로 설정
}
public void Add(float amount) // 값을 증가시키는 메서드
{
curValue = Mathf.Min(curValue + amount, maxValue); // 현재 값에 amount를 더하고, 최대 값을 초과하지 않도록 설정
}
public void Subtract(float amount) // 값을 감소시키는 메서드
{
curValue = Mathf.Max(curValue - amount, 0.0f); // 현재 값에서 amount를 빼고, 0보다 작아지지 않도록 설정
}
public float GetPercentage() // 현재 값의 비율을 계산하는 메서드
{
return curValue / maxValue; // 현재 값을 최대 값으로 나눈 비율을 반환
}
}
이 스크립트는 Condition이라는 클래스를 정의하고, 게임 오브젝트의 조건(예: 체력, 마나 등)을 관리합니다. Start 메서드는 게임 시작 시 현재 값을 초기화하고, Update 메서드는 매 프레임마다 UI 바를 업데이트합니다. Add와 Subtract 메서드는 현재 값을 증가 및 감소시키며, GetPercentage 메서드는 현재 값의 비율을 계산하여 UI에 반영합니다.
using UnityEngine;
public class UICondition : MonoBehaviour // MonoBehaviour를 상속받아 Unity 컴포넌트로 동작하는 클래스 정의
{
public Condition health; // 건강 상태를 나타내는 Condition 객체
public Condition hunger; // 배고픔 상태를 나타내는 Condition 객체
public Condition stamina; // 스태미너 상태를 나타내는 Condition 객체
private void Start() // MonoBehaviour의 Start 메서드, 게임 시작 시 호출
{
// CharacterManager 싱글톤 인스턴스를 통해 Player의 condition.uiCondition을 현재 객체(this)로 설정
CharacterManager.Instance.Player.condition.uiCondition = this;
}
}
이 스크립트는 UICondition이라는 클래스를 정의합니다. 이 클래스는 Condition 객체 세 개(health, hunger, stamina)를 멤버로 가지고 있으며, 각 객체는 게임 오브젝트의 상태(예: 건강, 배고픔, 스태미너)를 나타냅니다. Start 메서드는 게임이 시작될 때 호출되며, CharacterManager 싱글톤 인스턴스를 통해 Player의 condition.uiCondition을 현재 UICondition 객체로 설정합니다. 이를 통해 플레이어의 조건 상태를 UI에 반영할 수 있게 됩니다.
using System;
using UnityEngine; /
public interface IDamagable // IDamagable 인터페이스 정의
{
void TakePhysicalDamage(int damageAmount); // 물리적 피해를 처리하는 메서드 정의
}
public class PlayerCondition : MonoBehaviour, IDamagable // MonoBehaviour를 상속받고, IDamagable 인터페이스를 구현하는 클래스 정의
{
public UICondition uiCondition; // UICondition 객체를 참조하는 변수
Condition health { get { return uiCondition.health; } } // uiCondition의 health 속성을 반환하는 프로퍼티
Condition hunger { get { return uiCondition.hunger; } } // uiCondition의 hunger 속성을 반환하는 프로퍼티
Condition stamina { get { return uiCondition.stamina; } } // uiCondition의 stamina 속성을 반환하는 프로퍼티
public float noHungerHealthDecay; // 배고픔이 0일 때 건강이 감소하는 속도
public event Action onTakeDamage; // 피해를 입었을 때 발생하는 이벤트
private void Update() // MonoBehaviour의 Update 메서드, 매 프레임마다 호출
{
hunger.Subtract(hunger.decayRate * Time.deltaTime); // 매 프레임마다 배고픔 값을 감소시킴
stamina.Add(stamina.regenRate * Time.deltaTime); // 매 프레임마다 스태미너 값을 증가시킴
if(hunger.curValue == 0.0f) // 배고픔 값이 0이면
{
health.Subtract(noHungerHealthDecay * Time.deltaTime); // 건강 값을 감소시킴
}
if(health.curValue == 0.0f) // 건강 값이 0이면
{
Die(); // Die 메서드를 호출하여 플레이어를 죽음 상태로 만듦
}
}
public void Heal(float amount) // 건강을 회복하는 메서드
{
health.Add(amount); // 건강 값을 증가시킴
}
public void Eat(float amount) // 배고픔을 회복하는 메서드
{
hunger.Add(amount); // 배고픔 값을 증가시킴
}
public void Die() // 플레이어가 죽었을 때 호출되는 메서드
{
Debug.Log("플레이어가 죽었다."); // 콘솔에 플레이어가 죽었다는 메시지를 출력
}
public void TakePhysicalDamage(int damageAmount) // 물리적 피해를 입었을 때 호출되는 메서드
{
health.Subtract(damageAmount); // 피해량만큼 건강 값을 감소시킴
onTakeDamage?.Invoke(); // onTakeDamage 이벤트를 호출하여 구독자들에게 알림
}
}
이 스크립트는 PlayerCondition이라는 클래스를 정의합니다. 이 클래스는 IDamagable 인터페이스를 구현하며, 플레이어의 건강, 배고픔, 스태미너 상태를 관리합니다.
using System;
using UnityEngine;
public class Player : MonoBehaviour // MonoBehaviour를 상속받아 Unity 컴포넌트로 동작하는 클래스 정의
{
public PlayerController controller; // PlayerController 객체를 참조하는 변수
public PlayerCondition condition; // PlayerCondition 객체를 참조하는 변수
private void Awake() // MonoBehaviour의 Awake 메서드, 오브젝트가 활성화될 때 가장 먼저 호출됨
{
CharacterManager.Instance.Player = this; // CharacterManager 싱글톤 인스턴스의 Player를 현재 객체(this)로 설정
controller = GetComponent<PlayerController>(); // 현재 오브젝트에서 PlayerController 컴포넌트를 가져옴
condition = GetComponent<PlayerCondition>(); // 현재 오브젝트에서 PlayerCondition 컴포넌트를 가져옴
}
}
이 스크립트는 Player라는 클래스를 정의합니다. 이 클래스는 플레이어 캐릭터를 나타내며, 게임 오브젝트에 부착된 컴포넌트로 동작합니다.
마지막으로 플레이어 컴포넌트 설정
이렇게 하게되면 플레이어는 실시간으로 배고픔이 깎이게 되고 다 깎이게 되면 HP가 줄어들게 설정이 되어있다.