summaryrefslogtreecommitdiff
path: root/Client/Assets/Scripts/XEditor/XCutSceneEditor/XCutSceneCamera.cs
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-01-25 14:28:30 +0800
committerchai <chaifix@163.com>2021-01-25 14:28:30 +0800
commit6eb915c129fc90c6f4c82ae097dd6ffad5239efc (patch)
tree7dd2be50edf41f36b60fac84696e731c13afe617 /Client/Assets/Scripts/XEditor/XCutSceneEditor/XCutSceneCamera.cs
+scripts
Diffstat (limited to 'Client/Assets/Scripts/XEditor/XCutSceneEditor/XCutSceneCamera.cs')
-rw-r--r--Client/Assets/Scripts/XEditor/XCutSceneEditor/XCutSceneCamera.cs175
1 files changed, 175 insertions, 0 deletions
diff --git a/Client/Assets/Scripts/XEditor/XCutSceneEditor/XCutSceneCamera.cs b/Client/Assets/Scripts/XEditor/XCutSceneEditor/XCutSceneCamera.cs
new file mode 100644
index 00000000..dd33f871
--- /dev/null
+++ b/Client/Assets/Scripts/XEditor/XCutSceneEditor/XCutSceneCamera.cs
@@ -0,0 +1,175 @@
+#if UNITY_EDITOR
+using System;
+using UnityEngine;
+using XUtliPoolLib;
+
+namespace XEditor
+{
+ internal class XCutSceneCamera
+ {
+ private GameObject _cameraObject = null;
+
+ private GameObject _dummyObject = null;
+ private Transform _dummyCamera = null;
+ private Transform _cameraTransform = null;
+
+ private Animator _ator = null;
+ public AnimatorOverrideController _overrideController = new AnimatorOverrideController();
+
+ private UnityEngine.Camera _camera = null;
+
+ private bool _root_pos_inited = false;
+
+ private Vector3 _root_pos = Vector3.zero;
+
+ private Quaternion _idle_root_rotation = Quaternion.identity;
+ private Vector3 _dummyCamera_pos = Vector3.zero;
+
+ private CameraMotionSpace _effect_axis = CameraMotionSpace.World;
+ private XCameraMotionData _motion = new XCameraMotionData();
+
+ public XActor Target = null;
+
+ private string _trigger = null;
+
+ public UnityEngine.Camera UnityCamera
+ {
+ get { return _camera; }
+ }
+
+ public Transform CameraTrans
+ {
+ get { return _cameraTransform; }
+ }
+
+ public Animator CameraAnimator
+ {
+ get { return _ator; }
+ }
+
+ public Vector3 Position
+ {
+ get { return _cameraTransform.position; }
+ }
+
+ public Quaternion Rotaton
+ {
+ get { return _cameraTransform.rotation; }
+ }
+
+ public bool Initialize()
+ {
+ _cameraObject = GameObject.Find(@"Main Camera");
+
+ if (null != _cameraObject)
+ {
+ _camera = _cameraObject.GetComponent<UnityEngine.Camera>();
+ _cameraTransform = _cameraObject.transform;
+
+ XResourceLoaderMgr.SafeDestroy(ref _dummyObject);
+ _dummyObject = XResourceLoaderMgr.singleton.CreateFromPrefab("Prefabs/DummyCamera") as GameObject;
+ _dummyObject.name = "Dummy Camera";
+
+ _dummyCamera = _dummyObject.transform.GetChild(0);
+ _ator = _dummyObject.GetComponent<Animator>();
+
+ _overrideController.runtimeAnimatorController = _ator.runtimeAnimatorController;
+ _ator.runtimeAnimatorController = _overrideController;
+
+ _root_pos_inited = false;
+ }
+
+ return true;
+ }
+
+ public void OverrideAnimClip(string motion, string clipname)
+ {
+ //get override clip
+ AnimationClip animClip = XResourceLoaderMgr.singleton.GetSharedResource<AnimationClip>(clipname, ".anim");
+ OverrideAnimClip(motion, animClip);
+ }
+
+ public void OverrideAnimClip(string motion, AnimationClip clip)
+ {
+ //override
+ if (clip != null && _overrideController[motion] != clip) _overrideController[motion] = clip;
+ }
+
+ public void PostUpdate(float fDeltaT)
+ {
+ if (!_root_pos_inited)
+ {
+ _root_pos = _dummyCamera.position;
+ _root_pos_inited = true;
+
+ _idle_root_rotation = _motion.Follow_Position ? Quaternion.Euler(0, 180, 0) : Quaternion.identity;
+ }
+
+ InnerUpdateEx();
+ TriggerEffect();
+ }
+
+ private void InnerPosition()
+ {
+ _dummyCamera_pos = _idle_root_rotation * (_dummyCamera.position - _dummyObject.transform.position) + _dummyObject.transform.position;
+ }
+
+ private void InnerUpdateEx()
+ {
+ InnerPosition();
+
+ Vector3 v_self_p = Target == null ? Vector3.zero : Target.Actor.transform.position;
+
+ Vector3 forward = Vector3.Cross(_dummyCamera.forward, _dummyCamera.up);
+ Quaternion q = Quaternion.LookRotation(forward, _dummyCamera.up);
+
+ Vector3 delta = (_dummyCamera_pos - _root_pos);
+ Vector3 target_pos = _root_pos + (_motion.Follow_Position ? v_self_p : Vector3.zero);
+
+ _cameraTransform.rotation = _idle_root_rotation * q;
+
+ switch (_effect_axis)
+ {
+ case CameraMotionSpace.World:
+ {
+ target_pos += delta;
+ } break;
+ }
+
+ _cameraTransform.position = target_pos;
+ }
+
+ public void Effect(XCameraMotionData motion)
+ {
+ //must be called from UPDATE pass
+ AnimationClip clip = XResourceLoaderMgr.singleton.GetSharedResource<AnimationClip>(motion.Motion, ".anim");
+
+ if (clip != null)
+ {
+ _trigger = "ToEffect";
+ if (_overrideController["CameraEffect"] != clip) _overrideController["CameraEffect"] = clip;
+
+ _motion.Follow_Position = motion.Follow_Position;
+ _motion.Coordinate = motion.Coordinate;
+ _motion.AutoSync_At_Begin = motion.AutoSync_At_Begin;
+ _motion.LookAt_Target = motion.LookAt_Target;
+
+ _motion.Motion = motion.Motion;
+ }
+ }
+
+ private void TriggerEffect()
+ {
+ if (_trigger != null && !_ator.IsInTransition(0))
+ {
+ _effect_axis = _motion.Coordinate;
+
+ _ator.SetTrigger(_trigger);
+ _root_pos_inited = false;
+
+ _trigger = null;
+ }
+ }
+ }
+}
+#endif \ No newline at end of file