개발의 시작 TIL(Today I Learned)

개발의 시작 TIL(Today I Learned) 추가 구현 준비

human-Novice 2024. 12. 26. 20:48

 

작업 목록

  • 귀신 개별 패턴
    • 귀신들이 플레이어의 이동을 불편하게 만드는 패턴을 설계
    • SCP 땅콩 변형 모델 추가
  • 플레이어 시스템
    • 달리기 추가: 스테미나 소모 시스템 구현
    • 정신력 게이지: 정신력에 따른 화면 변화 (어두워짐, 어지러움 등)
  • 시각적 효과
    • 시야 흔들림 효과 구현
  • UI 및 아이템
    • 교수쪽 UI: 힌트 아이템을 위한 UI 디자인
    • 배터리 아이템: 배터리 아이템 추가
    • 정신력 회복 아이템: 예시로 핫식스 아이템 추가
    • 플레이어와 귀신 애니메이션 구축
  • 귀신 및 플레이어 애니메이션
    • 귀신과 플레이어에 맞는 애니메이션 추가 및 구현
  • 패턴 및 기능 추가
    • 새로운 패턴을 가진 귀신을 구현하여 게임에 추가

작업 목록을 살펴 봤을 때 UI에 연관성이 있는 부분이 많기 때문에 UI부터 구현 해보기로 했습니다.

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

public class Condition : MonoBehaviour
{
    public float curValue;
    public float maxValue;
    public float startValue;
    public float passiveValue;
    public Image uiBar;
    private void Awake()
    {
        
    }
    private void Start()
    {
        
        curValue = startValue;
    }

    private void Update()
    {
        uiBar.fillAmount = UpdateUI();
    }

    public void Add(float amount)
    {
        curValue = Mathf.Min(curValue + amount, maxValue);
    }

    public void Subtract(float amount)
    {
        curValue = Mathf.Max(curValue - amount, 0.0f);
    }

    public float UpdateUI()
    {
        return curValue / maxValue;
    }
}

 

  • UI를 구성하고 있는 요소인 정신력, 스테미나, 배터리 UI에 붙을 기본 스크립트입니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UICondition : MonoBehaviour
{
    public Condition stamina;   // 스테미나
    public Condition mental;    // 정신력
    public Condition battery;   // 배터리
}
  • UI요소를 담고 있을 컨테이너 역할을 할 스크립트입니다. 하나의 스크립트를 달고 있지만 여기에서 용도에 따라 분리합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem.EnhancedTouch;

public class PlayerCondition : MonoBehaviour
{
    public BasePlayer basePlayer;
    public PlayerController controller;
    [SerializeField] private UICondition uiCondition;

   public Condition stamina { get { return uiCondition.stamina; } }
    public Condition mental { get { return uiCondition.mental; } }
    public Condition battery { get { return uiCondition.battery; } }
    private void Awake()
    {
        basePlayer = GetComponent<BasePlayer>();
        controller = GetComponent<PlayerController>();

    }
    private void Start()
    {
        controller.onFlash += OnFlash;
    }
    private void Update()
    {

    }


    public void MentalHeal(float amount)    // 정신력 회복 매서드
    {
        mental.Add(amount);
        
    }

    public void MentalShock(float amount)  // 정신 공격  받을 때 매서드
    {
        mental.Subtract(amount);
        // 정신력게이지에 따라 화면이 어두워진다던가 어지러워진다던가 하는 표현 필요
    }

    public void BatteryCharge(float amount)     // 배터리 충전 매서드
    {
        battery.Add(amount);    
    }

   
    private void OnFlash()
    {
        if (!controller.flashlight.activeSelf)
        {
            CoroutineManager.Instance.StopCoroutine(nameof(BatteryPassiveSubtract));
        }
        else
        {
        CoroutineManager.Instance.StartCoroutine(nameof(BatteryPassiveSubtract));

        }
    }

    private IEnumerator BatteryPassiveSubtract()
    {
        while (controller.flashlight.activeSelf)
        {
            battery.Subtract(battery.passiveValue);     // 해당 값을 아직 정하지 않았음
            yield return new WaitForSeconds(0.5f);
        }
        yield return null;
    }
    public IEnumerator StaminaPassiveSubtract()
    {
        while(stamina.curValue != 0f)
        {
            stamina.Subtract(stamina.passiveValue);     // 해당 값을 아직 정하지 않았음
            yield return new WaitForSeconds(0.5f);
        }
        yield return null;
    }
}
  • 용도 분리한 스크립트를 캐싱하고 UI에 대한 실질적인 조작 매서드를 담고 있는 스크립트입니다. 이 3가지 스크립트는 앞서 수강한 강의의 코드를 참고하여 작성하는 것으로 플레이어 쪽 UI 틀은 만들었습니다. 이제 상태나 이벤트 등을 이용해서 UI 조작 매서드 호출 해주는 식으로  사용했습니다