diff options
Diffstat (limited to 'Assets/Scripts/Unit')
-rw-r--r-- | Assets/Scripts/Unit/Collider/CollisionSystem.cs | 53 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Component/PCState.cs | 1 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Controller/MonsterController.cs | 14 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Controller/UnitController.cs | 13 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Events/EventProjectile.cs | 3 | ||||
-rw-r--r-- | Assets/Scripts/Unit/TimelineEventProxy.cs | 46 |
6 files changed, 116 insertions, 14 deletions
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<CollisionSystem> void SolveProjectile()
{
+ // collect all hurt box
+ List<ColliderDescriptor> hurtboxes = ListPool<ColliderDescriptor>.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<Renderer>().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<Renderer>().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<GameObject>(projectilePath);
+ if(prefab == null)
+ {
+ LogHelper.LogError("缺少对应的projectile, " + projectilePath);
+ return;
+ }
+ if(prefab.GetComponent<Projectile>() == null)
+ {
+ LogHelper.LogError("没有projectile脚本");
+ return;
+ }
+ GameObject obj = GameObject.Instantiate(prefab);
+ Projectile projectile = obj.GetComponent<Projectile>();
+ 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 |