using System; using UnityEngine; using UnityEngine.UI; public partial class DispatchView : View { [SerializeField] GameObject mapPanel; [SerializeField] ExtendText levelFormatText; [SerializeField] DispatchSettingView settingView; [SerializeField] AreaUI[] areaUIs; public override void Show() { GameUIMgr.SSetMainUiOn(false); ResetPosition(); mapPanel?.SetActive(true); viewState = ViewState.Shown; RefreshMap(); LocalizationText.OnLanguageChange += HandleLangChange; } private void HandleLangChange() { levelFormatText?.SetText(FormatString.StringFormat("[dispatch] Lv. {0}", DispatchDataGroup.Instance.DispatchData.DispatchLevel)); } public override void Hide() { LocalizationText.OnLanguageChange -= HandleLangChange; viewState = ViewState.Hidden; mapPanel?.SetActive(false); GameUIMgr.SSetMainUiOn(true); } private void LateUpdate() { if (viewState != ViewState.Shown) return; for (int i = 0; i < areaUIs.Length; ++i) { areaUIs[i].Update(); } } private void RefreshMap() { for(int i = 0; i < areaUIs.Length; ++i) { var targetUI = areaUIs[i]; if(DispatchDataGroup.Instance.DispatchData.TryGetArea(targetUI.areaType, out var area)) targetUI.SetArea(area, OnClickMissionButton); } } private void OnClickMissionButton(AreaUI clickedArea) { if (settingView is null) return; var now = TimeUtils.Now(); if(clickedArea.area.Mission.IsAvailableGetReward(now)) { clickedArea.area.Mission.GetReward(); clickedArea.area.StartRefreshTime(now); } else if(!clickedArea.area.IsInRefreshTime(now)) { settingView.SetArea(clickedArea.area); settingView.Show(); } else { GameUIMgr.SOpenToast(LocalizationText.GetText("try_and_failed_1")); } } } public partial class DispatchView : View { [Serializable] class AreaUI { public AreaType areaType; public Button missionBtn; public ExtendImage missionIconImage; public DispatchersController dispatcherCtrl; public RectTransform[] missionPositions; public DispatchData.Area area { get; private set; } bool prevCanGetRewardState; bool prevDispatchingState; public void SetArea(DispatchData.Area area, Action onClickMissionBtn) { this.area = area; missionBtn.onClick.RemoveAllListeners(); missionBtn.onClick.AddListener(() => onClickMissionBtn?.Invoke(this)); if(area.MissionPositionIndex >= 0 && area.MissionPositionIndex < missionPositions.Length) { missionBtn.transform.position = missionPositions[area.MissionPositionIndex].position; missionBtn.gameObject.SetActive(true); } else { missionBtn.transform.position = missionPositions[missionPositions.Length - 1].position; missionBtn.gameObject.SetActive(true); } prevCanGetRewardState = area.Mission.IsAvailableGetReward(TimeUtils.Now()); SetMissionIconImage(prevCanGetRewardState); prevDispatchingState = area.Mission.InProgress(TimeUtils.Now()); SetDispatchersController(prevDispatchingState); } public void Update() { if(area is null) return; var now = TimeUtils.Now(); bool canGetReward = area.Mission.IsAvailableGetReward(now); if (prevCanGetRewardState != canGetReward) { SetMissionIconImage(canGetReward); prevCanGetRewardState = canGetReward; } bool dispatching = area.Mission.InProgress(now); if (prevDispatchingState != dispatching) { SetDispatchersController(dispatching); prevDispatchingState = dispatching; } } private void SetMissionIconImage(bool isCompleted) { if (isCompleted) missionIconImage?.SetImageInAtlasAsync("atlasMateSD", "0"); else missionIconImage?.SetImageInAtlasAsync("atlasMateSD", "1"); } private void SetDispatchersController(bool activate) { dispatcherCtrl?.gameObject.SetActive(activate); if (activate) dispatcherCtrl?.StartDispatch(missionBtn.transform as RectTransform, area); } } }