From 15fc588c1ca4e04457ae451f5d18db0250586b7f Mon Sep 17 00:00:00 2001 From: mob-sakai Date: Wed, 19 Dec 2018 22:09:21 +0900 Subject: [PATCH] fix #23; In overlay, particle size is too small --- .../UIExtensions/UIParticle/UIParticle.cs | 15 ++- .../UIParticle/UIParticleOverlayCamera.cs | 110 ++++++++++++++++++ .../UIParticleOverlayCamera.cs.meta | 11 ++ 3 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 Assets/Coffee/UIExtensions/UIParticle/UIParticleOverlayCamera.cs create mode 100644 Assets/Coffee/UIExtensions/UIParticle/UIParticleOverlayCamera.cs.meta diff --git a/Assets/Coffee/UIExtensions/UIParticle/UIParticle.cs b/Assets/Coffee/UIExtensions/UIParticle/UIParticle.cs index 3282048..047b7b1 100644 --- a/Assets/Coffee/UIExtensions/UIParticle/UIParticle.cs +++ b/Assets/Coffee/UIExtensions/UIParticle/UIParticle.cs @@ -229,6 +229,7 @@ namespace Coffee.UIExtensions if (m_ParticleSystem && canvas) { + var rootCanvas = canvas.rootCanvas; Profiler.BeginSample ("Disable ParticleSystemRenderer"); if (Application.isPlaying) { @@ -239,7 +240,7 @@ namespace Coffee.UIExtensions Profiler.BeginSample ("Make Matrix"); scaleaMatrix = m_ParticleSystem.main.scalingMode == ParticleSystemScalingMode.Hierarchy ? Matrix4x4.Scale (scale * Vector3.one) - : Matrix4x4.Scale (scale * canvas.rootCanvas.transform.localScale); + : Matrix4x4.Scale (scale * rootCanvas.transform.localScale); Matrix4x4 matrix = default (Matrix4x4); switch (m_ParticleSystem.main.simulationSpace) { @@ -263,13 +264,21 @@ namespace Coffee.UIExtensions if (0 < m_ParticleSystem.particleCount) { Profiler.BeginSample ("Bake Mesh"); + var cam = rootCanvas.renderMode == RenderMode.ScreenSpaceOverlay + ? UIParticleOverlayCamera.GetCameraForOvrelay (rootCanvas) + : canvas.worldCamera ?? Camera.main; + + if (!cam) + { + return; + } if (m_IsTrail) { - _renderer.BakeTrailsMesh (_mesh, true); + _renderer.BakeTrailsMesh (_mesh, cam, true); } else { - _renderer.BakeMesh (_mesh, true); + _renderer.BakeMesh (_mesh, cam, true); } Profiler.EndSample (); diff --git a/Assets/Coffee/UIExtensions/UIParticle/UIParticleOverlayCamera.cs b/Assets/Coffee/UIExtensions/UIParticle/UIParticleOverlayCamera.cs new file mode 100644 index 0000000..2433e9e --- /dev/null +++ b/Assets/Coffee/UIExtensions/UIParticle/UIParticleOverlayCamera.cs @@ -0,0 +1,110 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace Coffee.UIExtensions +{ + /// + /// + [ExecuteInEditMode] + public class UIParticleOverlayCamera : MonoBehaviour + { + //################################ + // Public/Protected Members. + //################################ + /// + /// Get instance object. + /// If instance does not exist, Find instance in scene, or create new one. + /// + public static UIParticleOverlayCamera instance + { + get + { + // Find instance in scene, or create new one. + if (object.ReferenceEquals (s_Instance, null)) + { + s_Instance = FindObjectOfType () ?? new GameObject (typeof (UIParticleOverlayCamera).Name, typeof (UIParticleOverlayCamera)).GetComponent (); + s_Instance.gameObject.SetActive (true); + s_Instance.enabled = true; + } + return s_Instance; + } + } + + public static Camera GetCameraForOvrelay (Canvas canvas) + { + var i = instance; + var rt = canvas.rootCanvas.transform as RectTransform; + var cam = i.cameraForOvrelay; + var trans = i.transform; + cam.enabled = false; + + var pos = rt.localPosition; + cam.orthographic = true; + cam.orthographicSize = Mathf.Max (pos.x, pos.y); + cam.nearClipPlane = 0.3f; + cam.farClipPlane = 1000f; + pos.z -= 100; + trans.localPosition = pos; + + return cam; + } + + //################################ + // Private Members. + //################################ + Camera cameraForOvrelay { get { return m_Camera ? m_Camera : (m_Camera = GetComponent ()) ? m_Camera : (m_Camera = gameObject.AddComponent ()); } } + Camera m_Camera; + static UIParticleOverlayCamera s_Instance; + + /// + /// Awake is called when the script instance is being loaded. + /// + void Awake () + { + // Hold the instance. + if (s_Instance == null) + { + s_Instance = GetComponent (); + } + // If the instance is duplicated, destroy itself. + else if (s_Instance != this) + { + UnityEngine.Debug.LogWarning ("Multiple " + typeof (UIParticleOverlayCamera).Name + " in scene.", this.gameObject); + enabled = false; +#if UNITY_EDITOR + + if (!Application.isPlaying) + { + DestroyImmediate (gameObject); + } + else +#endif + { + Destroy (gameObject); + } + return; + } + + cameraForOvrelay.enabled = false; + + // Singleton has DontDestroy flag. + if (Application.isPlaying) + { + DontDestroyOnLoad (gameObject); + } + } + + /// + /// This function is called when the MonoBehaviour will be destroyed. + /// + void OnDestroy () + { + // Clear instance on destroy. + if (s_Instance == this) + { + s_Instance = null; + } + } + } +} \ No newline at end of file diff --git a/Assets/Coffee/UIExtensions/UIParticle/UIParticleOverlayCamera.cs.meta b/Assets/Coffee/UIExtensions/UIParticle/UIParticleOverlayCamera.cs.meta new file mode 100644 index 0000000..cf7098e --- /dev/null +++ b/Assets/Coffee/UIExtensions/UIParticle/UIParticleOverlayCamera.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f69dfb25b53b14addbd71dbebdbaa132 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: