using System; using Code.Infrastructure.Configs; using Cysharp.Threading.Tasks; using Unity.VisualScripting; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Rendering.Universal; using UnityEngine.ResourceManagement.AsyncOperations; using Object = UnityEngine.Object; namespace Code.Infrastructure.Camera { public interface ICameraFactory { UniTask CreateCameraStateMachine(); void CreateCameraStateMachineRunner(CameraStateMachine cameraStateMachine); } public class CameraFactory : IDisposable, ICameraFactory { private AsyncOperationHandle _configHandle; private GameCamera _config; private AssetReference _gameCameraConfigReference; private UnityEngine.Camera _camera; public CameraFactory(IConfigLocator configLocator) { _gameCameraConfigReference = configLocator.TryGetConfigAssetReference(); } public async UniTask CreateCameraStateMachine() { _configHandle = Addressables.LoadAssetAsync(_gameCameraConfigReference); await _configHandle.ToUniTask(); _config = _configHandle.Result; var cameraObject = new GameObject { name = "Camera" }; cameraObject.AddComponent(); _camera = cameraObject.AddComponent(); var universalCameraData = _camera.GetUniversalAdditionalCameraData(); universalCameraData.renderPostProcessing = _config.PostProcessing; _camera.fieldOfView = _config.FieldOfView; _camera.nearClipPlane = _config.NearClip; _camera.farClipPlane = _config.FarClip; _camera.clearFlags = _config.ClearFlags; Object.DontDestroyOnLoad(cameraObject); return new CameraStateMachineContext.CameraLoadedData(_camera); } public void CreateCameraStateMachineRunner(CameraStateMachine cameraStateMachine) { var runner = _camera.AddComponent(); runner.SetStateMachine(cameraStateMachine); } public void Dispose() { Addressables.Release(_configHandle); Addressables.ReleaseInstance(_camera.gameObject); } } }