diff --git a/UIParticle.cs b/UIParticle.cs
index 3282048..047b7b1 100644
--- a/UIParticle.cs
+++ b/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/UIParticleOverlayCamera.cs b/UIParticleOverlayCamera.cs
new file mode 100644
index 0000000..2433e9e
--- /dev/null
+++ b/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/UIParticleOverlayCamera.cs.meta b/UIParticleOverlayCamera.cs.meta
new file mode 100644
index 0000000..cf7098e
--- /dev/null
+++ b/UIParticleOverlayCamera.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f69dfb25b53b14addbd71dbebdbaa132
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant: