TIL(2024,05,27) Unity 숙련과정 플레이어 만들기(3DSurvival)

김보근·2024년 5월 27일

Unity

목록 보기
9/113
post-thumbnail

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

UI 만들기

UI를 생성 한다.

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

먼저 Health 를 만든다.

Health의 배경
Image Icon을 추가

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

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

앞서 만든 Health를 이용해 3개의 속성 생성 (Health, Hunger, Stamina)

Image 추가 → Crosshair 생성

Image 추가 → DamageIndicator 생성 → 전체화면 늘리기
데미지를 받는이펙트를 화면의 색을 바꿔주게함.

플레이어 속성

Condition 스크립트

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에 반영합니다.

UIConditions 스크립트

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에 반영할 수 있게 됩니다.

PlayerConditions 스크립트

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 인터페이스를 구현하며, 플레이어의 건강, 배고픔, 스태미너 상태를 관리합니다.

  • Update 메서드는 매 프레임마다 배고픔을 감소시키고, 스태미너를 증가시키며, 배고픔이 0일 때 건강을 감소시킵니다. 건강이 0이 되면 플레이어는 죽습니다.
  • Heal 메서드는 플레이어의 건강을 회복합니다.
  • Eat 메서드는 배고픔을 회복합니다.
  • Die 메서드는 플레이어가 죽었을 때 호출되며, 콘솔에 메시지를 출력합니다.
  • TakePhysicalDamage 메서드는 플레이어가 물리적 피해를 입었을 때 건강을 감소시키고, onTakeDamage 이벤트를 호출합니다.

Player 스크립트

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라는 클래스를 정의합니다. 이 클래스는 플레이어 캐릭터를 나타내며, 게임 오브젝트에 부착된 컴포넌트로 동작합니다.

  • controller 변수는 플레이어의 컨트롤러(PlayerController)를 참조합니다.
  • condition 변수는 플레이어의 상태(PlayerCondition)를 참조합니다.
  • Awake 메서드는 오브젝트가 활성화될 때 가장 먼저 호출되며, 다음 작업을 수행합니다:
  • CharacterManager 싱글톤 인스턴스의 Player 속성을 현재 Player 객체로 설정합니다.
    현재 오브젝트에서 PlayerController 컴포넌트를 가져와 controller 변수에 할당합니다.
    현재 오브젝트에서 PlayerCondition 컴포넌트를 가져와 condition 변수에 할당합니다.

마지막으로 플레이어 컴포넌트 설정
업로드중..

이렇게 하게되면 플레이어는 실시간으로 배고픔이 깎이게 되고 다 깎이게 되면 HP가 줄어들게 설정이 되어있다.

profile
게임개발자꿈나무

0개의 댓글