| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 | using UnityEngine;namespace Coffee.UIParticleExtensions{    [AddComponentMenu("")]    internal class BakingCamera : MonoBehaviour    {        static BakingCamera s_Instance;        private static readonly Vector3 s_OrthoPosition = new Vector3(0, 0, -1000);        private static readonly Quaternion s_OrthoRotation = Quaternion.identity;#if UNITY_2018_3_OR_NEWER && UNITY_EDITOR        // static BakingCamera s_InstanceForPrefab;        //        // private static BakingCamera InstanceForPrefab        // {        //     get        //     {        //         // If current scene is prefab mode, create OverlayCamera for editor.        //         var prefabStage = UnityEditor.SceneManagement.PrefabStageUtility.GetCurrentPrefabStage();        //         if (prefabStage == null || !prefabStage.scene.isLoaded) return null;        //         if (s_InstanceForPrefab) return s_InstanceForPrefab;        //        //         s_InstanceForPrefab = Create();        //         s_InstanceForPrefab.name += " (For Prefab Stage)";        //         UnityEngine.SceneManagement.SceneManager.MoveGameObjectToScene(s_InstanceForPrefab.gameObject, prefabStage.scene);        //        //         return s_InstanceForPrefab;        //     }        // }#endif        private static BakingCamera Instance        {            get            {// #if UNITY_2018_3_OR_NEWER && UNITY_EDITOR//                 var inst = InstanceForPrefab;//                 if (inst) return inst;// #endif                // Find instance in scene, or create new one.                return s_Instance                    ? s_Instance                    : (s_Instance = Create());            }        }        private Camera _camera;        private static BakingCamera Create()        {            var gameObject = new GameObject(typeof(BakingCamera).Name);            // This camera object is just for internal use            gameObject.hideFlags = HideFlags.HideAndDontSave;            var inst = gameObject.AddComponent<BakingCamera>();            inst._camera = gameObject.AddComponent<Camera>();            inst._camera.enabled = false;            inst._camera.orthographic = true;            // Turn camera off because particle mesh baker will use only camera matrix            gameObject.SetActive(false);            return inst;        }        private void Awake()        {            if (this == s_Instance)                DontDestroyOnLoad(gameObject);        }        public static Camera GetCamera(Canvas canvas)        {            if (!canvas) return Camera.main;            canvas = canvas.rootCanvas;            // Adjust camera orthographic size to canvas size            // for canvas-based coordinates of particles' size and speed.            var size = ((RectTransform) canvas.transform).rect.size;            Instance._camera.orthographicSize = Mathf.Max(size.x, size.y) * canvas.scaleFactor;            var camera = canvas.worldCamera;            var transform = Instance.transform;            var rotation = canvas.renderMode != RenderMode.ScreenSpaceOverlay && camera                ? camera.transform.rotation                : s_OrthoRotation;            transform.SetPositionAndRotation(s_OrthoPosition, rotation);            Instance._camera.orthographic = true;            Instance._camera.farClipPlane = 2000f;            return Instance._camera;        }    }}
 |