73 lines
2.6 KiB
C#
73 lines
2.6 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" };
|
|
|
|
_camera = cameraObject.AddComponent<UnityEngine.Camera>();
|
|
|
|
var universalCameraData = _camera.GetUniversalAdditionalCameraData();
|
|
universalCameraData.renderPostProcessing = _config.PostProcessing;
|
|
|
|
_camera.cameraType = CameraType.Game;
|
|
_camera.orthographic = _config.Orthographic;
|
|
_camera.orthographicSize = _config.OthographicSize;
|
|
_camera.fieldOfView = _config.FieldOfView;
|
|
_camera.nearClipPlane = _config.NearClip;
|
|
_camera.farClipPlane = _config.FarClip;
|
|
_camera.clearFlags = _config.ClearFlags;
|
|
_camera.backgroundColor = _config.Color;
|
|
|
|
cameraObject.AddComponent<AudioListener>();
|
|
|
|
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);
|
|
}
|
|
}
|
|
} |