You've already forked ParticleEffectForUGUI
mirror of
https://github.com/mob-sakai/ParticleEffectForUGUI.git
synced 2026-05-16 05:00:07 +00:00
Compare commits
5 Commits
4.0.0-prev
...
4.0.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e1715afbab | ||
|
|
2f51bff791 | ||
|
|
59221d5821 | ||
|
|
4fe9a3200d | ||
|
|
8c959b257c |
24
CHANGELOG.md
24
CHANGELOG.md
@@ -1,3 +1,27 @@
|
|||||||
|
# [4.0.0](https://github.com/mob-sakai/ParticleEffectForUGUI/compare/3.3.12...4.0.0) (2022-06-21)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* correct world space particle position when changing screen size ([c6644a2](https://github.com/mob-sakai/ParticleEffectForUGUI/commit/c6644a213263375c7a35b5082ef4b71cc58964e6))
|
||||||
|
* keep properly canvas batches ([d8e96e6](https://github.com/mob-sakai/ParticleEffectForUGUI/commit/d8e96e69a62dff7a451eaed32c7a814e7e62dbb9))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* adaptive scaling for UI ([aa0d56f](https://github.com/mob-sakai/ParticleEffectForUGUI/commit/aa0d56f9faa05e9679d4b476bcf135eafb1b8af9))
|
||||||
|
* add overlay window for UIParticle ([7b21c50](https://github.com/mob-sakai/ParticleEffectForUGUI/commit/7b21c500ef78103b605fdca71051d2357b09602f))
|
||||||
|
* add particle attractor component ([386170c](https://github.com/mob-sakai/ParticleEffectForUGUI/commit/386170cbf68ebf59d4510fe0a45cf83925ec9ba4))
|
||||||
|
* display warning in inspector if using 'TEXCOORD*.zw' components as custom vertex stream ([59221d5](https://github.com/mob-sakai/ParticleEffectForUGUI/commit/59221d58217a440b77d504e6428bf99f10246260))
|
||||||
|
* mesh sharing group ([9afeebf](https://github.com/mob-sakai/ParticleEffectForUGUI/commit/9afeebf67212cdf4d3ac9e9a3b78a7ced5c7ecfe))
|
||||||
|
* random mesh sharing group ([4fa43ed](https://github.com/mob-sakai/ParticleEffectForUGUI/commit/4fa43eda4bc70c9c827c4fad9d5ae1327bfbc322))
|
||||||
|
* support 8+ materials ([b76bf5a](https://github.com/mob-sakai/ParticleEffectForUGUI/commit/b76bf5a5ad378c3c4b16bcf08d21337757557101)), closes [#122](https://github.com/mob-sakai/ParticleEffectForUGUI/issues/122) [#152](https://github.com/mob-sakai/ParticleEffectForUGUI/issues/152) [#186](https://github.com/mob-sakai/ParticleEffectForUGUI/issues/186)
|
||||||
|
|
||||||
|
|
||||||
|
### BREAKING CHANGES
|
||||||
|
|
||||||
|
* If you update to v4, you may be required to adjust your UIParticle.scale.
|
||||||
|
|
||||||
# [4.0.0-preview.1](https://github.com/mob-sakai/ParticleEffectForUGUI/compare/3.3.12...4.0.0-preview.1) (2022-06-18)
|
# [4.0.0-preview.1](https://github.com/mob-sakai/ParticleEffectForUGUI/compare/3.3.12...4.0.0-preview.1) (2022-06-18)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
23
README.md
23
README.md
@@ -1,8 +1,6 @@
|
|||||||
Particle Effect For UGUI (UI Particle)
|
Particle Effect For UGUI (UI Particle)
|
||||||
===
|
===
|
||||||
|
|
||||||
**:warning: NOTE: Do not use [the obsolete tags and branches](https://github.com/mob-sakai/ParticleEffectForUGUI/issues/108) to reference the package. They will be removed in near future. :warning:**
|
|
||||||
|
|
||||||
This plugin provide a component to render particle effect for uGUI in Unity 2018.2 or later.
|
This plugin provide a component to render particle effect for uGUI in Unity 2018.2 or later.
|
||||||
The particle rendering is maskable and sortable, without Camera, RenderTexture or Canvas.
|
The particle rendering is maskable and sortable, without Camera, RenderTexture or Canvas.
|
||||||
|
|
||||||
@@ -30,26 +28,35 @@ This plugin uses new APIs `MeshBake/MashTrailBake` (added with Unity 2018.2) to
|
|||||||
You can mask and sort particles for uGUI without Camera, RenderTexture, Canvas.
|
You can mask and sort particles for uGUI without Camera, RenderTexture, Canvas.
|
||||||
|
|
||||||
Compares this "Baking mesh" approach with the conventional approach:
|
Compares this "Baking mesh" approach with the conventional approach:
|
||||||
(This scene is included in the package.)
|
[Performance test results](https://github.com/mob-sakai/ParticleEffectForUGUI/issues/193#issuecomment-1160028374)
|
||||||
|
|
||||||
|Approach|Good|Bad|Screenshot|
|
|Approach|Good|Bad|Screenshot|
|
||||||
|-|-|-|-|
|
|-|-|-|-|
|
||||||
|Baking mesh<br>**\(UIParticle\)**|Rendered as is.<br>Maskable.<br>Sortable.<br>Less objects.|**Requires Unity 2018.2 or later.**<br>Requires UI shaders to use Mask.|<img src="https://user-images.githubusercontent.com/12690315/41765089-0302b9a2-763e-11e8-88b3-b6ffa306bbb0.gif" width="500px">|
|
|Baking mesh<br>**\(UIParticle\)**|Rendered as is.<br>Maskable.<br>Sortable.<br>Less objects.|[Not support `TEXCOORD*.zw` components for custom vertex stream](https://github.com/mob-sakai/ParticleEffectForUGUI/issues/191#issuecomment-1043409186)|<img src="https://user-images.githubusercontent.com/12690315/41765089-0302b9a2-763e-11e8-88b3-b6ffa306bbb0.gif" width="500px">|
|
||||||
|Do nothing|Rendered as is.|**Looks like a glitch.**<br>Not maskable.<br>Not sortable.|<img src="https://user-images.githubusercontent.com/12690315/41765090-0329828a-763e-11e8-8d8a-f1d269ea3bc7.gif" width="500px">|
|
|Do nothing|Rendered as is.|**Looks like a glitch.**<br>Not maskable.<br>Not sortable.|<img src="https://user-images.githubusercontent.com/12690315/41765090-0329828a-763e-11e8-8d8a-f1d269ea3bc7.gif" width="500px">|
|
||||||
|Convert particle to UIVertex<br>[\(UIParticleSystem\)](https://forum.unity.com/threads/free-script-particle-systems-in-ui-screen-space-overlay.406862/)|Maskable.<br>Sortable.<br>Less objects.|**Adjustment is difficult.**<br>Requires UI shaders.<br>Difficult to adjust scale.<br>Force hierarchy scalling.<br>Simulation results are incorrect.<br>Trail, rotation of transform, time scaling are not supported.<br>Generate heavy GC every frame.|<img src="https://user-images.githubusercontent.com/12690315/41765088-02deb9c6-763e-11e8-98d0-9e0c1766ef39.gif" width="500px">|
|
|Convert particle to UIVertex<br>[\(UIParticleSystem\)](https://forum.unity.com/threads/free-script-particle-systems-in-ui-screen-space-overlay.406862/)|Maskable.<br>Sortable.<br>Less objects.|**Adjustment is difficult.**<br>Requires UI shaders.<br>Difficult to adjust scale.<br>Force hierarchy scalling.<br>Simulation results are incorrect.<br>Trail, rotation of transform, time scaling are not supported.<br>Generate heavy GC every frame.|<img src="https://user-images.githubusercontent.com/12690315/41765088-02deb9c6-763e-11e8-98d0-9e0c1766ef39.gif" width="500px">|
|
||||||
|Use Canvas to sort|Rendered as is.<br>Sortable.|**You must to manage sorting orders.**<br>Not maskable.<br>More batches.|<img src="https://user-images.githubusercontent.com/12690315/41765087-02b866ea-763e-11e8-8c33-081c9ad852f8.gif" width="500px">|
|
|Use Canvas to sort|Rendered as is.<br>Sortable.|**You must to manage sorting orders.**<br>Not maskable.<br>More batches.|<img src="https://user-images.githubusercontent.com/12690315/41765087-02b866ea-763e-11e8-8c33-081c9ad852f8.gif" width="500px">|
|
||||||
|Use RenderTexture|Maskable.<br>Sortable.|**Requires Camera and RenderTexture.**<br>Difficult to adjust position and size.<br>Quality depends on the RenderTexture's setting.|<img src="https://user-images.githubusercontent.com/12690315/41765085-0291b3e2-763e-11e8-827b-72e5ee9bc556.gif" width="500px">|
|
|Use RenderTexture|Maskable.<br>Sortable.|**Requires Camera and RenderTexture.**<br>Difficult to adjust position and size.<br>Quality depends on the RenderTexture's setting.|<img src="https://user-images.githubusercontent.com/12690315/41765085-0291b3e2-763e-11e8-827b-72e5ee9bc556.gif" width="500px">|
|
||||||
|
|
||||||
|
|Approach|FPS on Editor|FPS on iPhone6|FPS on Xperia XZ|
|
||||||
|
|--|--|--|--|
|
||||||
|
|Particle System|43|57|22|
|
||||||
|
|UIParticleSystem|4|3|0 (unmeasurable)|
|
||||||
|
|Sorting By Canvas|43|44|18|
|
||||||
|
|UIParticle|17|12|4|
|
||||||
|
|UIParticle with MeshSharing|44|45|30|
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
|
||||||
#### Features
|
#### Features
|
||||||
|
|
||||||
* Easy to use: the package is out-of-the-box
|
* Easy to use: the package is out-of-the-box
|
||||||
* Sort particle effects with UI
|
* Sort particle effects and UI by sibling index
|
||||||
* No Camera, RenderTexture or Canvas are required
|
* No Camera, RenderTexture or Canvas are required
|
||||||
* Masking with Mask or RectMask2D
|
* Masking by Mask or RectMask2D
|
||||||
* Support Trail module
|
* Support Trail module
|
||||||
* Change alpha with CanvasGroup
|
* Support CanvasGroup alpha
|
||||||
* No heavy allocation every frame
|
* No allocations
|
||||||
* Support overlay, camera space and world space
|
* Support overlay, camera space and world space
|
||||||
* Support changing material property with AnimationClip (AnimatableProperty)
|
* Support changing material property with AnimationClip (AnimatableProperty)
|
||||||

|

|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -68,6 +68,8 @@ namespace Coffee.UIExtensions
|
|||||||
static private bool _xyzMode;
|
static private bool _xyzMode;
|
||||||
private bool _showMax;
|
private bool _showMax;
|
||||||
|
|
||||||
|
private static readonly HashSet<Shader> s_Shaders = new HashSet<Shader>();
|
||||||
|
private static readonly List<ParticleSystemVertexStream> s_Streams = new List<ParticleSystemVertexStream>();
|
||||||
private static readonly List<string> s_MaskablePropertyNames = new List<string>
|
private static readonly List<string> s_MaskablePropertyNames = new List<string>
|
||||||
{
|
{
|
||||||
"_Stencil",
|
"_Stencil",
|
||||||
@@ -192,6 +194,15 @@ namespace Coffee.UIExtensions
|
|||||||
t.RefreshParticles(t.particles);
|
t.RefreshParticles(t.particles);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// On select UIParticle, refresh particles.
|
||||||
|
if (!Application.isPlaying)
|
||||||
|
{
|
||||||
|
foreach (UIParticle t in targets)
|
||||||
|
{
|
||||||
|
t.RefreshParticles(t.particles);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void MaterialField(Rect rect, GUIContent label, SerializedProperty sp, int index)
|
private static void MaterialField(Rect rect, GUIContent label, SerializedProperty sp, int index)
|
||||||
@@ -260,6 +271,8 @@ namespace Coffee.UIExtensions
|
|||||||
{
|
{
|
||||||
if (!mat || !mat.shader) continue;
|
if (!mat || !mat.shader) continue;
|
||||||
var shader = mat.shader;
|
var shader = mat.shader;
|
||||||
|
if (s_Shaders.Contains(shader)) continue;
|
||||||
|
s_Shaders.Add(shader);
|
||||||
foreach (var propName in s_MaskablePropertyNames)
|
foreach (var propName in s_MaskablePropertyNames)
|
||||||
{
|
{
|
||||||
if (mat.HasProperty(propName)) continue;
|
if (mat.HasProperty(propName)) continue;
|
||||||
@@ -269,6 +282,7 @@ namespace Coffee.UIExtensions
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
s_Shaders.Clear();
|
||||||
|
|
||||||
// UIParticle for trail should be removed.
|
// UIParticle for trail should be removed.
|
||||||
if (FixButton(current.m_IsTrail, "This UIParticle component should be removed. The UIParticle for trails is no longer needed."))
|
if (FixButton(current.m_IsTrail, "This UIParticle component should be removed. The UIParticle for trails is no longer needed."))
|
||||||
@@ -286,15 +300,86 @@ namespace Coffee.UIExtensions
|
|||||||
if (0 < allPsRenderers.Length)
|
if (0 < allPsRenderers.Length)
|
||||||
{
|
{
|
||||||
var so = new SerializedObject(allPsRenderers);
|
var so = new SerializedObject(allPsRenderers);
|
||||||
var sp = so.FindProperty("m_ApplyActiveColorSpace");//.boolValue = false;
|
var sp = so.FindProperty("m_ApplyActiveColorSpace");
|
||||||
if (FixButton(sp.boolValue || sp.hasMultipleDifferentValues, "When using linear color space, the particle colors are not output correctly.\nTo fix, set 'Apply Active Color Space' in renderer module to false."))
|
if (FixButton(sp.boolValue || sp.hasMultipleDifferentValues, "When using linear color space, the particle colors are not output correctly.\nTo fix, set 'Apply Active Color Space' in renderer module to false."))
|
||||||
{
|
{
|
||||||
sp.boolValue = false;
|
sp.boolValue = false;
|
||||||
so.ApplyModifiedProperties();
|
so.ApplyModifiedProperties();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check to use 'TEXCOORD*.zw' components as custom vertex stream.
|
||||||
|
foreach (var psr in allPsRenderers)
|
||||||
|
{
|
||||||
|
if (new SerializedObject(psr).FindProperty("m_UseCustomVertexStreams").boolValue == false) continue;
|
||||||
|
if (psr.activeVertexStreamsCount == 0) continue;
|
||||||
|
psr.GetActiveVertexStreams(s_Streams);
|
||||||
|
|
||||||
|
if (2 < s_Streams.Select(GetUsedComponentCount).Sum())
|
||||||
|
{
|
||||||
|
EditorGUILayout.HelpBox(string.Format("ParticleSystem '{0}' uses 'TEXCOORD*.zw' components as custom vertex stream.\nUIParticle does not support it (See README.md).", psr.name), MessageType.Warning);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static int GetUsedComponentCount(ParticleSystemVertexStream s)
|
||||||
|
{
|
||||||
|
switch (s)
|
||||||
|
{
|
||||||
|
case ParticleSystemVertexStream.Position:
|
||||||
|
case ParticleSystemVertexStream.Normal:
|
||||||
|
case ParticleSystemVertexStream.Tangent:
|
||||||
|
case ParticleSystemVertexStream.Color:
|
||||||
|
return 0;
|
||||||
|
case ParticleSystemVertexStream.UV:
|
||||||
|
case ParticleSystemVertexStream.UV2:
|
||||||
|
case ParticleSystemVertexStream.UV3:
|
||||||
|
case ParticleSystemVertexStream.UV4:
|
||||||
|
case ParticleSystemVertexStream.SizeXY:
|
||||||
|
case ParticleSystemVertexStream.StableRandomXY:
|
||||||
|
case ParticleSystemVertexStream.VaryingRandomXY:
|
||||||
|
case ParticleSystemVertexStream.Custom1XY:
|
||||||
|
case ParticleSystemVertexStream.Custom2XY:
|
||||||
|
case ParticleSystemVertexStream.NoiseSumXY:
|
||||||
|
case ParticleSystemVertexStream.NoiseImpulseXY:
|
||||||
|
return 2;
|
||||||
|
case ParticleSystemVertexStream.AnimBlend:
|
||||||
|
case ParticleSystemVertexStream.AnimFrame:
|
||||||
|
case ParticleSystemVertexStream.VertexID:
|
||||||
|
case ParticleSystemVertexStream.SizeX:
|
||||||
|
case ParticleSystemVertexStream.Rotation:
|
||||||
|
case ParticleSystemVertexStream.RotationSpeed:
|
||||||
|
case ParticleSystemVertexStream.Velocity:
|
||||||
|
case ParticleSystemVertexStream.Speed:
|
||||||
|
case ParticleSystemVertexStream.AgePercent:
|
||||||
|
case ParticleSystemVertexStream.InvStartLifetime:
|
||||||
|
case ParticleSystemVertexStream.StableRandomX:
|
||||||
|
case ParticleSystemVertexStream.VaryingRandomX:
|
||||||
|
case ParticleSystemVertexStream.Custom1X:
|
||||||
|
case ParticleSystemVertexStream.Custom2X:
|
||||||
|
case ParticleSystemVertexStream.NoiseSumX:
|
||||||
|
case ParticleSystemVertexStream.NoiseImpulseX:
|
||||||
|
return 1;
|
||||||
|
case ParticleSystemVertexStream.Center:
|
||||||
|
case ParticleSystemVertexStream.SizeXYZ:
|
||||||
|
case ParticleSystemVertexStream.Rotation3D:
|
||||||
|
case ParticleSystemVertexStream.RotationSpeed3D:
|
||||||
|
case ParticleSystemVertexStream.StableRandomXYZ:
|
||||||
|
case ParticleSystemVertexStream.VaryingRandomXYZ:
|
||||||
|
case ParticleSystemVertexStream.Custom1XYZ:
|
||||||
|
case ParticleSystemVertexStream.Custom2XYZ:
|
||||||
|
case ParticleSystemVertexStream.NoiseSumXYZ:
|
||||||
|
case ParticleSystemVertexStream.NoiseImpulseXYZ:
|
||||||
|
return 3;
|
||||||
|
case ParticleSystemVertexStream.StableRandomXYZW:
|
||||||
|
case ParticleSystemVertexStream.VaryingRandomXYZW:
|
||||||
|
case ParticleSystemVertexStream.Custom1XYZW:
|
||||||
|
case ParticleSystemVertexStream.Custom2XYZW:
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
private static bool DrawMeshSharing(SerializedProperty spMeshSharing, SerializedProperty spGroupId, SerializedProperty spGroupMaxId, bool showMax)
|
private static bool DrawMeshSharing(SerializedProperty spMeshSharing, SerializedProperty spGroupId, SerializedProperty spGroupMaxId, bool showMax)
|
||||||
{
|
{
|
||||||
showMax |= spGroupId.intValue != spGroupMaxId.intValue ||
|
showMax |= spGroupId.intValue != spGroupMaxId.intValue ||
|
||||||
|
|||||||
@@ -272,11 +272,6 @@ namespace Coffee.UIExtensions
|
|||||||
{
|
{
|
||||||
GetComponentsInChildren(m_Renderers);
|
GetComponentsInChildren(m_Renderers);
|
||||||
|
|
||||||
for (var i = 0; i < m_Renderers.Count; i++)
|
|
||||||
{
|
|
||||||
GetRenderer(i).Clear(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
var j = 0;
|
var j = 0;
|
||||||
for (var i = 0; i < particles.Count; i++)
|
for (var i = 0; i < particles.Count; i++)
|
||||||
{
|
{
|
||||||
@@ -286,6 +281,11 @@ namespace Coffee.UIExtensions
|
|||||||
GetRenderer(j++).Set(this, particles[i], true);
|
GetRenderer(j++).Set(this, particles[i], true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (; j < m_Renderers.Count; j++)
|
||||||
|
{
|
||||||
|
GetRenderer(j).Clear(j);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void UpdateTransformScale()
|
internal void UpdateTransformScale()
|
||||||
|
|||||||
@@ -135,6 +135,9 @@ namespace Coffee.UIExtensions
|
|||||||
gameObject.layer = parent.gameObject.layer;
|
gameObject.layer = parent.gameObject.layer;
|
||||||
|
|
||||||
_particleSystem = particleSystem;
|
_particleSystem = particleSystem;
|
||||||
|
#if UNITY_EDITOR
|
||||||
|
if (Application.isPlaying)
|
||||||
|
#endif
|
||||||
if (_particleSystem.isPlaying)
|
if (_particleSystem.isPlaying)
|
||||||
{
|
{
|
||||||
_particleSystem.Clear();
|
_particleSystem.Clear();
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"name": "com.coffee.ui-particle",
|
"name": "com.coffee.ui-particle",
|
||||||
"displayName": "UI Particle",
|
"displayName": "UI Particle",
|
||||||
"description": "This plugin provide a component to render particle effect for uGUI.\nThe particle rendering is maskable and sortable, without Camera, RenderTexture or Canvas.",
|
"description": "This plugin provide a component to render particle effect for uGUI.\nThe particle rendering is maskable and sortable, without Camera, RenderTexture or Canvas.",
|
||||||
"version": "4.0.0-preview.1",
|
"version": "4.0.0",
|
||||||
"unity": "2018.2",
|
"unity": "2018.2",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
Reference in New Issue
Block a user