Files
Main/Assets/Plugins/Code/UniScene/Camera/CameraManager.cs

250 lines
8.4 KiB
C#
Raw Normal View History

2025-01-25 04:38:09 +08:00
using Thousandto.Core.Asset;
using Thousandto.Core.Base;
using Thousandto.Core.PostEffect;
using System.Collections.Generic;
using UnityEngine;
namespace Thousandto.Plugins.Common.UniScene
{
//摄像机管理器
public class CameraManager
{
#region//常量
public const string CameraRootName = "[Cameras]";
public const string NormalCameraName = "NormalCamera";
#endregion
#region//私有变量
//根节点
private Transform _camerasRoot = null;
//摄像机列表
private List<Camera> _sceneCamList = new List<Camera>();
//摄像机控制器
private CameraControl _sceneCameraControl = null;
//上一个摄像机
private Camera _oldCamera = null;
//当前摄像机
private Camera _curCamera = null;
//当前的切换脚本
private CameraBlendRender _blendScript = null;
#endregion
#region//属性
//根节点
public Transform CamerasRoot
{
get
{
return _camerasRoot;
}
}
public Camera OldCamera
{
get
{
return _oldCamera;
}
}
public Camera CurCamera
{
get
{
return _curCamera;
}
}
public CameraControl SceneCameraControl
{
get
{
return _sceneCameraControl;
}
}
public List<Camera> SceneCamList
{
get
{
return _sceneCamList;
}
}
#endregion
#region//公有函数
//初始化
public void Initialize()
{
_sceneCamList.Clear();
var sceneRoot = GameObject.Find("SceneRoot");
_camerasRoot = sceneRoot.transform.Find(CameraRootName);
if (_camerasRoot != null)
{
for (int i = 0; i < _camerasRoot.childCount; ++i)
{
var camera = _camerasRoot.GetChild(i).GetComponent<Camera>();
if (camera != null)
{
camera.allowHDR = false;
camera.allowMSAA = false;
camera.useOcclusionCulling = false;
camera.allowDynamicResolution = false;
camera.usePhysicalProperties = false;
UnityUtils.Reset(camera.transform);
_sceneCamList.Add(camera);
var audio = camera.GetComponent<AudioListener>();
if(audio != null)
{
GameObject.DestroyImmediate(audio);
}
}
}
}
//创建默认摄像机
{
if (_camerasRoot == null)
{
var camerasGo = new GameObject(CameraRootName);
_camerasRoot = camerasGo.transform;
_camerasRoot.parent = sceneRoot.transform;
}
//创建摄像机
var cameraGo = new GameObject(NormalCameraName);
cameraGo.transform.parent = _camerasRoot;
UnityUtils.Reset(cameraGo.transform);
var camera = UnityUtils.RequireComponent<Camera>(cameraGo);
_sceneCamList.Add(camera);
camera.allowHDR = false;
camera.allowMSAA = false;
camera.useOcclusionCulling = false;
camera.allowDynamicResolution = false;
camera.usePhysicalProperties = false;
}
_sceneCameraControl = UnityUtils.RequireComponent<CameraControl>(_camerasRoot.gameObject);
_sceneCameraControl.FreeMode = false;
_sceneCameraControl.FeatureHeight = 1.5f;
//设置摄像机参数
for (int i = 0; i < _sceneCamList.Count; ++i)
{
_sceneCamList[i].tag = "MainCamera";
_sceneCamList[i].cullingMask = ~(LayerUtils.UI_Mask | LayerUtils.LayerToMask(LayerUtils.SceneChange1) | LayerUtils.LayerToMask(LayerUtils.SceneChange2));
_sceneCamList[i].clearFlags = CameraClearFlags.Skybox;
_sceneCamList[i].renderingPath = RenderingPath.Forward;
_sceneCamList[i].gameObject.SetActive(false);
UnityUtils.Reset(_sceneCamList[i].transform);
if (_sceneCamList[i].gameObject.activeSelf)
{
// _sceneCameraControl.SetCameraTrans(_sceneCamList[i].transform);
}
}
if(!_camerasRoot.gameObject.activeSelf)
{
_camerasRoot.gameObject.SetActive(true);
}
}
//反初始化
public void Uninitialize()
{
if(_oldCamera != null)
{
_oldCamera.targetTexture = null;
}
_oldCamera = null;
if(_blendScript != null)
{
GameObject.DestroyImmediate(_blendScript);
}
_blendScript = null;
}
//改变摄像机
public bool ChangeCamera(string cameraName, bool blend = true, float blendTime = 1f)
{
var isFind = false;
Camera camera = null;
for (int i = 0; i < _sceneCamList.Count; ++i)
{
if(_sceneCamList[i].name == cameraName)
{
camera = _sceneCamList[i];
//_sceneCameraControl.SetCameraTrans(_sceneCamList[i].transform);
isFind = true;
break;
}
}
if (!isFind)
{
return false;
}
if (camera == null)
{
return false;
}
if (_curCamera != camera)
{
if (_blendScript != null)
{
GameObject.Destroy(_blendScript);
}
_blendScript = null;
if (blend)
{
_oldCamera = _curCamera;
_curCamera = camera;
if (_oldCamera != null)
{
_blendScript = UnityUtils.RequireComponent<CameraBlendRender>(_curCamera.gameObject);
_blendScript.PlayBlend(_oldCamera, blendTime, () =>
{
GameObject.Destroy(_blendScript);
_blendScript = null;
_oldCamera.gameObject.SetActive(false);
});
}
}
else
{
_curCamera = camera;
_oldCamera = null;
}
PostEffectManager.Instance.ReInitialize(_curCamera);
_sceneCameraControl.CurCamera = _curCamera;
/*
* //需要时开启离屏特效,现在暂时不需要了
if (_camerasRoot != null)
{
Debug.LogError("Invoke:OnSceneCameraChanged::" + (_curCamera == null ? "NULL" : _curCamera.name));
_camerasRoot.gameObject.SendMessage("OnSceneCameraChanged", _curCamera, SendMessageOptions.DontRequireReceiver);
}
*/
for (int i = 0; i < _sceneCamList.Count; ++i)
{
if (_oldCamera != null)
{
_sceneCamList[i].gameObject.SetActive(_sceneCamList[i].name == cameraName || _sceneCamList[i].name == _oldCamera.name);
}
else
{
_sceneCamList[i].gameObject.SetActive(_sceneCamList[i].name == cameraName);
}
}
}
return true;
}
public void LookTransform( Transform trans )
{
CurCamera.transform.position = trans.position;
CurCamera.transform.rotation = trans.rotation;
CurCamera.transform.Translate( new Vector3( 0, 0, -5 ), Space.Self );
}
#endregion
}
}