Files
Hasebe/Assets/Code/Infrastructure/Camera/CameraFactory.cs
T
2026-09-20 15:26:03 +03:00

68 lines
2.4 KiB
C#

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<CameraStateMachineContext.CameraLoadedData> CreateCameraStateMachine();
void CreateCameraStateMachineRunner(CameraStateMachine cameraStateMachine);
}
public class CameraFactory : IDisposable, ICameraFactory
{
private AsyncOperationHandle<GameCamera> _configHandle;
private GameCamera _config;
private AssetReference _gameCameraConfigReference;
private UnityEngine.Camera _camera;
public CameraFactory(IConfigLocator configLocator)
{
_gameCameraConfigReference = configLocator.TryGetConfigAssetReference<GameCamera>();
}
public async UniTask<CameraStateMachineContext.CameraLoadedData> CreateCameraStateMachine()
{
_configHandle = Addressables.LoadAssetAsync<GameCamera>(_gameCameraConfigReference);
await _configHandle.ToUniTask();
_config = _configHandle.Result;
var cameraObject = new GameObject { name = "Camera" };
cameraObject.AddComponent<AudioListener>();
_camera = cameraObject.AddComponent<UnityEngine.Camera>();
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<CameraStateMachineRunner>();
runner.SetStateMachine(cameraStateMachine);
}
public void Dispose()
{
Addressables.Release(_configHandle);
Addressables.ReleaseInstance(_camera.gameObject);
}
}
}