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/UnitComponent.cs | 4 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Components/UnitImageEffect.cs | 36 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Components/UnitRender.cs | 35 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Components/UnitState/PCState.cs | 2 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Controller/MonsterController.cs | 8 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Controller/PCController.cs | 13 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Controller/UnitController.cs | 48 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Effect/UnitCamera.cs | 33 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Events/EventMesh_ImageEffect_MotionBlur.cs | 3 | ||||
-rw-r--r-- | Assets/Scripts/Unit/UnitDetail.cs | 82 |
12 files changed, 212 insertions, 68 deletions
diff --git a/Assets/Scripts/Unit/AI/Actions.meta b/Assets/Scripts/Unit/AI/Actions.meta new file mode 100644 index 00000000..9b4ad463 --- /dev/null +++ b/Assets/Scripts/Unit/AI/Actions.meta @@ -0,0 +1,8 @@ +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 new file mode 100644 index 00000000..70a86da5 --- /dev/null +++ b/Assets/Scripts/Unit/AI/Conditionals.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 85b7e0c7ed1d12f42a5178bfbf3d934c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Unit/Components/UnitComponent.cs b/Assets/Scripts/Unit/Components/UnitComponent.cs index a5034581..825b6d92 100644 --- a/Assets/Scripts/Unit/Components/UnitComponent.cs +++ b/Assets/Scripts/Unit/Components/UnitComponent.cs @@ -29,6 +29,10 @@ public class UnitComponent : MonoBehaviour m_Owner = GetComponent<UnitController>(); } + public virtual void OnPostInitialize() + { + } + public virtual void Release() { m_Owner = null; diff --git a/Assets/Scripts/Unit/Components/UnitImageEffect.cs b/Assets/Scripts/Unit/Components/UnitImageEffect.cs index a2689ca1..8af48a3e 100644 --- a/Assets/Scripts/Unit/Components/UnitImageEffect.cs +++ b/Assets/Scripts/Unit/Components/UnitImageEffect.cs @@ -17,14 +17,17 @@ public class UnitImageEffectHolder } } -public delegate void UnitImageEffectStepCallback(float normalizedTime); - public class UnitImageEffectHandle { - public float lifeTime; + public delegate void UnitImageEffectStepCallback(float normalizedTime);
+ public delegate void UnitImageEffectEndCallback();
+
+ public float lifeTime; public float curTime; public UnitImageEffectHolder holder; + public UnitImageEffectStepCallback stepFunc; + public UnitImageEffectEndCallback onStop; } //Unit后处理效果 @@ -49,6 +52,7 @@ public class UnitImageEffect : UnitComponent if(handle.curTime > handle.lifeTime) { temp.Add(handle); + handle.onStop?.Invoke(); continue; } handle.stepFunc?.Invoke(handle.curTime / handle.lifeTime); @@ -123,7 +127,6 @@ public class UnitImageEffect : UnitComponent holder = null; } - #region effects public void ShowMotionBlur(float lifeTime, float angle, float distance) { @@ -155,9 +158,11 @@ public class UnitImageEffect : UnitComponent effects.Add(handle); } - public void ShowGlitch(float lifeTime) + public void ShowGlitch(float lifeTime, bool hideUnitInMainCamera = true) { - UnitImageEffectHandle handle = m_HandlePool.Get(); + PCController pc = UnitManager.Instance.pc as PCController;
+
+ UnitImageEffectHandle handle = m_HandlePool.Get(); handle.lifeTime = lifeTime; handle.curTime = 0; @@ -171,18 +176,25 @@ public class UnitImageEffect : UnitComponent handle.holder.renderer.GetPropertyBlock(block); handle.holder.renderer.SetPropertyBlock(block); - handle.stepFunc = (float normalTime) => - { + handle.stepFunc = (float normalTime) => { + UnitCamera.Instance.Render(); + handle.holder.gameObject.transform.position = UnitManager.Instance.pc.center; handle.holder.renderer.GetPropertyBlock(block); handle.holder.renderer.SetPropertyBlock(block); }; - effects.Add(handle); - } + if (hideUnitInMainCamera)
+ {
+ pc.unitRender.SetVisibilityInAllCameras(false);
+ } - - #endregion + handle.onStop = () => {
+ pc.unitRender.SetVisibilityInAllCameras(true);
+ };
+
+ effects.Add(handle); + } }
\ No newline at end of file diff --git a/Assets/Scripts/Unit/Components/UnitRender.cs b/Assets/Scripts/Unit/Components/UnitRender.cs index 435c517d..d1ea0ffb 100644 --- a/Assets/Scripts/Unit/Components/UnitRender.cs +++ b/Assets/Scripts/Unit/Components/UnitRender.cs @@ -6,17 +6,33 @@ using UnityEngine; [DisallowMultipleComponent] public class UnitRender : UnitComponent { + private IBodyRendererAgent m_Body; + + public Renderer mainRenderer
+ {
+ get
+ {
+ if (this.owner.unitDetail == null)
+ return null;
+ return m_Body.mainRenderer.renderer;
+ }
+ } public override void Initialize()
{
base.Initialize();
} + public override void OnPostInitialize()
+ {
+ base.OnPostInitialize();
+ m_Body = owner.unitDetail as IBodyRendererAgent;
+ } + public void SetVisibilityInMainCamera(bool isVisible)
{
LayerMask mask = LayerMask.GetMask("PlayerCharacter");
-
- if(!isVisible)
+ if (!isVisible)
{
SceneManager.Instance.mainCamera.cullingMask &= ~mask.value;
}
@@ -26,4 +42,19 @@ public class UnitRender : UnitComponent }
} + public void SetVisibilityInAllCameras(bool isVisible)
+ {
+ if (mainRenderer == null)
+ return;
+
+ if (isVisible)
+ {
+ mainRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On;
+ }
+ else
+ {
+ mainRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.ShadowsOnly;
+ }
+ } + } diff --git a/Assets/Scripts/Unit/Components/UnitState/PCState.cs b/Assets/Scripts/Unit/Components/UnitState/PCState.cs index eae1b370..060d6e91 100644 --- a/Assets/Scripts/Unit/Components/UnitState/PCState.cs +++ b/Assets/Scripts/Unit/Components/UnitState/PCState.cs @@ -82,7 +82,7 @@ public partial class PCState : UnitState if(m_PrevState != m_State && owner.unitRender != null)
{
- owner.unitRender.SetVisibilityInMainCamera(true);
+ // owner.unitRender.SetVisibilityInMainCamera(true);
}
StartCoroutine(m_State.ToString(), param); diff --git a/Assets/Scripts/Unit/Controller/MonsterController.cs b/Assets/Scripts/Unit/Controller/MonsterController.cs index 03756211..22645b47 100644 --- a/Assets/Scripts/Unit/Controller/MonsterController.cs +++ b/Assets/Scripts/Unit/Controller/MonsterController.cs @@ -6,14 +6,14 @@ public class MonsterController : UnitController {
public override UnitType type { get { return UnitType.Monster; } }
- public override void Initialize(GameObject obj, string folder)
+ protected override void Initialize()
{
- base.Initialize(obj, folder);
+ base.Initialize();
- unitState = gameObject.GetOrAddComponent<MonsterState>();
+ unitState = GetOrAddUnitComponent<MonsterState>();
unitState.Initialize();
- unitAnimation = gameObject.GetOrAddComponent<MonsterAnimation>();
+ unitAnimation = GetOrAddUnitComponent<MonsterAnimation>();
unitAnimation.Initialize();
}
diff --git a/Assets/Scripts/Unit/Controller/PCController.cs b/Assets/Scripts/Unit/Controller/PCController.cs index ea07fc56..4c665e7a 100644 --- a/Assets/Scripts/Unit/Controller/PCController.cs +++ b/Assets/Scripts/Unit/Controller/PCController.cs @@ -19,22 +19,21 @@ public class PCController : UnitController instance = this;
}
- public override void Initialize(GameObject obj, string folder)
+ protected override void Initialize()
{
- base.Initialize(obj, folder);
+ base.Initialize();
- unitState = gameObject.GetOrAddComponent<PCState>();
+ unitState = GetOrAddUnitComponent<PCState>();
unitState.Initialize();
- unitAnimation = gameObject.GetOrAddComponent<PCAnimation>();
+ unitAnimation = GetOrAddUnitComponent<PCAnimation>();
unitAnimation.Initialize();
- unitAfterImage = gameObject.GetOrAddComponent<UnitAfterImage>();
+ unitAfterImage = GetOrAddUnitComponent<UnitAfterImage>();
unitAfterImage.Initialize();
- unitImageEffect = gameObject.GetOrAddComponent<UnitImageEffect>();
+ unitImageEffect = GetOrAddUnitComponent<UnitImageEffect>();
unitImageEffect.Initialize();
-
}
public override void Update()
diff --git a/Assets/Scripts/Unit/Controller/UnitController.cs b/Assets/Scripts/Unit/Controller/UnitController.cs index ff3d9df2..6ccf124b 100644 --- a/Assets/Scripts/Unit/Controller/UnitController.cs +++ b/Assets/Scripts/Unit/Controller/UnitController.cs @@ -44,6 +44,8 @@ public class UnitController : MonoBehaviour/*, Interactable*/ public GameObject unitObj; // 角色模型
+ protected List<UnitComponent> unitComponents;
+
#region 事件监听
public delegate void OnTimelineEventHandle(AnimationEventBase animEvent);
public OnTimelineEventHandle onTimelineEvent { get; set; }
@@ -107,29 +109,53 @@ public class UnitController : MonoBehaviour/*, Interactable*/ public virtual void Initialize( GameObject obj , string folder)
{
unitObj = obj;
-
m_Folder = folder;
+ unitComponents = new List<UnitComponent>();
- unitRender = gameObject.GetOrAddComponent<UnitRender>();
- unitRender.Initialize();
+ Initialize();
+
+ OnPostInitailize();
+ }
- unitSkill = gameObject.GetOrAddComponent<UnitSkill>();
- unitSkill.Initialize();
+ protected virtual void Initialize()
+ {
+ unitSkill = GetOrAddUnitComponent<UnitSkill>();
+ unitSkill.Initialize();
- unitRootMotion = gameObject.GetOrAddComponent<UnitRootMotion>();
- unitRootMotion.Initialize();
+ unitRootMotion = GetOrAddUnitComponent<UnitRootMotion>();
+ unitRootMotion.Initialize();
- unitCollider = gameObject.GetOrAddComponent<UnitCollider>();
+ unitCollider = GetOrAddUnitComponent<UnitCollider>();
unitCollider.Initialize();
- unitBody = gameObject.GetOrAddComponent<UnitBody>();
+ unitBody = GetOrAddUnitComponent<UnitBody>();
unitBody.Initialize();
+ unitRender = GetOrAddUnitComponent<UnitRender>();
+ unitRender.Initialize();
+
unitDetail = gameObject.GetComponentInChildren<UnitDetail>();
+ }
- }
+ private void OnPostInitailize()
+ {
+ if (unitComponents == null)
+ return;
+ for(int i = 0; i < unitComponents.Count; ++i)
+ {
+ unitComponents[i].OnPostInitialize();
+ }
+ }
+
+ protected T GetOrAddUnitComponent<T>() where T : UnitComponent
+ {
+ T comp = gameObject.GetOrAddComponent<T>();
+ Debug.Assert(unitComponents != null);
+ unitComponents.Add(comp);
+ return comp;
+ }
- public virtual void Update()
+ public virtual void Update()
{
unitRender.OnUpdate();
unitState.OnUpdate();
diff --git a/Assets/Scripts/Unit/Effect/UnitCamera.cs b/Assets/Scripts/Unit/Effect/UnitCamera.cs index 90d78730..abb13a00 100644 --- a/Assets/Scripts/Unit/Effect/UnitCamera.cs +++ b/Assets/Scripts/Unit/Effect/UnitCamera.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using UnityEngine; -// 专门用来渲染player character的相机,用来做特效 +// 专门用来渲染character的相机,用来做特效 [RequireComponent(typeof(Camera))] public class UnitCamera : SingletonMB<UnitCamera> { @@ -13,12 +13,22 @@ public class UnitCamera : SingletonMB<UnitCamera> private void OnEnable() { m_Camera = GetComponent<Camera>(); - } - - private void OnPreRender() + m_Camera.enabled = false; + }
+
+ // 手动渲染
+ public void Render()
+ {
+ m_Camera.Render();
+ }
+
+ // 这里要用OnPreCull,不能是OnPreRender,因为设置了可见性,OnPreRender是在可见性剔除之后
+ void OnPreCull() { if (pc == null) return; + if (pc.unitImageEffect == null || pc.unitImageEffect.effects.Count == 0) + return; if (m_Camera == null) return; @@ -29,6 +39,17 @@ public class UnitCamera : SingletonMB<UnitCamera> float fov = 2 * Mathf.Atan2(pc.unitDetail.snapshotBound / 2, dz) * Mathf.Rad2Deg; m_Camera.fieldOfView = fov; - } -} + // 开启unit的渲染 + pc.unitRender.SetVisibilityInAllCameras(true); + } + + void OnPostRender()
+ {
+ if (pc.unitImageEffect == null || pc.unitImageEffect.effects.Count == 0) + return; +
+ pc.unitRender.SetVisibilityInAllCameras(false); + } + +}
\ No newline at end of file diff --git a/Assets/Scripts/Unit/Events/EventMesh_ImageEffect_MotionBlur.cs b/Assets/Scripts/Unit/Events/EventMesh_ImageEffect_MotionBlur.cs index dd1b4759..cb1a657c 100644 --- a/Assets/Scripts/Unit/Events/EventMesh_ImageEffect_MotionBlur.cs +++ b/Assets/Scripts/Unit/Events/EventMesh_ImageEffect_MotionBlur.cs @@ -14,4 +14,7 @@ public class EventMesh_ImageEffect_MotionBlur : AnimationEventBase public float distance;
+ [Tooltip("隐藏角色")]
+ public bool hideUnitInMainCamera;
+
}
diff --git a/Assets/Scripts/Unit/UnitDetail.cs b/Assets/Scripts/Unit/UnitDetail.cs index 3d075451..3f7f23e9 100644 --- a/Assets/Scripts/Unit/UnitDetail.cs +++ b/Assets/Scripts/Unit/UnitDetail.cs @@ -1,4 +1,5 @@ using System; +using UnityEngine.Serialization; using System.Collections; using System.Collections.Generic; using UnityEngine; @@ -110,63 +111,86 @@ public enum EUnitReferencePoint [Serializable] public class UnitReferencePointDictionary : SerializableDictionary<EUnitReferencePoint, Transform> { } +public enum EBodyPart
+{
+ Body = 0, // main body
+} + +[Serializable] +public class BodyPartRenderer
+{
+ [SerializeField] public EBodyPart tag;
+ [SerializeField] public Renderer renderer;
+} + +public interface IBodyRendererAgent
+{
+ BodyPartRenderer mainRenderer { get; }
+ BodyPartRenderer[] renderers{ get; }
+} + +public interface IBodyJointAgent
+{
+ UnitBoneDictionary bones { get; }
+ UnitReferencePointDictionary referencePoints { get; }
+} + // 角色的prefab附加数据 // * afterimage的prefab // * 骨骼映射 // * 武器 [DisallowMultipleComponent] -public class UnitDetail : MonoBehaviour +public class UnitDetail : MonoBehaviour, IBodyRendererAgent, IBodyJointAgent { public bool showGizmos; [Tooltip("残影用的prefab")] - public string afterImageAvatarPath; - - public UnitBoneDictionary bones; - - public UnitReferencePointDictionary referencePoints;
+ public string afterImageAvatarPath;
+
+ UnitBoneDictionary IBodyJointAgent.bones { get { return m_Bones; } }
+ [FormerlySerializedAs("bones")] + public UnitBoneDictionary m_Bones;
+
+ UnitReferencePointDictionary IBodyJointAgent.referencePoints { get { return m_ReferencePoints; } }
+ [FormerlySerializedAs("referencePoints")] + public UnitReferencePointDictionary m_ReferencePoints;
- //public Vector2 snapshotBound;
public float snapshotBound;
- private SkinnedMeshRenderer m_meshRenderer;
- public SkinnedMeshRenderer meshRenderer
- {
- get
- {
- if (!m_meshRenderer)
- m_meshRenderer = this.gameObject.GetComponentInChildren<SkinnedMeshRenderer>();
- return m_meshRenderer;
- }
- }
+ BodyPartRenderer IBodyRendererAgent.mainRenderer { get { return m_MainRenderer; } }
+ [SerializeField] private BodyPartRenderer m_MainRenderer;
+ BodyPartRenderer[] IBodyRendererAgent.renderers { get { return m_Renderers; } }
+ [SerializeField] private BodyPartRenderer[] m_Renderers;
public Vector3 center
{
get
{
- return meshRenderer.bounds.center;
+ if (m_MainRenderer == null || m_MainRenderer.renderer == null)
+ return Vector3.zero ;
+ return m_MainRenderer.renderer.bounds.center;
}
}
public UnitDetail() - { - bones = new UnitBoneDictionary(); + {
+ m_Bones = new UnitBoneDictionary(); foreach(EUnitBone e in Enum.GetValues(typeof(EUnitBone))) - { - bones.Add(e, null); + {
+ m_Bones.Add(e, null); } } public Transform GetBone(EUnitBone bone) { - if (bones.ContainsKey(bone)) - return bones[bone]; + if (m_Bones.ContainsKey(bone)) + return m_Bones[bone]; return null; } public bool HasBone(EUnitBone bone) { - return bones.ContainsKey(bone); + return m_Bones.ContainsKey(bone); } private void OnDrawGizmos()
@@ -176,4 +200,12 @@ public class UnitDetail : MonoBehaviour Gizmos.DrawWireCube(center, new Vector3(snapshotBound, snapshotBound, 0));
} + IEnumerator GetRenderers()
+ {
+ for(int i = 0; i < m_Renderers.Length; ++i)
+ {
+ yield return m_Renderers[i].renderer;
+ }
+ } + }
\ No newline at end of file |