| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 | using UnityEngine;namespace FairyGUI{    /// <summary>    ///     /// </summary>    public class CaptureCamera : MonoBehaviour    {        /// <summary>        ///         /// </summary>        [System.NonSerialized]        public Transform cachedTransform;        /// <summary>        ///         /// </summary>        [System.NonSerialized]        public Camera cachedCamera;        [System.NonSerialized]        static CaptureCamera _main;        [System.NonSerialized]        static int _layer = -1;        static int _hiddenLayer = -1;        public const string Name = "Capture Camera";        public const string LayerName = "VUI";        public const string HiddenLayerName = "Hidden VUI";        void OnEnable()        {            cachedCamera = this.GetComponent<Camera>();            cachedTransform = this.gameObject.transform;            if (this.gameObject.name == Name)                _main = this;        }        /// <summary>        ///         /// </summary>        public static void CheckMain()        {            if (_main != null && _main.cachedCamera != null)                return;            GameObject go = GameObject.Find(Name);            if (go != null)            {                _main = go.GetComponent<CaptureCamera>();                return;            }            GameObject cameraObject = new GameObject(Name);            Camera camera = cameraObject.AddComponent<Camera>();            camera.depth = 0;            camera.cullingMask = 1 << layer;            camera.clearFlags = CameraClearFlags.SolidColor;            camera.backgroundColor = Color.clear;            camera.orthographic = true;            camera.orthographicSize = 5;            camera.nearClipPlane = -30;            camera.farClipPlane = 30;            camera.enabled = false;#if UNITY_5_4_OR_NEWER            camera.stereoTargetEye = StereoTargetEyeMask.None;#endif#if UNITY_5_6_OR_NEWER            camera.allowHDR = false;            camera.allowMSAA = false;#endif            cameraObject.AddComponent<CaptureCamera>();        }        /// <summary>        ///         /// </summary>        public static int layer        {            get            {                if (_layer == -1)                {                    _layer = LayerMask.NameToLayer(LayerName);                    if (_layer == -1)                    {                        _layer = 30;                        Debug.LogWarning("Please define two layers named '" + CaptureCamera.LayerName + "' and '" + CaptureCamera.HiddenLayerName + "'");                    }                }                return _layer;            }        }        /// <summary>        ///         /// </summary>        public static int hiddenLayer        {            get            {                if (_hiddenLayer == -1)                {                    _hiddenLayer = LayerMask.NameToLayer(HiddenLayerName);                    if (_hiddenLayer == -1)                    {                        Debug.LogWarning("Please define two layers named '" + CaptureCamera.LayerName + "' and '" + CaptureCamera.HiddenLayerName + "'");                        _hiddenLayer = 31;                    }                }                return _hiddenLayer;            }        }        /// <summary>        ///         /// </summary>        /// <param name="width"></param>        /// <param name="height"></param>        /// <param name="stencilSupport"></param>        /// <returns></returns>        public static RenderTexture CreateRenderTexture(int width, int height, bool stencilSupport)        {            RenderTexture texture = new RenderTexture(width, height, stencilSupport ? 24 : 0, RenderTextureFormat.ARGB32);            texture.antiAliasing = 1;            texture.filterMode = FilterMode.Bilinear;            texture.anisoLevel = 0;            texture.useMipMap = false;            texture.wrapMode = TextureWrapMode.Clamp;            texture.hideFlags = DisplayObject.hideFlags;            return texture;        }        /// <summary>        ///         /// </summary>        /// <param name="target"></param>        /// <param name="texture"></param>        /// <param name="contentHeight"></param>        /// <param name="offset"></param>        public static void Capture(DisplayObject target, RenderTexture texture, float contentHeight, Vector2 offset)        {            CheckMain();            Matrix4x4 matrix = target.cachedTransform.localToWorldMatrix;            float scaleX = new Vector4(matrix.m00, matrix.m10, matrix.m20, matrix.m30).magnitude;            float scaleY = new Vector4(matrix.m01, matrix.m11, matrix.m21, matrix.m31).magnitude;            Vector3 forward;            forward.x = matrix.m02;            forward.y = matrix.m12;            forward.z = matrix.m22;            Vector3 upwards;            upwards.x = matrix.m01;            upwards.y = matrix.m11;            upwards.z = matrix.m21;            float halfHeight = contentHeight * 0.5f;            Camera camera = _main.cachedCamera;            camera.targetTexture = texture;            float aspect = (float)texture.width / texture.height;            camera.aspect = aspect * scaleX / scaleY;            camera.orthographicSize = halfHeight * scaleY;            _main.cachedTransform.localPosition = target.cachedTransform.TransformPoint(halfHeight * aspect - offset.x, -halfHeight + offset.y, 0);            if (forward != Vector3.zero)                _main.cachedTransform.localRotation = Quaternion.LookRotation(forward, upwards);            int oldLayer = 0;            if (target.graphics != null)            {                oldLayer = target.graphics.gameObject.layer;                target.graphics.gameObject.layer = CaptureCamera.layer;            }            if (target is Container)            {                oldLayer = ((Container)target).numChildren > 0 ? ((Container)target).GetChildAt(0).layer : CaptureCamera.hiddenLayer;                ((Container)target).SetChildrenLayer(CaptureCamera.layer);            }            RenderTexture old = RenderTexture.active;            RenderTexture.active = texture;            GL.Clear(true, true, Color.clear);            camera.Render();            RenderTexture.active = old;            if (target.graphics != null)                target.graphics.gameObject.layer = oldLayer;            if (target is Container)                ((Container)target).SetChildrenLayer(oldLayer);        }    }}
 |