diff options
Diffstat (limited to 'Assets/Scripts/Unit')
-rw-r--r-- | Assets/Scripts/Unit/AI/Actions.meta | 8 | ||||
-rw-r--r-- | Assets/Scripts/Unit/AI/Conditionals.meta | 8 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Components/UnitEffect.cs | 47 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Components/UnitImageEffect.cs | 155 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Components/UnitImageEffect.cs.meta (renamed from Assets/Scripts/Unit/Components/UnitEffect.cs.meta) | 2 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Components/UnitState/PCState.cs | 11 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Controller/PCController.cs | 8 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Events/EventMesh_ImageEffect_MotionBlur.cs | 2 | ||||
-rw-r--r-- | Assets/Scripts/Unit/TimelineEventProxy_Handlers.cs | 18 |
9 files changed, 182 insertions, 77 deletions
diff --git a/Assets/Scripts/Unit/AI/Actions.meta b/Assets/Scripts/Unit/AI/Actions.meta deleted file mode 100644 index 9b4ad463..00000000 --- a/Assets/Scripts/Unit/AI/Actions.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 971e9d55b8bc0894eb6a110fb962000b -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Unit/AI/Conditionals.meta b/Assets/Scripts/Unit/AI/Conditionals.meta deleted file mode 100644 index 70a86da5..00000000 --- a/Assets/Scripts/Unit/AI/Conditionals.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 85b7e0c7ed1d12f42a5178bfbf3d934c -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Unit/Components/UnitEffect.cs b/Assets/Scripts/Unit/Components/UnitEffect.cs deleted file mode 100644 index 9add6513..00000000 --- a/Assets/Scripts/Unit/Components/UnitEffect.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-
-public class EffectHandle
-{
- public float lifeTime;
- public float curTime;
- public bool markDead;
-}
-
-//Unit后处理效果
-public class UnitEffect : UnitComponent
-{
- public List<EffectHandle> effects = new List<EffectHandle>();
- public static GameObject effectPlane;
-
- public void ShowMotionBlur(float lifetime)
- {
- EffectHandle eff = new EffectHandle();
- eff.lifeTime = lifetime;
- eff.curTime = 0;
- eff.markDead = false;
- effects.Add(eff);
- effectPlane.gameObject.SetActive(true);
- }
-
- public override void OnUpdate()
- {
- base.OnUpdate();
-
- effectPlane.transform.position = UnitManager.Instance.pc.center;
-
- for(int i = 0; i < effects.Count; ++i)
- {
- if (effects[i].markDead)
- continue;
- effects[i].curTime += Time.deltaTime;
- if(effects[i].curTime > effects[i].lifeTime)
- {
- effects[i].markDead = true;
- effectPlane.gameObject.SetActive(false);
- }
- }
- }
-
-}
diff --git a/Assets/Scripts/Unit/Components/UnitImageEffect.cs b/Assets/Scripts/Unit/Components/UnitImageEffect.cs new file mode 100644 index 00000000..999740f3 --- /dev/null +++ b/Assets/Scripts/Unit/Components/UnitImageEffect.cs @@ -0,0 +1,155 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class UnitImageEffectHolder +{ + public float size; + public GameObject gameObject; + public MeshRenderer renderer + { + get + { + if (gameObject == null) + return null; + return gameObject.GetComponent<MeshRenderer>(); + } + } +} + +public delegate void UnitImageEffectStepCallback(float normalizedTime); + +public class UnitImageEffectHandle +{ + public float lifeTime; + public float curTime; + public UnitImageEffectHolder holder; + public UnitImageEffectStepCallback stepFunc; +} + +//Unit后处理效果 +public class UnitImageEffect : UnitComponent +{ + public List<UnitImageEffectHandle> effects = new List<UnitImageEffectHandle>(); + public static GameObject effectPlane; + + private Dictionary<float/*size*/, List<UnitImageEffectHolder>/*pool*/> m_HolderPool = new Dictionary<float, List<UnitImageEffectHolder>>(); + + public override void OnUpdate() + { + base.OnUpdate(); + List<UnitImageEffectHandle> temp = ListPool<UnitImageEffectHandle>.Get(); + for(int i = 0; i < effects.Count; ++i) + { + var handle = effects[i]; + handle.curTime += Time.deltaTime; + if(handle.curTime > handle.lifeTime) + { + temp.Add(handle); + continue; + } + handle.stepFunc?.Invoke(handle.curTime / handle.lifeTime); + } + for(int j = 0; j < temp.Count; j++) + { + temp[j].holder.gameObject.SetActive(false); + ReleaseHolder(ref temp[j].holder); + effects.Remove(temp[j]); + } + ListPool<UnitImageEffectHandle>.Release(temp); + } + + UnitImageEffectHolder ClaimHolder(float size) + { + List<UnitImageEffectHolder> holders; + if (m_HolderPool.TryGetValue(size, out holders)) + { + if (holders.Count > 0) + { + var holder = holders[holders.Count - 1]; + holders.RemoveAt(holders.Count - 1); + return holder; + } + } + UnitImageEffectHolder newHolder = new UnitImageEffectHolder(); + newHolder.size = size; + Mesh mesh = new Mesh(); + mesh.vertices = new Vector3[4] { + new Vector3(-size/2, size/2, 0), + new Vector3(size/2, size/2, 0), + new Vector3(size/2, -size/2, 0), + new Vector3(-size/2, -size/2, 0) + }; + mesh.uv = new Vector2[4] { + new Vector2(0, 1), + new Vector2(1, 1), + new Vector2(1, 0), + new Vector2(0, 0), + }; + mesh.triangles = new int[6] { + 0, 1, 3, + 1, 2, 3, + }; + mesh.UploadMeshData(true); + newHolder.gameObject = new GameObject("Image Effect Holder(" + size + "m)"); + MeshFilter filter = newHolder.gameObject.AddComponent<MeshFilter>(); + filter.sharedMesh = mesh; + MeshRenderer renderer = newHolder.gameObject.AddComponent<MeshRenderer>(); + renderer.lightProbeUsage = UnityEngine.Rendering.LightProbeUsage.Off; + renderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; + renderer.receiveShadows = false; + renderer.reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.Off; + renderer.motionVectorGenerationMode = MotionVectorGenerationMode.ForceNoMotion; + renderer.allowOcclusionWhenDynamic = false; + return newHolder; + } + + void ReleaseHolder(ref UnitImageEffectHolder holder) + { + float size = holder.size; + List<UnitImageEffectHolder> holders; + if (!m_HolderPool.TryGetValue(size, out holders)) + { + holders = new List<UnitImageEffectHolder>(); + m_HolderPool.Add(size, holders); + } + holder.gameObject.SetActive(false); + holder.gameObject.transform.position = Vector3.zero; + holders.Add(holder); + holder = null; + } + + #region effects + + public void ShowMotionBlur(float lifeTime, float angle, float distance) + { + UnitImageEffectHandle handle = new UnitImageEffectHandle(); + handle.lifeTime = lifeTime; + handle.curTime = 0; + float size = UnitManager.Instance.pc.unitDetail.snapshotBound; + handle.holder = ClaimHolder(size); + handle.holder.gameObject.SetActive(true); + string matPath = ResourceManager.Instance.imageEffectMaterails[ResourceManager.EImageEffectMaterails.MotionBlur]; + handle.holder.renderer.sharedMaterial = ResourceManager.Instance.LoadAsset<Material>(matPath); + + MaterialPropertyBlock block = new MaterialPropertyBlock(); + handle.holder.renderer.GetPropertyBlock(block); + block.SetFloat("_Angle", angle); + block.SetFloat("_Distance", distance); + handle.holder.renderer.SetPropertyBlock(block); + + handle.stepFunc = (float normalTime) => + { + handle.holder.gameObject.transform.position = UnitManager.Instance.pc.center; + + handle.holder.renderer.GetPropertyBlock(block); + block.SetFloat("_Distance", (normalTime) * distance); + handle.holder.renderer.SetPropertyBlock(block); + }; + + effects.Add(handle); + } + + #endregion + +}
\ No newline at end of file diff --git a/Assets/Scripts/Unit/Components/UnitEffect.cs.meta b/Assets/Scripts/Unit/Components/UnitImageEffect.cs.meta index f71585b2..32f7eebc 100644 --- a/Assets/Scripts/Unit/Components/UnitEffect.cs.meta +++ b/Assets/Scripts/Unit/Components/UnitImageEffect.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 62163ab86151f004294a831544bb3c39 +guid: af35b46f81aa698408be0540784f808d MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Scripts/Unit/Components/UnitState/PCState.cs b/Assets/Scripts/Unit/Components/UnitState/PCState.cs index c7cab21c..eae1b370 100644 --- a/Assets/Scripts/Unit/Components/UnitState/PCState.cs +++ b/Assets/Scripts/Unit/Components/UnitState/PCState.cs @@ -78,9 +78,14 @@ public partial class PCState : UnitState LogHelper.LogError("缺少 " + methodFunc); }
m_PrevState = m_State; - m_State = nextState; - - StartCoroutine(m_State.ToString(), param); + m_State = nextState;
+
+ if(m_PrevState != m_State && owner.unitRender != null)
+ {
+ owner.unitRender.SetVisibilityInMainCamera(true);
+ }
+
+ StartCoroutine(m_State.ToString(), param); } bool IsChange(EUnitState newState, bool bForce) diff --git a/Assets/Scripts/Unit/Controller/PCController.cs b/Assets/Scripts/Unit/Controller/PCController.cs index f3defbd7..ea07fc56 100644 --- a/Assets/Scripts/Unit/Controller/PCController.cs +++ b/Assets/Scripts/Unit/Controller/PCController.cs @@ -10,7 +10,7 @@ public class PCController : UnitController public UnitAfterImage unitAfterImage;
- public UnitEffect unitEffect;
+ public UnitImageEffect unitImageEffect;
public override UnitType type { get { return UnitType.PC; } }
@@ -32,8 +32,8 @@ public class PCController : UnitController unitAfterImage = gameObject.GetOrAddComponent<UnitAfterImage>();
unitAfterImage.Initialize();
- unitEffect = gameObject.GetOrAddComponent<UnitEffect>();
- unitEffect.Initialize();
+ unitImageEffect = gameObject.GetOrAddComponent<UnitImageEffect>();
+ unitImageEffect.Initialize();
}
@@ -41,7 +41,7 @@ public class PCController : UnitController {
base.Update();
unitAfterImage.OnUpdate();
- unitEffect.OnUpdate();
+ unitImageEffect.OnUpdate();
}
public override void OnHit(CollisionInfo info)
diff --git a/Assets/Scripts/Unit/Events/EventMesh_ImageEffect_MotionBlur.cs b/Assets/Scripts/Unit/Events/EventMesh_ImageEffect_MotionBlur.cs index 714d65e5..dd1b4759 100644 --- a/Assets/Scripts/Unit/Events/EventMesh_ImageEffect_MotionBlur.cs +++ b/Assets/Scripts/Unit/Events/EventMesh_ImageEffect_MotionBlur.cs @@ -12,6 +12,6 @@ public class EventMesh_ImageEffect_MotionBlur : AnimationEventBase public float angle;
- public float amount;
+ public float distance;
}
diff --git a/Assets/Scripts/Unit/TimelineEventProxy_Handlers.cs b/Assets/Scripts/Unit/TimelineEventProxy_Handlers.cs index a15d262e..a55ba99b 100644 --- a/Assets/Scripts/Unit/TimelineEventProxy_Handlers.cs +++ b/Assets/Scripts/Unit/TimelineEventProxy_Handlers.cs @@ -168,13 +168,21 @@ public partial class TimelineEventProxy if (owner == null || owner.unitRender == null)
return;
owner.unitRender.SetVisibilityInMainCamera(visible.isVisible);
- } - - void EventMesh_ImageEffect_MotionBlur(AnimationEventBase animEvent)
+ }
+
+ #region Unit Image Effects + void EventMesh_ImageEffect_MotionBlur(AnimationEventBase animEvent)
{
EventMesh_ImageEffect_MotionBlur motionBlur = animEvent as EventMesh_ImageEffect_MotionBlur;
if (motionBlur == null)
return ;
- ((PCController)owner).unitEffect.ShowMotionBlur(motionBlur.lifeTime);
- } + if (owner == null || !(owner is PCController))
+ return;
+ float angle = motionBlur.angle;
+ angle = owner.isTowardRight ? angle : 180 - angle;
+ ((PCController)owner).unitImageEffect.ShowMotionBlur(motionBlur.lifeTime, angle, motionBlur.distance);
+ }
+
+ #endregion +
}
\ No newline at end of file |