summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Unit
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-09-29 19:55:57 +0800
committerchai <chaifix@163.com>2021-09-29 19:55:57 +0800
commit61d6e9bf192ffa54abc57bab69b1bd88c3b8d62b (patch)
tree47071b43d583ced63b1b6cc4a9e4c2c6100ffe3f /Assets/Scripts/Unit
parent16e4a47beaf7786b63404d4a8356e45d70a393b5 (diff)
*misc
Diffstat (limited to 'Assets/Scripts/Unit')
-rw-r--r--Assets/Scripts/Unit/Components/UnitLensEffect.cs24
-rw-r--r--Assets/Scripts/Unit/Components/UnitState/PCState.cs7
-rw-r--r--Assets/Scripts/Unit/Controller/UnitController.cs21
-rw-r--r--Assets/Scripts/Unit/Events/EventMesh_LensEffect_Dash.cs12
-rw-r--r--Assets/Scripts/Unit/Events/EventMesh_LensEffect_Dash.cs.meta11
-rw-r--r--Assets/Scripts/Unit/LensEffect/LensEffect_Dash.cs38
-rw-r--r--Assets/Scripts/Unit/TimelineEventProxy.cs3
-rw-r--r--Assets/Scripts/Unit/TimelineEventProxy_Handlers.cs17
-rw-r--r--Assets/Scripts/Unit/UnitSnapshot.cs23
9 files changed, 135 insertions, 21 deletions
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<UnitComponent> 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>();
unitRender.Initialize();
+ unitLensEffect = GetOrAddUnitComponent<UnitLensEffect>();
+ unitLensEffect.Initialize();
+
unitDetail = gameObject.GetComponentInChildren<UnitDetail>();
}
@@ -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
+}