From 61d6e9bf192ffa54abc57bab69b1bd88c3b8d62b Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 29 Sep 2021 19:55:57 +0800 Subject: *misc --- Assets/Scripts/Unit/Components/UnitLensEffect.cs | 24 +++++++++++--- .../Scripts/Unit/Components/UnitState/PCState.cs | 7 +++- Assets/Scripts/Unit/Controller/UnitController.cs | 21 +++++++++++- .../Unit/Events/EventMesh_LensEffect_Dash.cs | 12 +++++++ .../Unit/Events/EventMesh_LensEffect_Dash.cs.meta | 11 +++++++ Assets/Scripts/Unit/LensEffect/LensEffect_Dash.cs | 38 ++++++++++++++++------ Assets/Scripts/Unit/TimelineEventProxy.cs | 3 +- Assets/Scripts/Unit/TimelineEventProxy_Handlers.cs | 17 +++++++++- Assets/Scripts/Unit/UnitSnapshot.cs | 23 +++++++++++-- 9 files changed, 135 insertions(+), 21 deletions(-) create mode 100644 Assets/Scripts/Unit/Events/EventMesh_LensEffect_Dash.cs create mode 100644 Assets/Scripts/Unit/Events/EventMesh_LensEffect_Dash.cs.meta (limited to 'Assets/Scripts/Unit') diff --git a/Assets/Scripts/Unit/Components/UnitLensEffect.cs b/Assets/Scripts/Unit/Components/UnitLensEffect.cs index 5a68faf8..7758c943 100644 --- a/Assets/Scripts/Unit/Components/UnitLensEffect.cs +++ b/Assets/Scripts/Unit/Components/UnitLensEffect.cs @@ -77,6 +77,9 @@ public class UnitLensEffect : UnitComponent private void OnWillRenderUnit() { + if (m_Effects == null || m_Effects.Count == 0) + return; + PrepareCommandBuffers(); IBodyRendererAgent body = owner.unitRender.body; @@ -116,8 +119,11 @@ public class UnitLensEffect : UnitComponent } } - private void OnRenderUnit() - { + private void OnRenderUnit() + { + if (m_Effects == null || m_Effects.Count == 0) + return; + // 执行每个event的finish foreach (var cb in m_InUseCommandBuffers) { @@ -148,9 +154,6 @@ public class UnitLensEffect : UnitComponent CameraEvent ce = cb.Key.ToCameraEvent(); MainCamera.Instance.camera.RemoveCommandBuffer(ce, cb.Value); } - var temp = m_CachedCommandBuffers; - m_CachedCommandBuffers = m_InUseCommandBuffers; - m_InUseCommandBuffers = temp; } private void OnWillRenderObj(BodyPartRenderer renderer) @@ -163,6 +166,12 @@ public class UnitLensEffect : UnitComponent void PrepareCommandBuffers() { + if(m_InUseCommandBuffers.Count != 0) + { + var temp = m_CachedCommandBuffers; + m_CachedCommandBuffers = m_InUseCommandBuffers; + m_InUseCommandBuffers = temp; + } ERenderingEvent usedEvent = ERenderingEvent.None; for (int i = 0; i < m_Effects.Count; ++i) { @@ -207,4 +216,9 @@ public class UnitLensEffect : UnitComponent cb = null; } + public void AddEffect(LensEffectBase effect) + { + m_Effects.Add(effect); + } + } diff --git a/Assets/Scripts/Unit/Components/UnitState/PCState.cs b/Assets/Scripts/Unit/Components/UnitState/PCState.cs index 060d6e91..e545dea0 100644 --- a/Assets/Scripts/Unit/Components/UnitState/PCState.cs +++ b/Assets/Scripts/Unit/Components/UnitState/PCState.cs @@ -139,9 +139,14 @@ public partial class PCState : UnitState bool TryTeleport() { if (Input.GetKeyDown("i")) - //if (InputManager.Instance.TryCommand(0.5f, KeyCode.I)) { float offset = owner.isTowardRight ? 1.5f : -1.5f; + + 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); + owner.unitLensEffect.AddEffect(dash); + owner.center = TestErika.Instance.monster.owner.center + new Vector3(offset, -0.5f, 0); TurnAround(!owner.isTowardRight); return true; diff --git a/Assets/Scripts/Unit/Controller/UnitController.cs b/Assets/Scripts/Unit/Controller/UnitController.cs index 34490feb..c75b32b3 100644 --- a/Assets/Scripts/Unit/Controller/UnitController.cs +++ b/Assets/Scripts/Unit/Controller/UnitController.cs @@ -42,6 +42,8 @@ public class UnitController : MonoBehaviour/*, Interactable*/ public UnitBody unitBody; + public UnitLensEffect unitLensEffect; + public GameObject unitObj; // 角色模型 protected List unitComponents; @@ -93,6 +95,18 @@ public class UnitController : MonoBehaviour/*, Interactable*/ } } + public TRS trs + { + get + { + TRS trs = new TRS(); + trs.position = position; + trs.rotation = rotation; + trs.scale = lossyScale; + return trs; + } + } + public virtual Vector3 center { get @@ -166,6 +180,9 @@ public class UnitController : MonoBehaviour/*, Interactable*/ unitRender = GetOrAddUnitComponent(); unitRender.Initialize(); + unitLensEffect = GetOrAddUnitComponent(); + unitLensEffect.Initialize(); + unitDetail = gameObject.GetComponentInChildren(); } @@ -194,7 +211,8 @@ public class UnitController : MonoBehaviour/*, Interactable*/ unitAnimation.OnUpdate(); unitSkill.OnUpdate(); unitRootMotion.OnUpdate(); - } + unitLensEffect.OnUpdate(); + } public virtual void OnDestroy() { @@ -232,6 +250,7 @@ public class UnitController : MonoBehaviour/*, Interactable*/ public UnitSnapshotInfo TakeSnapshot() { UnitSnapshotInfo snapshot = new UnitSnapshotInfo(); + snapshot.trs = new TRS(unitObj.transform.position, unitObj.transform.rotation, unitObj.transform.lossyScale); snapshot.unit = this; snapshot.animStateHash = unitAnimation.baseLayer.stateHash; snapshot.normalizedTime = unitAnimation.baseLayer.playbackNormalizedTime; diff --git a/Assets/Scripts/Unit/Events/EventMesh_LensEffect_Dash.cs b/Assets/Scripts/Unit/Events/EventMesh_LensEffect_Dash.cs new file mode 100644 index 00000000..f71d7f5e --- /dev/null +++ b/Assets/Scripts/Unit/Events/EventMesh_LensEffect_Dash.cs @@ -0,0 +1,12 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class EventMesh_LensEffect_Dash : AnimationEventBase +{ + public override TimelineEventProxy.EEventType type { get { return TimelineEventProxy.EEventType.EventMesh_LensEffect_Dash; } } + public override string shortName { get { return "D"; } } + + public float lifeTime; + +} \ No newline at end of file diff --git a/Assets/Scripts/Unit/Events/EventMesh_LensEffect_Dash.cs.meta b/Assets/Scripts/Unit/Events/EventMesh_LensEffect_Dash.cs.meta new file mode 100644 index 00000000..7be0b8bf --- /dev/null +++ b/Assets/Scripts/Unit/Events/EventMesh_LensEffect_Dash.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d52092c3bed6f524ead14801bb72e1c3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Unit/LensEffect/LensEffect_Dash.cs b/Assets/Scripts/Unit/LensEffect/LensEffect_Dash.cs index 24a62264..935a7286 100644 --- a/Assets/Scripts/Unit/LensEffect/LensEffect_Dash.cs +++ b/Assets/Scripts/Unit/LensEffect/LensEffect_Dash.cs @@ -12,15 +12,17 @@ public class LensEffect_Dash : LensEffectBase float lifeTime; UnitSnapshot snapshot; TRS trs; + float angle; - public LensEffect_Dash(TRS trs, Color color, float lifeTime, UnitSnapshotInfo snapshot) : base() + public LensEffect_Dash(Color color, float lifeTime, float angle, UnitSnapshotInfo snapshot) : base() { rimColor = color; tempID = Shader.PropertyToID("_BlurRim_RT0"); this.lifeTime = lifeTime; + trs = snapshot.trs; this.snapshot = UnitManager.Instance.ClaimSnapshotSolo(snapshot); - this.trs = trs; - } + this.angle = angle; + } public override void AfterForwardOpaque(EStage stage, CommandBuffer cb) { @@ -44,17 +46,33 @@ public class LensEffect_Dash : LensEffectBase cb.ClearRenderTarget(true, true, new Color(0, 0, 0, 0)); // renderer - - } + snapshot.transform.position = trs.position; + snapshot.transform.rotation = trs.rotation; + snapshot.transform.localScale = trs.scale; + + Matrix4x4 obj2Wod = Matrix4x4.identity; + SkinnedMeshRenderer smr = snapshot.renderers[0] as SkinnedMeshRenderer; + Vector3 pos = smr.rootBone.transform.position; + Quaternion rot = smr.rootBone.transform.rotation; + obj2Wod = MatrixUtility.RotateAndTranslate(pos, rot); + + MaterialEntry mat = ClaimMaterial(StaticDefine.shaders[EShader.SolidColor].name); + mat.material.SetColor("_Color", rimColor); + mat.material.SetMatrix("_ObjectToWorld", obj2Wod); + mat.material.SetTexture("_MainTex", snapshot.renderers[0].sharedMaterial.GetTexture("_MainTex")); + + cb.DrawRenderer(snapshot.renderers[0], mat.material); + } void After(CommandBuffer cb) { - MaterialEntry blur = ClaimMaterial(StaticDefine.shaders[EShader.Blur].name); + 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); - - cb.Blit(tempID, BuiltinRenderTextureType.CameraTarget, blur.material); + Vector4 tileOffset = RenderingUtility.GetTillingOffset(MainCamera.Instance.camera, owner.center, owner.unitDetail.snapshotBound); + blur.material.SetVector("_TileOffset", tileOffset); + blur.material.SetFloat("_Angle", Mathf.Rad2Deg * angle); + + cb.Blit(tempID, BuiltinRenderTextureType.CameraTarget, blur.material); cb.ReleaseTemporaryRT(tempID); } diff --git a/Assets/Scripts/Unit/TimelineEventProxy.cs b/Assets/Scripts/Unit/TimelineEventProxy.cs index 866c6d3b..437b5b2d 100644 --- a/Assets/Scripts/Unit/TimelineEventProxy.cs +++ b/Assets/Scripts/Unit/TimelineEventProxy.cs @@ -55,8 +55,9 @@ public partial class TimelineEventProxy EventMesh_LensEffect_Bloom, // bloom EventMesh_LensEffect_MotionBlur, // motionBlur + EventMesh_LensEffect_Dash, // dash - EventMesh_PostEffect_Curly, // + EventMesh_PostEffect_Curly, // EventMesh_AfterImage, // 角色残像 EventMesh_AfterImageStop, // 角色残像停止事件 diff --git a/Assets/Scripts/Unit/TimelineEventProxy_Handlers.cs b/Assets/Scripts/Unit/TimelineEventProxy_Handlers.cs index 0bb8df5c..a52e6ea0 100644 --- a/Assets/Scripts/Unit/TimelineEventProxy_Handlers.cs +++ b/Assets/Scripts/Unit/TimelineEventProxy_Handlers.cs @@ -184,6 +184,21 @@ public partial class TimelineEventProxy ((PCController)owner).unitImageEffect.ShowGlitch(motionBlur.lifeTime); } - #endregion + #endregion + + #region Lens Effect + + void EventMesh_LensEffect_Dash(AnimationEventBase animEvent) + { + EventMesh_LensEffect_Dash dashinfo = animEvent as EventMesh_LensEffect_Dash; + if (dashinfo == null) + return; + + UnitSnapshotInfo info = owner.TakeSnapshot(); + LensEffect_Dash dash = new LensEffect_Dash(Color.white, 2, 0, info); + owner.unitLensEffect.AddEffect(dash); + } + + #endregion } \ No newline at end of file diff --git a/Assets/Scripts/Unit/UnitSnapshot.cs b/Assets/Scripts/Unit/UnitSnapshot.cs index 0515bf6f..f43189cb 100644 --- a/Assets/Scripts/Unit/UnitSnapshot.cs +++ b/Assets/Scripts/Unit/UnitSnapshot.cs @@ -18,19 +18,38 @@ public struct UnitSnapshotInfo // 角色快照,用于lens effect public class UnitSnapshot : MonoBehaviour { + [HideInInspector] public UnitController owner; public Animator animator; + public Renderer[] renderers; + + public bool active + { + get + { + return this.gameObject.activeSelf; + } + set + { + this.gameObject.SetActive(value); + } + } public void Initialize(UnitController prototype) { + owner = prototype; animator.runtimeAnimatorController = prototype.unitAnimation.animator.runtimeAnimatorController; + animator.speed = 0; } public void ApplySnapshot(UnitSnapshotInfo info) { - animator.Play(info.animStateHash, 0, info.normalizedTime); + active = true; animator.speed = 0.02f; + animator.Play(info.animStateHash, 0, info.normalizedTime); animator.Update(1 / 60f); + animator.speed = 0; + active = false; } -} \ No newline at end of file +} -- cgit v1.1-26-g67d0