250 lines
8.4 KiB
C#
250 lines
8.4 KiB
C#
|
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
|
|||
|
}
|
|||
|
}
|