diff options
author | chai <chaifix@163.com> | 2021-09-29 20:26:12 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-09-29 20:26:12 +0800 |
commit | b781f9ecf36bcc6c614538ac427fa2eb8f1e29d2 (patch) | |
tree | b7380f99de4763c56f80826c26f7875a89ef8dfe | |
parent | 61d6e9bf192ffa54abc57bab69b1bd88c3b8d62b (diff) |
*misc
6 files changed, 46 insertions, 7 deletions
diff --git a/Assets/Bundle/Shaders/Common/Image/common_img_motionblur.shader b/Assets/Bundle/Shaders/Common/Image/common_img_motionblur.shader index 702bbd4b..6219bdac 100644 --- a/Assets/Bundle/Shaders/Common/Image/common_img_motionblur.shader +++ b/Assets/Bundle/Shaders/Common/Image/common_img_motionblur.shader @@ -48,6 +48,8 @@ Shader "Erika/Common/Image/MotionBlur" float _Iterate; // 迭代次数 + float _AlphaMultiplier; // + v2f vert(appdata_img v) { v2f o; @@ -71,9 +73,12 @@ Shader "Erika/Common/Image/MotionBlur" fixed2 uv = uv0 + step * i * fixed2(cos(radians(_Angle)), sin(radians(_Angle))); if(uv.x > 1) continue; if(uv.x < 0) continue; - color += tex2D(_MainTex, uv) * 1 / count; + float weight = 0.15 - 0.15 * ((float)i / (float)count); + color += tex2D(_MainTex, uv) * weight; } + color.a *= _AlphaMultiplier; + return color; } ENDCG diff --git a/Assets/Scripts/Managers/UnitManager.cs b/Assets/Scripts/Managers/UnitManager.cs index 0d43f60f..6196e892 100644 --- a/Assets/Scripts/Managers/UnitManager.cs +++ b/Assets/Scripts/Managers/UnitManager.cs @@ -36,7 +36,7 @@ public class UnitManager : Singleton<UnitManager> if(obj)
{
snap = Object.Instantiate<UnitSnapshot>(obj);
- snap.gameObject.hideFlags = HideFlags.HideInHierarchy | HideFlags.DontSave;
+ //snap.gameObject.hideFlags = HideFlags.HideInHierarchy | HideFlags.DontSave;
snap.Initialize(unit);
snap.active = false;
}
diff --git a/Assets/Scripts/Unit/Components/UnitLensEffect.cs b/Assets/Scripts/Unit/Components/UnitLensEffect.cs index 7758c943..a3c5d2c8 100644 --- a/Assets/Scripts/Unit/Components/UnitLensEffect.cs +++ b/Assets/Scripts/Unit/Components/UnitLensEffect.cs @@ -140,6 +140,8 @@ public class UnitLensEffect : UnitComponent }
}
+ List<LensEffectBase> temp = ListPool<LensEffectBase>.Get();
+
for (int i = 0; i < m_Effects.Count; ++i)
{
LensEffectBase eff = m_Effects[i];
@@ -147,8 +149,20 @@ public class UnitLensEffect : UnitComponent if (method == null)
continue;
method.Invoke(eff, new object[] { });
+ if(eff.CanDestroy())
+ {
+ temp.Add(eff);
+ }
}
+ for(int i = 0; i< temp.Count; ++i)
+ {
+ temp[i].OnDestroy();
+ m_Effects.Remove(temp[i]);
+ }
+
+ ListPool<LensEffectBase>.Release(temp);
+
foreach (var cb in m_InUseCommandBuffers)
{
CameraEvent ce = cb.Key.ToCameraEvent();
diff --git a/Assets/Scripts/Unit/Components/UnitState/PCState.cs b/Assets/Scripts/Unit/Components/UnitState/PCState.cs index e545dea0..1bdd355f 100644 --- a/Assets/Scripts/Unit/Components/UnitState/PCState.cs +++ b/Assets/Scripts/Unit/Components/UnitState/PCState.cs @@ -144,7 +144,7 @@ public partial class PCState : UnitState UnitSnapshotInfo info = owner.TakeSnapshot();
Vector2 dir = TestErika.Instance.monster.owner.center + new Vector3(offset, -0.5f, 0) - owner.center;
- LensEffect_Dash dash = new LensEffect_Dash(Color.white, 2, Mathf.Atan2(dir.y, dir.x), info);
+ LensEffect_Dash dash = new LensEffect_Dash(Color.white, 0.1f, Mathf.Atan2(dir.y, dir.x), info);
owner.unitLensEffect.AddEffect(dash);
owner.center = TestErika.Instance.monster.owner.center + new Vector3(offset, -0.5f, 0);
diff --git a/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs b/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs index 36bde0e3..92e75ca6 100644 --- a/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs +++ b/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs @@ -10,7 +10,7 @@ public class MaterialEntry }
// unit 镜头效果,和image effect的区别在于不光是后处理
-public abstract class LensEffectBase : MonoBehaviour
+public abstract class LensEffectBase
{
public enum EStage
{
@@ -104,6 +104,10 @@ public abstract class LensEffectBase : MonoBehaviour public virtual void BeforeEverything(EStage stage, CommandBuffer cb) { }
public virtual void AfterEverything(EStage stage, CommandBuffer cb) { }
+ public virtual bool CanDestroy() { return false; }
+
+ public virtual void OnDestroy() { }
+
// 角色渲染完毕
public virtual void OnRenderFinish()
{
diff --git a/Assets/Scripts/Unit/LensEffect/LensEffect_Dash.cs b/Assets/Scripts/Unit/LensEffect/LensEffect_Dash.cs index 935a7286..84f8edcb 100644 --- a/Assets/Scripts/Unit/LensEffect/LensEffect_Dash.cs +++ b/Assets/Scripts/Unit/LensEffect/LensEffect_Dash.cs @@ -14,6 +14,8 @@ public class LensEffect_Dash : LensEffectBase TRS trs;
float angle;
+ float curTime = 0;
+
public LensEffect_Dash(Color color, float lifeTime, float angle, UnitSnapshotInfo snapshot) : base() { rimColor = color; @@ -22,6 +24,7 @@ public class LensEffect_Dash : LensEffectBase trs = snapshot.trs; this.snapshot = UnitManager.Instance.ClaimSnapshotSolo(snapshot); this.angle = angle; + } public override void AfterForwardOpaque(EStage stage, CommandBuffer cb) @@ -41,7 +44,7 @@ public class LensEffect_Dash : LensEffectBase void Before(CommandBuffer cb) { - cb.GetTemporaryRT(tempID, -1, -1, 24, FilterMode.Bilinear); + cb.GetTemporaryRT(tempID, -1, -1, 24, FilterMode.Bilinear); cb.SetRenderTarget(tempID); cb.ClearRenderTarget(true, true, new Color(0, 0, 0, 0)); @@ -65,15 +68,28 @@ public class LensEffect_Dash : LensEffectBase } void After(CommandBuffer cb) - { - MaterialEntry blur = ClaimMaterial(StaticDefine.shaders[EShader.MotionBlur].name); + {
+ curTime += Time.deltaTime;
+
+ MaterialEntry blur = ClaimMaterial(StaticDefine.shaders[EShader.MotionBlur].name); Vector4 tileOffset = RenderingUtility.GetTillingOffset(MainCamera.Instance.camera, owner.center, owner.unitDetail.snapshotBound);
blur.material.SetVector("_TileOffset", tileOffset);
blur.material.SetFloat("_Angle", Mathf.Rad2Deg * angle);
+ blur.material.SetFloat("_AlphaMultiplier", Mathf.Clamp(1 - curTime / lifeTime, 0, 1));
cb.Blit(tempID, BuiltinRenderTextureType.CameraTarget, blur.material); cb.ReleaseTemporaryRT(tempID); } + public override bool CanDestroy()
+ {
+ return curTime > lifeTime;
+ } + + public override void OnDestroy()
+ {
+ UnitManager.Instance.ReleaseSnapshot(ref snapshot);
+ }
+ }
\ No newline at end of file |