|:-:|:-:|:-:|
Android build 최적화
Ios 빌드 알아보기
Firewood system 리트라이
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
플레이어에 붙어 있던 클래스를 화로로 옮기면서 참조에서 머리가 조금 어지러웠지만 일단은 생각대로 구현이 되었다.