Addressables in process
This commit is contained in:
1 parent
1ad87e7432
commit
6b1f24b72e
13 files changed
+122
-77
No files matched your search
@@ -1,10 +1,11 @@
|
||||
using Cysharp.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Code.UI
|
||||
{
|
||||
public interface IUIFactory
|
||||
{
|
||||
Canvas CreateCanvas();
|
||||
UIElement CreatePanel(Canvas canvas, UIPanel uiPanel);
|
||||
UniTask<Canvas> CreateCanvas();
|
||||
UniTask<UIElement> CreatePanel(Canvas canvas, UIPanel uiPanel);
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,10 @@
|
||||
using System;
|
||||
|
||||
namespace Code.UI
|
||||
{
|
||||
public interface IUIService
|
||||
{
|
||||
void EnablePanel();
|
||||
void DisablePanel();
|
||||
void SwitchPanelTo(UIPanel uiPanel);
|
||||
void SwitchPanelTo(UIPanel uiPanel, Action callback = null);
|
||||
UIElement CurrentPanel { get; }
|
||||
LoadingPanel LoadingScreen { get; }
|
||||
}
|
||||
|
||||
@@ -1,24 +1,35 @@
|
||||
using Code.Configs;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using Reflex.Attributes;
|
||||
using UnityEngine;
|
||||
using UnityEngine.AddressableAssets;
|
||||
using Object = UnityEngine.Object;
|
||||
|
||||
namespace Code.UI
|
||||
{
|
||||
public class UIFactory : IUIFactory
|
||||
{
|
||||
[Inject] private UIElement[] _uiPanelsPrefabs;
|
||||
[Inject] private Canvas _canvasPrefab;
|
||||
private AssetReference _canvasAssetReference;
|
||||
private AssetReference[] _uiPanelsAssetReferences;
|
||||
|
||||
public Canvas CreateCanvas()
|
||||
public UIFactory(UIConfig uiConfig)
|
||||
{
|
||||
Canvas canvas = Object.Instantiate(_canvasPrefab);
|
||||
_canvasAssetReference = uiConfig.canvasAssetReference;
|
||||
_uiPanelsAssetReferences = uiConfig.uiPanelsAssetReferences;
|
||||
}
|
||||
public async UniTask<Canvas> CreateCanvas()
|
||||
{
|
||||
// Canvas canvasPrefab = await Addressables.LoadAssetAsync<Canvas>(_canvasAssetReference);
|
||||
Canvas canvas = (await Addressables.InstantiateAsync(_canvasAssetReference).ToUniTask()).GetComponent<Canvas>();
|
||||
|
||||
Object.DontDestroyOnLoad(canvas);
|
||||
|
||||
return canvas;
|
||||
}
|
||||
|
||||
public UIElement CreatePanel(Canvas canvas, UIPanel uiPanel)
|
||||
public async UniTask<UIElement> CreatePanel(Canvas canvas, UIPanel uiPanel)
|
||||
{
|
||||
return Object.Instantiate(_uiPanelsPrefabs[(int)uiPanel], canvas.transform);
|
||||
return (await Addressables.InstantiateAsync(_uiPanelsAssetReferences[(int)uiPanel], canvas.transform).ToUniTask()).GetComponent<UIElement>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,7 @@
|
||||
using System;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using Object = UnityEngine.Object;
|
||||
|
||||
namespace Code.UI
|
||||
{
|
||||
@@ -13,19 +16,25 @@ namespace Code.UI
|
||||
public UIService(IUIFactory factory)
|
||||
{
|
||||
_factory = factory;
|
||||
_canvas = _factory.CreateCanvas();
|
||||
Initialize();
|
||||
}
|
||||
|
||||
private async void Initialize()
|
||||
{
|
||||
_canvas = await _factory.CreateCanvas();
|
||||
|
||||
LoadingScreen = (LoadingPanel) _factory.CreatePanel(_canvas,UIPanel.Loading);
|
||||
LoadingScreen = (LoadingPanel) await _factory.CreatePanel(_canvas,UIPanel.Loading);
|
||||
}
|
||||
|
||||
public void EnablePanel() => CurrentPanel.gameObject.SetActive(true);
|
||||
public void DisablePanel() => CurrentPanel.gameObject.SetActive(false);
|
||||
|
||||
public void SwitchPanelTo(UIPanel uiPanel)
|
||||
public async void SwitchPanelTo(UIPanel uiPanel, Action callback = null)
|
||||
{
|
||||
if (!_canvas) await UniTask.WaitUntilValueChanged(_canvas, _ => !_canvas);
|
||||
|
||||
if(CurrentPanel) Object.Destroy(CurrentPanel.gameObject);
|
||||
|
||||
CurrentPanel = _factory.CreatePanel(_canvas, uiPanel);
|
||||
CurrentPanel = await _factory.CreatePanel(_canvas, uiPanel);
|
||||
|
||||
callback?.Invoke();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user