Second commit

This commit is contained in:
ThomasCharester committed 2026-09-20 15:26:03 +03:00
commit 36840f3ad4
999 files changed
+61364

No files matched your search

@@ -0,0 +1,18 @@
using Code.Infrastructure.Generators;
using UnityEngine;
using UnityEngine.UI;
namespace Code.Infrastructure.UI
{
[CreateAssetMenu(fileName = "CanvasSettings", menuName = "Configs/UI/CanvasSettings")]
[Config("Configs/UI/CanvasSettings")]
public class CanvasSettings : ScriptableObject
{
public RenderMode RenderMode;
public int OrderInLayer;
public CanvasScaler.ScaleMode ScaleMode;
public int ReferenceResolutionX;
public int ReferenceResolutionY;
public float PlaneDistance;
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: d23873b1c0034bf89886915f997b2f9a
timeCreated: 1785859025
+118
View File
@@ -0,0 +1,118 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Code.Infrastructure.Configs;
using Code.Infrastructure.Utils;
using Cysharp.Threading.Tasks;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.UI;
namespace Code.Infrastructure.UI
{
public interface IUIFactory
{
Canvas GameplayCanvas { get; }
Canvas Canvas { get; }
UniTask<UIPanel> LoadPanel(UIPanelType panelType, bool gameplayCanvas, Transform parent = null);
}
public interface IUIFactoryInitializer
{
UniTask LoadConfigs();
void SetCanvas(Canvas canvas);
void SetCanvasCamera(UnityEngine.Camera camera);
}
public class UIFactory : IDisposable, IUIFactory, IUIFactoryInitializer
{
private Dictionary<UIPanelType, UIPanelSettings> _configs;
private readonly AssetReference _canvasConfigReference;
private readonly string _configsLabel;
private AsyncOperationHandle<IList<UIPanelSettings>> _configsHandle;
private AsyncOperationHandle<CanvasSettings> _canvasSettingsHandle;
private CanvasSettings _canvasConfig;
private GameObject _gameplayCanvas;
public Canvas GameplayCanvas { get; private set; }
public Canvas Canvas { get; private set; }
public UIFactory(IConfigLocator configLocator)
{
_configsLabel = configLocator.TryGetManyConfigAssetReferences<UIPanelSettings>();
_canvasConfigReference = configLocator.TryGetConfigAssetReference<CanvasSettings>();
}
public void SetCanvas(Canvas canvas)
{
Canvas = canvas;
UnityEngine.Object.DontDestroyOnLoad(canvas.gameObject);
}
public void SetCanvasCamera(UnityEngine.Camera camera)
{
Canvas.worldCamera = camera;
Canvas.planeDistance = 0.1f;
GameplayCanvas.worldCamera = camera;
}
public async UniTask<UIPanel> LoadPanel(UIPanelType panelType, bool gameplayCanvas, Transform parent = null)
{
var panel = (await Addressables.InstantiateAsync(_configs[panelType].Prefab,
parent ?? gameplayCanvas ? _gameplayCanvas.transform : Canvas.transform).ToUniTask())
.GetComponent<UIPanel>();
panel.PanelType = panelType;
return panel;
}
public async UniTask LoadConfigs()
{
if (await AddressablesUtilities.CheckLabelExists(_configsLabel)) await LoadPanelConfigs();
_canvasSettingsHandle = Addressables.LoadAssetAsync<CanvasSettings>(_canvasConfigReference);
await _canvasSettingsHandle.ToUniTask();
_canvasConfig = _canvasSettingsHandle.Result;
_gameplayCanvas = new GameObject { name = "GameplayCanvas" };
UnityEngine.Object.DontDestroyOnLoad(_gameplayCanvas);
GameplayCanvas = _gameplayCanvas.AddComponent<Canvas>();
GameplayCanvas.renderMode = _canvasConfig.RenderMode;
GameplayCanvas.sortingOrder = _canvasConfig.OrderInLayer;
GameplayCanvas.planeDistance = _canvasConfig.PlaneDistance;
var scaler = GameplayCanvas.AddComponent<CanvasScaler>();
scaler.uiScaleMode = _canvasConfig.ScaleMode;
scaler.referenceResolution =
new Vector2(_canvasConfig.ReferenceResolutionX, _canvasConfig.ReferenceResolutionY);
GameplayCanvas.AddComponent<GraphicRaycaster>();
}
private async UniTask LoadPanelConfigs()
{
_configsHandle = Addressables.LoadAssetsAsync<UIPanelSettings>(_configsLabel);
await _configsHandle.ToUniTask();
_configs = _configsHandle.Result.ToDictionary(c => c.UIPanelType);
}
public void Dispose()
{
if (_configsHandle.IsValid())
Addressables.Release(_configsHandle);
if (_canvasSettingsHandle.IsValid())
Addressables.Release(_canvasSettingsHandle);
if (_gameplayCanvas)
Addressables.ReleaseInstance(_gameplayCanvas);
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 35696d0a97ac9023daa173dc582e7057
+22
View File
@@ -0,0 +1,22 @@
using System;
using System.Threading;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.AddressableAssets;
namespace Code.Infrastructure.UI
{
public abstract class UIPanel : MonoBehaviour, IDisposable
{
public UIPanelType PanelType { get; set; }
public abstract UniTask Open(CancellationToken cts = default);
public abstract UniTask Close(CancellationToken cts = default);
public void Dispose()
{
Addressables.ReleaseInstance(gameObject);
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 87687716d22d15d189146c86f059f922
@@ -0,0 +1,14 @@
using Code.Infrastructure.Generators;
using UnityEngine;
using UnityEngine.AddressableAssets;
namespace Code.Infrastructure.UI
{
[Config("Configs/UI/UIPanelSettings", true)]
[CreateAssetMenu(fileName = "UIPanelSettings", menuName = "Configs/UI/UIPanelSettings")]
public class UIPanelSettings : ScriptableObject
{
public AssetReference Prefab;
public UIPanelType UIPanelType;
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 263960ff516f55c6686b3c63c7a6a28e