From ffd1d5af496e0a0eff343b27c4f0f965bbbf79eb Mon Sep 17 00:00:00 2001 From: chai Date: Tue, 31 Aug 2021 19:07:21 +0800 Subject: *projectile --- Assets/Scripts/Unit/Collider/CollisionSystem.cs | 53 ++++++++++++++++++++-- Assets/Scripts/Unit/Component/PCState.cs | 1 + .../Scripts/Unit/Controller/MonsterController.cs | 14 +++--- Assets/Scripts/Unit/Controller/UnitController.cs | 13 ++++++ Assets/Scripts/Unit/Events/EventProjectile.cs | 3 +- Assets/Scripts/Unit/TimelineEventProxy.cs | 46 ++++++++++++++++++- 6 files changed, 116 insertions(+), 14 deletions(-) (limited to 'Assets/Scripts/Unit') diff --git a/Assets/Scripts/Unit/Collider/CollisionSystem.cs b/Assets/Scripts/Unit/Collider/CollisionSystem.cs index 0e3c92f0..e84c54a9 100644 --- a/Assets/Scripts/Unit/Collider/CollisionSystem.cs +++ b/Assets/Scripts/Unit/Collider/CollisionSystem.cs @@ -1,4 +1,4 @@ -using System.Collections; +using System; using System.Collections.Generic; using UnityEngine; @@ -8,10 +8,11 @@ public struct ColliderDescriptor public UnitCollider unitCollider; } +[Serializable] public struct Box { - public Vector3 center; - public Vector3 size; + [SerializeField] public Vector3 center; + [SerializeField] public Vector3 size; } public struct CollisionInfo @@ -107,9 +108,53 @@ public class CollisionSystem : SingletonMB void SolveProjectile() { + // collect all hurt box + List hurtboxes = ListPool.Get(); + foreach (var collider in registry.colliders) + { + ColliderInfo[] boxes = collider.GetCurrentBoxesInfoByType(ColliderBox.EColliderType.HurtBox); + if (boxes == null || boxes.Length == 0) + continue; + for (int i = 0; i < boxes.Length; ++i) + { + ColliderDescriptor descriptor = new ColliderDescriptor(); + descriptor.colliderInfo = boxes[i]; + descriptor.unitCollider = collider; + hurtboxes.Add(descriptor); + } + } - } + foreach (var projectile in registry.projectiles) + { + for(int i = 0; i < hurtboxes.Count; ++i) + { + ColliderDescriptor hurtCollider = hurtboxes[i]; + if (projectile.owner.type == hurtCollider.unitCollider.owner.type) + continue; + Box hurtbox = ColliderUtility.GetColliderInWorldSpace(hurtCollider); + foreach (var itor in projectile.GetCollidersInWorldSpace()) + { + Box box = (Box)itor; + Box intersection = ColliderUtility.GetIntersection(box, hurtbox); + if (intersection.size.magnitude == 0) + continue; + if (!projectile.CanHit(hurtCollider.unitCollider.owner.GetHashCode())) + continue; + projectile.RecordTarget(hurtCollider.unitCollider.owner.GetHashCode()); + CollisionInfo collision = new CollisionInfo(); + collision.isCollision = true; + collision.intersection = intersection; + collision.collidee = hurtCollider; + hurtCollider.unitCollider.owner.OnGetShot(collision); + projectile.OnShot(collision); + + goto next; + } + } + next:; + } + } // throwbox <-> hurtbox void SolveThrow() diff --git a/Assets/Scripts/Unit/Component/PCState.cs b/Assets/Scripts/Unit/Component/PCState.cs index 1b01fad8..a9252e26 100644 --- a/Assets/Scripts/Unit/Component/PCState.cs +++ b/Assets/Scripts/Unit/Component/PCState.cs @@ -457,3 +457,4 @@ public class PCState : UnitState #endregion } + \ No newline at end of file diff --git a/Assets/Scripts/Unit/Controller/MonsterController.cs b/Assets/Scripts/Unit/Controller/MonsterController.cs index 981e6d4b..9e7e7955 100644 --- a/Assets/Scripts/Unit/Controller/MonsterController.cs +++ b/Assets/Scripts/Unit/Controller/MonsterController.cs @@ -6,14 +6,6 @@ public class MonsterController : UnitController { public override UnitType type { get { return UnitType.Monster; } } - public Vector3 center - { - get - { - return GetComponentInChildren().bounds.center; - } - } - public override void Initialize(GameObject obj, string folder) { base.Initialize(obj, folder); @@ -58,4 +50,10 @@ public class MonsterController : UnitController } } + public override void OnGetShot(CollisionInfo info) + { + monsterState.ChangeState(MonsterState.EUnitState.HitLight, new MonsterState.HitLightParam()); + } + + } \ No newline at end of file diff --git a/Assets/Scripts/Unit/Controller/UnitController.cs b/Assets/Scripts/Unit/Controller/UnitController.cs index 3568cb4e..9b3ef6e5 100644 --- a/Assets/Scripts/Unit/Controller/UnitController.cs +++ b/Assets/Scripts/Unit/Controller/UnitController.cs @@ -83,6 +83,14 @@ public class UnitController : MonoBehaviour/*, Interactable*/ } } + public virtual Vector3 center + { + get + { + return GetComponentInChildren().bounds.center; + } + } + public virtual void Initialize( GameObject obj , string folder) { unitObj = obj; @@ -123,6 +131,11 @@ public class UnitController : MonoBehaviour/*, Interactable*/ { } + public virtual void OnGetShot(CollisionInfo info) + { + } + + public virtual void OnGrab() { } diff --git a/Assets/Scripts/Unit/Events/EventProjectile.cs b/Assets/Scripts/Unit/Events/EventProjectile.cs index 7dc2923a..0c1dc22b 100644 --- a/Assets/Scripts/Unit/Events/EventProjectile.cs +++ b/Assets/Scripts/Unit/Events/EventProjectile.cs @@ -24,7 +24,7 @@ public class EventProjectile : AnimationEventBase public Vector3 rotation; [Tooltip("Scale")] - public Vector3 scale; + public Vector3 scale = Vector3.one; [Tooltip("初始速度")] public Vector3 velocity; @@ -35,5 +35,6 @@ public class EventProjectile : AnimationEventBase [Tooltip("击中效果")] public ColliderBox.EHitResponse hitResponse; + public string sparkPath; } diff --git a/Assets/Scripts/Unit/TimelineEventProxy.cs b/Assets/Scripts/Unit/TimelineEventProxy.cs index 7a76cd73..51d437fe 100644 --- a/Assets/Scripts/Unit/TimelineEventProxy.cs +++ b/Assets/Scripts/Unit/TimelineEventProxy.cs @@ -7,7 +7,13 @@ using UnityEngine; // 执行帧事件 [DisallowMultipleComponent] public partial class TimelineEventProxy -{ +{ +#if UNITY_EDITOR // ActionTool里 + public bool isInEditMode; + public delegate void RegisterProjectileHandle(Projectile projectile); + public RegisterProjectileHandle registerProjectile; +#endif + public enum EEventType { EventCamera_Zoom, // 相机聚焦 @@ -118,4 +124,42 @@ public partial class TimelineEventProxy } + void EventProjectile(AnimationEventBase animEvent) + { + EventProjectile e = animEvent as EventProjectile; + if (e == null) + return; + string projectilePath = e.projectilePath; + GameObject prefab = ResourceManager.Instance.LoadAsset(projectilePath); + if(prefab == null) + { + LogHelper.LogError("缺少对应的projectile, " + projectilePath); + return; + } + if(prefab.GetComponent() == null) + { + LogHelper.LogError("没有projectile脚本"); + return; + } + GameObject obj = GameObject.Instantiate(prefab); + Projectile projectile = obj.GetComponent(); + ProjectileInfo info = new ProjectileInfo(); + info.owner = m_Owner; + info.position = m_Root.transform.position + e.posOffset; + info.rotation = e.rotation; + info.scale = e.scale; + info.direction = Vector3.right; + info.velocity = Vector3.right * 10f; + info.lifetime = 5; + info.sparkPath = e.sparkPath; + projectile.Initialize(info); + +#if UNITY_EDITOR + if(isInEditMode && registerProjectile != null) + { + registerProjectile(projectile); + } +#endif + } + } \ No newline at end of file -- cgit v1.1-26-g67d0