81. Unity 최종 프로젝트 7주차(5)

이규성·2024년 2월 23일
0

TIL

목록 보기
89/106

02/22

📌알고리즘 코드 카타 (Algorithm Code Kata)

제한사항

입출력 예

|:-:|:-:|:-:|

📌팀 프로젝트 진행

목표

Android build 최적화
Ios 빌드 알아보기

금일 구현 설계

Firewood system 리트라이

  • 장작 아이템 슬롯에 있는 장작을 소모하여 불 켜기
  • 화력게이지가 다 닳으면 장작 1개 또 소모하는 식
  • 음식의 조리가 끝날 때까지 불은 켜져 있어야 하고 계속 장작을 소비함
  • 음식이 완성되고 화력게이지가 남아 있으면 자연스럽게 다 닳게 하고,
    등록된 음식이 없으면 장작 소모를 하지 않는다.

금일 구현한 사항

public class BonFire : MonoBehaviour, IInteractable
{
    [SerializeField] private int _cookingLevel = 0;
    private AudioSource _audioSource;
    private Ignition _ignition;

    private void Awake()
    {
        _audioSource = GetComponent<AudioSource>();
        _ignition = GetComponent<Ignition>();
        _audioSource.loop = true;
        var clip = Managers.Resource.GetCache<AudioClip>("BonFire.wav");
        _audioSource.clip = clip;
        _audioSource.Play();
    }

	//화로 아이템에서 인터렉트 시 발화 UI창 보여주기
    public void Interact(Player player)
    {    	
        //var ui = Managers.UI.ShowPopupUI<UICooking>();
        //ui.SetAdvancedRecipeUIActive(_cookingLevel);
        GameManager.Instance.Player.Ignition = _ignition;
        Managers.UI.ShowPopupUI<UIIgnition>();
    }
}
public class Ignition : MonoBehaviour
{
    public ItemSlot[] firewoodItemSlots = new ItemSlot[2];

    public int _count = 0;
    public int _maxCount;
    public int _index;
    public int _firePowerGauge;

    private bool _haveFirewood = false;
    private bool _startCooking = false;

    private DayCycle _dayCycle;

    public event Action<int> OnUpdatedCount;
    public event Action OnUpdatedUI;

    private void Awake()
    {
        GetFirewoodItems();
        _firePowerGauge = 0;
    }

    private void Start()
    {
        _dayCycle = GameManager.DayCycle;
        _dayCycle.OnTimeUpdated += OnConsumeFirePowerGauge;
    }
	
    //장작 슬롯에 지닌 아이템 데이터를 소모하는 함수이다.
    private void StartAFire()
    {    	
        if (_startCooking)
        {
            for (int i = 0; i < firewoodItemSlots.Length; i++)
            {
                if (firewoodItemSlots[i].quantity > 0)
                {
                    firewoodItemSlots[i].SubtractFirewoodItemQuantity(1);
                    _firePowerGauge = i == 0 ? 2 : 3;
                    OnUpdatedUI?.Invoke();

                    _haveFirewood = true;
                    return;
                }
            }            
        }       
    }

	//DayCycle의 시간 업데이트 이벤트에 구독하는 함수이다.
    public void OnConsumeFirePowerGauge()
    {
        //daycycle에서 이벤트 호출되면 일정 수치 만큼 깎는다.
        if (_haveFirewood)
        {
            _firePowerGauge -= 1;
        }

        if (_firePowerGauge < 1)
        {
            StartAFire();
        }       

        if (_firePowerGauge == 0 && firewoodItemSlots[0].quantity == 0 && firewoodItemSlots[1].quantity == 0)
        {
            _startCooking = false;
            _haveFirewood = false;
        }
    }

	//임시로 생성한 요리 시작 버튼 메서드이다.
    public void StartCookingButton()
    {
        _startCooking = true;
        StartAFire();
    }

    public void StopCookingButton()
    {
        _startCooking = false;
    }
}

Player/System에 붙어 있던 클래스를 화로 아이템으로 이동함

public class UIIgnition : UIPopup
{
    private enum GameObjects
    {
        Exit,
        UIFunctionsUseFireSlot,
        FirewoodItems
    }

    enum Helper
    {
        UIStoreFirewoodHelper
    }

    private GameObject _functionsUseFireSlotButton;
    private Transform _firewoodItems;
    private UIStoreFirewoodHelper _firewoodHelper;
    private Slider _firePowerGaugeSlider;
    private DayCycle _dayCycle;
    private Ignition _ignition;

    private List<GameObject> _itemUIList = new List<GameObject>();

    public override void Initialize()
    {
        base.Initialize();

        Bind<GameObject>(typeof(GameObjects));
        Bind<UIStoreFirewoodHelper>(typeof(Helper));

        Get<GameObject>((int)GameObjects.Exit).BindEvent((x) =>
        {
            Managers.UI.ClosePopupUI(this);
        });

        _functionsUseFireSlotButton = Get<GameObject>((int)GameObjects.UIFunctionsUseFireSlot);

        _functionsUseFireSlotButton.BindEvent((x) => { ShowCookingUIPopup(); });
        _firePowerGaugeSlider = GetComponentInChildren<Slider>();
    }

	//화로 아이템에 붙은 컴포넌트를 플레이어가 인터렉트 시 가져오기 때문에 Awake에서 이동시켰다.
    private void OnEnable()
    {
        _ignition = GameManager.Instance.Player.Ignition;
        _dayCycle = GameManager.DayCycle;

        Initialize();

        _firewoodItems = Get<GameObject>((int)GameObjects.FirewoodItems).transform;
        _firewoodHelper = Get<UIStoreFirewoodHelper>((int)Helper.UIStoreFirewoodHelper);

        _ignition.OnUpdatedUI += OnSetIngredients;
        _ignition.OnUpdatedUI += OnUpdateFirePowerGaugeSlider;
        _dayCycle.OnTimeUpdated += OnUpdateFirePowerGaugeSlider;

        OnSetIngredients();
    }

    private void Start()
    {        
        gameObject.SetActive(false);
    }

	//DayCycle의 업데이트 이벤트에 구독하는 함수이다.
    private void OnUpdateFirePowerGaugeSlider()
    {
        _firePowerGaugeSlider.value = _ignition._firePowerGauge;
    }
}

금일 이슈

금일 커밋한 사항

[➕Update] Updated firewood system

🤸🏻‍♀️Feedback

플레이어에 붙어 있던 클래스를 화로로 옮기면서 참조에서 머리가 조금 어지러웠지만 일단은 생각대로 구현이 되었다.

0개의 댓글