summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Unit/Components
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/Scripts/Unit/Components')
-rw-r--r--Assets/Scripts/Unit/Components/UnitEffect.cs47
-rw-r--r--Assets/Scripts/Unit/Components/UnitImageEffect.cs155
-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.cs11
4 files changed, 164 insertions, 51 deletions
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)