diff options
author | chai <chaifix@163.com> | 2021-09-29 19:55:57 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-09-29 19:55:57 +0800 |
commit | 61d6e9bf192ffa54abc57bab69b1bd88c3b8d62b (patch) | |
tree | 47071b43d583ced63b1b6cc4a9e4c2c6100ffe3f | |
parent | 16e4a47beaf7786b63404d4a8356e45d70a393b5 (diff) |
*misc
17 files changed, 271 insertions, 33 deletions
diff --git a/Assets/Bundle/Shaders/Common/Image/common_img_motionblur.shader b/Assets/Bundle/Shaders/Common/Image/common_img_motionblur.shader new file mode 100644 index 00000000..702bbd4b --- /dev/null +++ b/Assets/Bundle/Shaders/Common/Image/common_img_motionblur.shader @@ -0,0 +1,83 @@ +// 高斯模糊 + +Shader "Erika/Common/Image/MotionBlur" +{ + Properties + { + _MainTex("Texture", 2D) = "white" {} + _Angle("Angle", float) = 0 + _Distance("Distance", float) = 0 + _TileOffset("TileOffset", Vector) = (1,1,0,0) + _Iterate("Iterate Count", float) = 1 + } + + SubShader + { + Tags { "RenderType" = "Opaque" "Queue" = "Transparent-1"} + LOD 100 + + ZWrite Off + ZTest LEqual + + Blend SrcAlpha OneMinusSrcAlpha + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + #include "Assets/Bundle/Shaders/Include/ImageEffect.cginc" + + struct v2f + { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + }; + + sampler2D _MainTex; + float4 _MainTex_ST; + + float _Angle; + + float4 _TileOffset; // 角色的范围 + + fixed _Distance; + + float _Iterate; // 迭代次数 + + v2f vert(appdata_img v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); + return o; + } + + fixed4 frag(v2f i) : SV_Target + { + _Distance = 0.1; + + fixed2 uv0 = i.uv; + + //fixed4 color = blur(_MainTex, _ScreenParams.xy, uv); + fixed4 color = fixed4(0,0,0,0); + const float count = 20; + float step = _Distance / count; + for(int i = 0; i < count; ++i) + { + 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; + } + + return color; + } + ENDCG + } + } + +} // shader diff --git a/Assets/Bundle/Shaders/Common/Image/common_img_motionblur.shader.meta b/Assets/Bundle/Shaders/Common/Image/common_img_motionblur.shader.meta new file mode 100644 index 00000000..cc5320fa --- /dev/null +++ b/Assets/Bundle/Shaders/Common/Image/common_img_motionblur.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d68c264cf01a43b4c8503bd7bbe2fbda +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Bundle/Shaders/Common/common_solid_color.shader b/Assets/Bundle/Shaders/Common/common_solid_color.shader index 92daaa30..69b25500 100644 --- a/Assets/Bundle/Shaders/Common/common_solid_color.shader +++ b/Assets/Bundle/Shaders/Common/common_solid_color.shader @@ -71,7 +71,7 @@ if (diff < 0.0001) { c = _Color; - // c = tex2D(_MainTex, i.uv); + c = tex2D(_MainTex, i.uv); } return c; diff --git a/Assets/Bundle/Unit/PC/Erika/AnimationData/Air_Combo03_Z0_1.asset b/Assets/Bundle/Unit/PC/Erika/AnimationData/Air_Combo03_Z0_1.asset index 47959894..8d453722 100644 --- a/Assets/Bundle/Unit/PC/Erika/AnimationData/Air_Combo03_Z0_1.asset +++ b/Assets/Bundle/Unit/PC/Erika/AnimationData/Air_Combo03_Z0_1.asset @@ -143,6 +143,20 @@ MonoBehaviour: angle: 0 distance: 0 hideUnitInMainCamera: 1 +--- !u!114 &114300116509491778 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d52092c3bed6f524ead14801bb72e1c3, type: 3} + m_Name: EventMesh_LensEffect_Dash + m_EditorClassIdentifier: + startFrame: 16 + lifeTime: 2 --- !u!114 &114435450776992514 MonoBehaviour: m_ObjectHideFlags: 0 @@ -187,6 +201,20 @@ MonoBehaviour: position: {x: 0, y: 1.3, z: 0} rotation: {x: -24.814, y: 33.032, z: -30.331} scale: {x: 0.4, y: 0.4, z: 0.4} +--- !u!114 &114532000986298392 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d52092c3bed6f524ead14801bb72e1c3, type: 3} + m_Name: EventMesh_LensEffect_Dash + m_EditorClassIdentifier: + startFrame: 5 + lifeTime: 2 --- !u!114 &114581710045323768 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Assets/Bundle/Unit/PC/Erika/Prefabs/Erika_Robot_Snapshot.prefab b/Assets/Bundle/Unit/PC/Erika/Prefabs/Erika_Robot_Snapshot.prefab index b3787c3a..6af0e486 100644 --- a/Assets/Bundle/Unit/PC/Erika/Prefabs/Erika_Robot_Snapshot.prefab +++ b/Assets/Bundle/Unit/PC/Erika/Prefabs/Erika_Robot_Snapshot.prefab @@ -416,9 +416,9 @@ GameObject: m_Component: - component: {fileID: 6930345995811640846} - component: {fileID: 7023111129766813114} - - component: {fileID: 5696818452860696233} + - component: {fileID: 585978181} m_Layer: 0 - m_Name: Erika_Robot_AfterImage + m_Name: Erika_Robot_Snapshot m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -453,13 +453,13 @@ Animator: m_Controller: {fileID: 0} m_CullingMode: 0 m_UpdateMode: 0 - m_ApplyRootMotion: 1 + m_ApplyRootMotion: 0 m_LinearVelocityBlending: 0 m_WarningMessage: m_HasTransformHierarchy: 1 m_AllowConstantClipSamplingOptimization: 1 m_KeepAnimatorControllerStateOnDisable: 0 ---- !u!114 &5696818452860696233 +--- !u!114 &585978181 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -468,12 +468,13 @@ MonoBehaviour: m_GameObject: {fileID: 6928033330946439154} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 89864711140932040a5827c91d9e5adc, type: 3} + m_Script: {fileID: 11500000, guid: d63b30ef896f0a548865db54d2bdbbeb, type: 3} m_Name: m_EditorClassIdentifier: + owner: {fileID: 0} + animator: {fileID: 7023111129766813114} renderers: - {fileID: 7046772783541976850} - animator: {fileID: 7023111129766813114} --- !u!1 &6928056367075676882 GameObject: m_ObjectHideFlags: 0 @@ -830,7 +831,7 @@ SkinnedMeshRenderer: m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: - - {fileID: 2100000, guid: 8d0d71f453a88c34e8943bd60b65f0fd, type: 2} + - {fileID: 2100000, guid: d743391c976d45f41be9ace4cf3bc3ac, type: 2} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 diff --git a/Assets/Scripts/Data/EnumDefine.cs b/Assets/Scripts/Data/EnumDefine.cs index ad55986f..decba9c5 100644 --- a/Assets/Scripts/Data/EnumDefine.cs +++ b/Assets/Scripts/Data/EnumDefine.cs @@ -14,7 +14,7 @@ public enum EImageEffectMaterails public enum EShader { Blur, - + MotionBlur, SolidColor, diff --git a/Assets/Scripts/Data/StaticDefine.cs b/Assets/Scripts/Data/StaticDefine.cs index 236e0621..ca05d947 100644 --- a/Assets/Scripts/Data/StaticDefine.cs +++ b/Assets/Scripts/Data/StaticDefine.cs @@ -18,8 +18,9 @@ public static class StaticDefine public string path;
}
public static Dictionary<EShader, ShaderDefine> shaders = new Dictionary<EShader, ShaderDefine> {
- { EShader.Blur, new ShaderDefine("Erika/Common/Image/Blur", "")},
- { EShader.SolidColor, new ShaderDefine("Erika/Common/SolidColor", "") },
+ { EShader.Blur, new ShaderDefine("Erika/Common/Image/Blur", "")},
+ { EShader.MotionBlur, new ShaderDefine("Erika/Common/Image/MotionBlur", "")},
+ { EShader.SolidColor, new ShaderDefine("Erika/Common/SolidColor", "") },
};
public static string bundleManifest = "bundles"; // Assets/Resources/bundles.json
diff --git a/Assets/Scripts/Managers/UnitManager.cs b/Assets/Scripts/Managers/UnitManager.cs index 0561abd0..0d43f60f 100644 --- a/Assets/Scripts/Managers/UnitManager.cs +++ b/Assets/Scripts/Managers/UnitManager.cs @@ -36,7 +36,9 @@ public class UnitManager : Singleton<UnitManager> if(obj)
{
snap = Object.Instantiate<UnitSnapshot>(obj);
- snap.owner = unit;
+ snap.gameObject.hideFlags = HideFlags.HideInHierarchy | HideFlags.DontSave;
+ snap.Initialize(unit);
+ snap.active = false;
}
return snap;
}
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 +}
|