diff options
author | chai <215380520@qq.com> | 2022-11-12 19:39:20 +0800 |
---|---|---|
committer | chai <215380520@qq.com> | 2022-11-12 19:39:20 +0800 |
commit | 67519f62c40fda3eb6d022171595a5ab10955f35 (patch) | |
tree | 9543673b25304a9a0f7e73b723eb7981824d2db1 /Erika/Assets/Scripts/Unit | |
parent | c8452a1e2f5e2147e7168e2520ca1888e9b7f6f0 (diff) |
* 新碰撞检测
Diffstat (limited to 'Erika/Assets/Scripts/Unit')
20 files changed, 219 insertions, 101 deletions
diff --git a/Erika/Assets/Scripts/Unit/AI/Actions.meta b/Erika/Assets/Scripts/Unit/AI/Actions.meta deleted file mode 100644 index 9b4ad463..00000000 --- a/Erika/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/Erika/Assets/Scripts/Unit/AI/Conditionals.meta b/Erika/Assets/Scripts/Unit/AI/Conditionals.meta deleted file mode 100644 index 70a86da5..00000000 --- a/Erika/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/Erika/Assets/Scripts/Unit/AnimationData.cs b/Erika/Assets/Scripts/Unit/AnimationData.cs index 323f21d4..3f516d4b 100644 --- a/Erika/Assets/Scripts/Unit/AnimationData.cs +++ b/Erika/Assets/Scripts/Unit/AnimationData.cs @@ -324,11 +324,25 @@ public class AnimationData : ScriptableObject return toggles[toggle].to >= normalizedTime && normalizedTime >= toggles[toggle].from;
}
+ /// <summary>
+ /// 获得某个playback时刻的碰撞盒数据
+ /// </summary>
+ /// <param name="type"></param>
+ /// <param name="index"></param>
+ /// <param name="playbackTime"></param>
+ /// <returns></returns>
public ColliderInfo GetColliderInfo(ColliderBox.EColliderType type, int index, float playbackTime)
{
return GetColliderInfoByFrame(type, index, playbackTime * FPS);
}
+ /// <summary>
+ /// 获得某个帧的碰撞盒数据
+ /// </summary>
+ /// <param name="type"></param>
+ /// <param name="index"></param>
+ /// <param name="frame"></param>
+ /// <returns></returns>
public ColliderInfo GetColliderInfoByFrame(ColliderBox.EColliderType type, int index, float frame)
{
ColliderInfo info = new ColliderInfo();
diff --git a/Erika/Assets/Scripts/Unit/Collider/ColliderBox.cs b/Erika/Assets/Scripts/Unit/Collider/ColliderBox.cs index 24319ef2..b44f2bf3 100644 --- a/Erika/Assets/Scripts/Unit/Collider/ColliderBox.cs +++ b/Erika/Assets/Scripts/Unit/Collider/ColliderBox.cs @@ -16,11 +16,11 @@ public partial class ColliderBox // 分化为不同的collider类型
public enum EColliderType
{
- HitBox,
- HurtBox,
- ThrowBox,
- BlockBox,
- DefendBox,
+ HitBox, // Triggers //Physics.OverlapXXX()
+ HurtBox, // Triggers
+ ThrowBox, // Triggers
+ BlockBox, // Triggers
+ DefendBox, // Triggers
}
[DisallowModifiyInGUI]
diff --git a/Erika/Assets/Scripts/Unit/Collider/ColliderBox_Hitbox.cs b/Erika/Assets/Scripts/Unit/Collider/ColliderBox_Hitbox.cs index 9f1d629a..f2549984 100644 --- a/Erika/Assets/Scripts/Unit/Collider/ColliderBox_Hitbox.cs +++ b/Erika/Assets/Scripts/Unit/Collider/ColliderBox_Hitbox.cs @@ -2,8 +2,10 @@ // 打击感相关资料
// https://gameinstitute.qq.com/community/detail/112371
-//
+/// <summary>
+/// 攻击盒,用Physics.OverlayXXX检测和其他盒子的碰撞
+/// </summary>
public partial class ColliderBox {
diff --git a/Erika/Assets/Scripts/Unit/Collider/ColliderRegistry.cs b/Erika/Assets/Scripts/Unit/Collider/ColliderRegistry.cs index 408ce5a4..5fe6c912 100644 --- a/Erika/Assets/Scripts/Unit/Collider/ColliderRegistry.cs +++ b/Erika/Assets/Scripts/Unit/Collider/ColliderRegistry.cs @@ -1,7 +1,10 @@ -using System.Collections; +// 废弃,改为用Physics.OverlapXXX和Colliders + +using System.Collections; using System.Collections.Generic; using UnityEngine; +[System.Obsolete("废弃,改为用Physics.OverlapXXX和Colliders")] public class ColliderRegistry : Singleton<ColliderRegistry> { public List<UnitCollider> colliders = new List<UnitCollider>(); diff --git a/Erika/Assets/Scripts/Unit/Collider/CollisionHandler.cs b/Erika/Assets/Scripts/Unit/Collider/CollisionHandler.cs new file mode 100644 index 00000000..0dd68d40 --- /dev/null +++ b/Erika/Assets/Scripts/Unit/Collider/CollisionHandler.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class CollisionHandler : MonoBehaviour +{ + + public ColliderBox.EColliderType colliderType; + + public ColliderData colliderData; + + public UnitController owner; + + public void Initialize(ColliderBox.EColliderType type, UnitController owner) + { + this.colliderType = type; + this.owner = owner; + } + + public void OnTriggerEnter(Collider other) + { + CollisionHandler otherHandler = other.GetComponent<CollisionHandler>(); + if (otherHandler == null) + return; + + if(owner != null) + { + owner.OnCollision(otherHandler.owner); + } + + if(otherHandler.owner != null) + { + otherHandler.owner.OnCollision(owner); + } + + } + + public void OnTriggerStay(Collider other) + { + + } + + public void OnTriggerExit(Collider other) + { + + } + +} diff --git a/Erika/Assets/Scripts/Unit/Collider/CollisionHandler.cs.meta b/Erika/Assets/Scripts/Unit/Collider/CollisionHandler.cs.meta new file mode 100644 index 00000000..2fba0fdc --- /dev/null +++ b/Erika/Assets/Scripts/Unit/Collider/CollisionHandler.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b6e50b8c49a6ee144830503d34593230 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Erika/Assets/Scripts/Unit/Collider/CollisionSystem.cs b/Erika/Assets/Scripts/Unit/Collider/CollisionSystem.cs index 83052073..8149f6a3 100644 --- a/Erika/Assets/Scripts/Unit/Collider/CollisionSystem.cs +++ b/Erika/Assets/Scripts/Unit/Collider/CollisionSystem.cs @@ -1,4 +1,6 @@ -using System; +// 废弃,改为用Physics.OverlapXXX和Colliders + +using System; using System.Collections.Generic; using UnityEngine; @@ -23,6 +25,7 @@ public struct CollisionInfo public bool isCollision; } +[Obsolete("废弃,改为用Physics.OverlapXXX和Colliders")] public class CollisionSystem : SingletonMB<CollisionSystem> { public delegate void StageHandle(); @@ -97,8 +100,8 @@ public class CollisionSystem : SingletonMB<CollisionSystem> if (!hitbox.unitCollider.CanCollide(hitbox.colliderInfo.colliderHash, hurtbox.unitCollider.owner.GetHashCode())) continue; hitbox.unitCollider.RecordCollision(hitbox.colliderInfo.colliderHash, hurtbox.unitCollider.owner.GetHashCode()); - hitbox.unitCollider.owner.OnHit(collision); - hurtbox.unitCollider.owner.OnGetHit(collision); + //hitbox.unitCollider.owner.OnHit(collision); + //hurtbox.unitCollider.owner.OnGetHit(collision); } } @@ -150,8 +153,8 @@ public class CollisionSystem : SingletonMB<CollisionSystem> collision.isCollision = true;
collision.intersection = intersection;
collision.collidee = hurtCollider;
- hurtCollider.unitCollider.owner.OnGetShot(collision);
- projectile.OnShot(collision);
+ //hurtCollider.unitCollider.owner.OnGetShot(collision);
+ //projectile.OnShot(collision);
goto next;
}
@@ -184,6 +187,7 @@ public class CollisionSystem : SingletonMB<CollisionSystem> } + public static class ColliderUtility
{
public static CollisionInfo GetCollision(ColliderDescriptor collider, ColliderDescriptor collidee)
diff --git a/Erika/Assets/Scripts/Unit/Components/UnitCollider.cs b/Erika/Assets/Scripts/Unit/Components/UnitCollider.cs index 48ec46bb..6858fe74 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitCollider.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitCollider.cs @@ -8,18 +8,19 @@ public class UnitCollider : UnitComponent { public bool showGizmos; - private Dictionary<int/*hitbox hash*/, List<int/*unitController hash*/>> m_HitMask = new Dictionary<int, List<int>>(); + [System.Obsolete("废弃")] + private Dictionary<int/*hitbox hash*/, List<int/*unitController hash*/>> m_HitMask = new Dictionary<int, List<int>>(); public override void Awake() { base.Awake(); - ColliderRegistry.Instance.AddCollider(this); + //ColliderRegistry.Instance.AddCollider(this); } public override void OnDestroy() { - ColliderRegistry.Instance.RemoveCollider(this); + //ColliderRegistry.Instance.RemoveCollider(this); base.OnDestroy(); } @@ -30,7 +31,12 @@ public class UnitCollider : UnitComponent showGizmos = true; } - // 返回当前激活的对应类型的碰撞盒数据 + /// <summary> + /// 返回当前激活的对应类型的碰撞盒数据 + /// </summary> + /// <param name="type"></param> + /// <param name="layer"></param> + /// <returns></returns> public ColliderInfo[] GetCurrentBoxesInfoByType(ColliderBox.EColliderType type, int layer = 0) { AnimationData animData = m_Owner.unitAnimation.animationData; @@ -40,12 +46,16 @@ public class UnitCollider : UnitComponent return infos; } - // 动作切换,重置collider mask - public void OnAnimationChange() + /// <summary> + /// 动作切换,重置collider mask + /// </summary> + [System.Obsolete("废弃")] + public void OnAnimationChange() { m_HitMask.Clear(); } + [System.Obsolete("废弃")] public void RecordCollision(int colliderHash, int targetHash) { List<int> record; @@ -57,6 +67,7 @@ public class UnitCollider : UnitComponent record.Add(targetHash); } + [System.Obsolete("废弃")] public bool CanCollide(int colliderHash, int targetHash) { List<int> record; diff --git a/Erika/Assets/Scripts/Unit/Components/UnitPhysicsBoxCollection.cs b/Erika/Assets/Scripts/Unit/Components/UnitPhysicsBoxCollection.cs index ef4676a4..b3d0c580 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitPhysicsBoxCollection.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitPhysicsBoxCollection.cs @@ -2,6 +2,9 @@ using System.Collections.Generic;
using UnityEngine;
+/// <summary>
+/// 角色身体上所有trigger集合
+/// </summary>
public class UnitPhysicsBoxCollection : UnitComponent
{
// 列表里不一定按顺序存储
diff --git a/Erika/Assets/Scripts/Unit/Components/UnitState/CyberAngel.meta b/Erika/Assets/Scripts/Unit/Components/UnitState/CyberAngel.meta deleted file mode 100644 index 13682d7f..00000000 --- a/Erika/Assets/Scripts/Unit/Components/UnitState/CyberAngel.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: fa5eb9b1f1ac0184b9daa4cab5baaf64 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Erika/Assets/Scripts/Unit/Controller/MonsterController.cs b/Erika/Assets/Scripts/Unit/Controller/MonsterController.cs index 22645b47..f75933cc 100644 --- a/Erika/Assets/Scripts/Unit/Controller/MonsterController.cs +++ b/Erika/Assets/Scripts/Unit/Controller/MonsterController.cs @@ -22,42 +22,42 @@ public class MonsterController : UnitController base.Update();
}
- public override void OnHit(CollisionInfo info)
- {
- }
+ //public override void OnHit(CollisionInfo info)
+ //{
+ //}
- public override void OnGetHit(CollisionInfo info)
- {
- ColliderBox hitbox = info.collider.colliderInfo.collider;
- Debug.Assert(hitbox.type == ColliderBox.EColliderType.HitBox);
+ // public override void OnGetHit(CollisionInfo info)
+ // {
+ // ColliderBox hitbox = info.collider.colliderInfo.collider;
+ // Debug.Assert(hitbox.type == ColliderBox.EColliderType.HitBox);
- if(hitbox.hitResponse == ColliderBox.EHitResponse.Light)
- {
- monsterState.ChangeState(MonsterState.EUnitState.HitLight, new MonsterState.HitLightParam(), true);
- }
- else if (hitbox.hitResponse == ColliderBox.EHitResponse.HitAir)
- {
- monsterState.ChangeState(MonsterState.EUnitState.HitAir, new MonsterState.HitAirParam());
- }
- else if (hitbox.hitResponse == ColliderBox.EHitResponse.HitInAir)
- {
- monsterState.ChangeState(MonsterState.EUnitState.HitInAir, new MonsterState.HitInAirParam(), true);
- }
+ // if(hitbox.hitResponse == ColliderBox.EHitResponse.Light)
+ // {
+ // monsterState.ChangeState(MonsterState.EUnitState.HitLight, new MonsterState.HitLightParam(), true);
+ // }
+ // else if (hitbox.hitResponse == ColliderBox.EHitResponse.HitAir)
+ // {
+ // monsterState.ChangeState(MonsterState.EUnitState.HitAir, new MonsterState.HitAirParam());
+ // }
+ // else if (hitbox.hitResponse == ColliderBox.EHitResponse.HitInAir)
+ // {
+ // monsterState.ChangeState(MonsterState.EUnitState.HitInAir, new MonsterState.HitInAirParam(), true);
+ // }
- string path = hitbox.sparkPath;
- GameObject vfx = ResourceManager.Instance.LoadAsset<GameObject>(path);
- if(vfx != null)
- {
- GameObject go = GameObject.Instantiate(vfx);
- go.transform.position = center + hitbox.sparkOffset;
- go.transform.localScale = hitbox.sparkScale;
- }
- }
+ // string path = hitbox.sparkPath;
+ //GameObject vfx = ResourceManager.Instance.LoadAsset<GameObject>(path);
+ // if(vfx != null)
+ // {
+ // GameObject go = GameObject.Instantiate(vfx);
+ // go.transform.position = center + hitbox.sparkOffset;
+ // go.transform.localScale = hitbox.sparkScale;
+ // }
+ // }
- public override void OnGetShot(CollisionInfo info)
- {
- monsterState.ChangeState(MonsterState.EUnitState.HitLight, new MonsterState.HitLightParam(), true);
- }
+ // public override void OnGetShot(CollisionInfo info)
+ // {
+ // monsterState.ChangeState(MonsterState.EUnitState.HitLight, new MonsterState.HitLightParam(), true);
+ // }
public virtual bool IsFacePC()
{
diff --git a/Erika/Assets/Scripts/Unit/Controller/PCController.cs b/Erika/Assets/Scripts/Unit/Controller/PCController.cs index 35645d57..e634a4bb 100644 --- a/Erika/Assets/Scripts/Unit/Controller/PCController.cs +++ b/Erika/Assets/Scripts/Unit/Controller/PCController.cs @@ -44,15 +44,15 @@ public class PCController : UnitController unitImageEffect.OnUpdate();
}
- public override void OnHit(CollisionInfo info)
- {
- ColliderBox hitbox = info.collider.colliderInfo.collider;
- Debug.Assert(hitbox.type == ColliderBox.EColliderType.HitBox);
- }
+ //public override void OnHit(CollisionInfo info)
+ //{
+ // ColliderBox hitbox = info.collider.colliderInfo.collider;
+ // Debug.Assert(hitbox.type == ColliderBox.EColliderType.HitBox);
+ //}
- public override void OnGetHit(CollisionInfo info)
- {
- }
+ //public override void OnGetHit(CollisionInfo info)
+ //{
+ //}
public override void OnGrab()
{
diff --git a/Erika/Assets/Scripts/Unit/Controller/UnitController.cs b/Erika/Assets/Scripts/Unit/Controller/UnitController.cs index e77b8435..f5577077 100644 --- a/Erika/Assets/Scripts/Unit/Controller/UnitController.cs +++ b/Erika/Assets/Scripts/Unit/Controller/UnitController.cs @@ -52,6 +52,8 @@ public class UnitController : MonoBehaviour/*, Interactable*/ protected List<UnitComponent> unitComponents;
+ public CharacterController unitCharacterController;
+
#region 事件监听
public delegate void OnTimelineEventHandle(AnimationEventBase animEvent);
public OnTimelineEventHandle onTimelineEvent { get; set; }
@@ -193,7 +195,14 @@ public class UnitController : MonoBehaviour/*, Interactable*/ unitPreprocessing = GetOrAddUnitComponent<UnitPreprocessing>();
unitPreprocessing.Initialize();
- }
+
+ unitCharacterController = gameObject.GetOrAddComponent<CharacterController>();
+ unitCharacterController.center = unitDetail.characterControllerSetting.center;
+ unitCharacterController.radius = unitDetail.characterControllerSetting.radius;
+ unitCharacterController.height = unitDetail.characterControllerSetting.height;
+ unitCharacterController.skinWidth = unitDetail.characterControllerSetting.skinWidth;
+
+ }
private void OnPostInitailize()
{
@@ -221,25 +230,13 @@ public class UnitController : MonoBehaviour/*, Interactable*/ unitSkill.OnUpdate();
unitRootMotion.OnUpdate();
unitLensEffect.OnUpdate();
+ unitPhysicsBoxes.OnUpdate();
}
public virtual void OnDestroy()
{
}
- public virtual void OnHit(CollisionInfo info)
- {
- }
-
- public virtual void OnGetHit(CollisionInfo info)
- {
- }
-
- public virtual void OnGetShot(CollisionInfo info)
- {
- }
-
-
public virtual void OnGrab()
{
}
@@ -270,4 +267,14 @@ public class UnitController : MonoBehaviour/*, Interactable*/ UnitSnapshotInfo snapshot = new UnitSnapshotInfo();
return snapshot;
}
+
+ #region 物理碰撞
+
+ public void OnCollision(UnitController other)
+ {
+
+ }
+
+ #endregion
+
}
\ No newline at end of file diff --git a/Erika/Assets/Scripts/Unit/Events/EventCollider_Enable.cs b/Erika/Assets/Scripts/Unit/Events/EventCollider_Enable.cs new file mode 100644 index 00000000..a9cec9d4 --- /dev/null +++ b/Erika/Assets/Scripts/Unit/Events/EventCollider_Enable.cs @@ -0,0 +1,14 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class EventCollider_Enable : AnimationEventBase +{ + public override TimelineEventProxy.EEventType type => TimelineEventProxy.EEventType.EventCollider_Enable; + + public override string shortName => "C"; + + [Tooltip("是否开启collider")] + public bool enabled = true; + +}
\ No newline at end of file diff --git a/Erika/Assets/Scripts/Unit/Events/EventCollider_Enable.cs.meta b/Erika/Assets/Scripts/Unit/Events/EventCollider_Enable.cs.meta new file mode 100644 index 00000000..cba0d755 --- /dev/null +++ b/Erika/Assets/Scripts/Unit/Events/EventCollider_Enable.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 61052caf1b575b344b9f319dbe3a31c6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Erika/Assets/Scripts/Unit/TimelineEventProxy.cs b/Erika/Assets/Scripts/Unit/TimelineEventProxy.cs index 453f1903..61981620 100644 --- a/Erika/Assets/Scripts/Unit/TimelineEventProxy.cs +++ b/Erika/Assets/Scripts/Unit/TimelineEventProxy.cs @@ -50,6 +50,8 @@ public partial class TimelineEventProxy {
EventGame_TimeScale, // 缩放时间
+ EventCollider_Enable, // 开启\隐藏Collider
+
EventMesh_ImageEffect_MotionBlur, // 运动模糊 EventMesh_ImageEffect_Glitch, // glitch
diff --git a/Erika/Assets/Scripts/Unit/UnitDetail.cs b/Erika/Assets/Scripts/Unit/UnitDetail.cs index 56858b0b..b6c11a1a 100644 --- a/Erika/Assets/Scripts/Unit/UnitDetail.cs +++ b/Erika/Assets/Scripts/Unit/UnitDetail.cs @@ -68,6 +68,15 @@ public interface IBodyJointAgent UnitReferencePointDictionary referencePoints { get; }
} +[Serializable] +public struct CharacterControllerSetting
+{
+ [SerializeField] public Vector3 center;
+ [SerializeField] public float radius;
+ [SerializeField] public float height;
+ [SerializeField] public float skinWidth;
+} + // 角色的prefab附加数据 // * afterimage的prefab // * 骨骼映射 @@ -77,6 +86,8 @@ public class UnitDetail : MonoBehaviour, IBodyRendererAgent, IBodyJointAgent { public bool showGizmos;
+ public CharacterControllerSetting characterControllerSetting;
+
[FormerlySerializedAs("root")] public Transform rootBone; diff --git a/Erika/Assets/Scripts/Unit/UnitRootMotion.cs b/Erika/Assets/Scripts/Unit/UnitRootMotion.cs index 140882d3..4af74c9d 100644 --- a/Erika/Assets/Scripts/Unit/UnitRootMotion.cs +++ b/Erika/Assets/Scripts/Unit/UnitRootMotion.cs @@ -103,7 +103,7 @@ public class UnitRootMotion : UnitComponent if(m_Owner.transform.position.y + realDest.y < 0)
realDest.y = 0;
}
- m_Owner.transform.position += realDest;
+ m_Owner.unitCharacterController.Move(realDest);
m_PrevFrame = frame;
}
@@ -119,10 +119,10 @@ public class UnitRootMotion : UnitComponent dest.y = 0;
}
dest.y = Mathf.Max(0, dest.y); // 从地面以下拉回
- //m_Owner.transform.position += RootMotionUtility.ExchangeXZ(dest); // 不需要exchangeXZ
- m_Owner.transform.position += dest;
- }
- }
+ //m_Owner.transform.position += RootMotionUtility.ExchangeXZ(dest); // 不需要exchangeXZ
+ m_Owner.unitCharacterController.Move(dest);
+ }
+ }
#endif
|