blob: d16a462cf4febd6ea9bbab97beae5b81438a57bc (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public struct HitInfo
{
public HitDefination hitDef;
public Hitbox hitbox;
public Hurtbox hurtbox;
public Vector3 contact;
public Vector3 size;
}
public struct HurtInfo
{
public HitDefination hitDef;
public Hitbox hitbox;
public Hurtbox hurtbox;
public Vector3 contact;
public Vector3 size;
}
public class HitManager : Singleton<HitManager>
{
private List<Hitbox> m_HitBoxes = new List<Hitbox>();
private List<Hurtbox> m_HurtBoxes = new List<Hurtbox>();
public void AddHitBox(Hitbox hitbox)
{
m_HitBoxes.Add(hitbox);
}
public void AddHurtBox(Hurtbox hurtbox)
{
m_HurtBoxes.Add(hurtbox);
}
public void RemoveHitBox(Hitbox hitbox)
{
m_HitBoxes.Remove(hitbox);
}
public void RemoveHurtBox(Hurtbox hurtbox)
{
m_HurtBoxes.Remove(hurtbox);
}
/// <summary>
/// 根据碰撞结果产生击中信息
/// </summary>
public void OnPhysicsUpdate()
{
for(int i = 0;i < m_HitBoxes.Count; ++i)
{
Hitbox hitbox = m_HitBoxes[i];
if (hitbox == null)
return;
for (int j = 0; j < PhysicsWorld.Instance.Collisions.Count; ++j)
{
PhysicsCollisionInfo info = PhysicsWorld.Instance.Collisions[j];
PhysicsPrimitive collider;
if(info.prim1 == hitbox.Collider)
{
collider = info.prim2;
}
else if(info.prim2 == hitbox.Collider)
{
collider = info.prim1;
}
else
{
continue;
}
Hurtbox hurtbox = GetHurtboxByCollider(collider);
if(hurtbox == null)
{
Debug.LogError("没有找到hurtbox");
continue;
}
HitDefination hitDef = null;
if (hitbox.Host is Avatar)
{
Avatar attacker = hitbox.Host as Avatar;
Hit hit = attacker.GetHit();
if(hit == null)
continue;
if (hit.HasRecord(hurtbox.Host))
continue;
hit.AddRecord(hurtbox.Host);
hitDef = hit.defination;
}
// 发送击中消息
HitInfo hitInfo = new HitInfo ();
hitInfo.hitbox = hitbox;
hitInfo.hurtbox = hurtbox;
hitInfo.contact = info.contact;
hitInfo.size = info.size;
hitInfo.hitDef = hitDef;
hitbox.Host.OnHit(hitInfo);
// 发送受击消息
HurtInfo hurtInfo = new HurtInfo();
hurtInfo.hitbox = hitbox;
hurtInfo.hurtbox = hurtbox;
hurtInfo.contact = info.contact;
hurtInfo.size = info.size;
hurtInfo.hitDef = hitDef;
hurtbox.Host.OnHurt(hurtInfo);
// 场景处理特效等
BattleManager.Instance.OnHitOccur();
}
}
}
Hurtbox GetHurtboxByCollider(PhysicsPrimitive collider)
{
foreach(var hurtbox in m_HurtBoxes)
{
if(hurtbox.Collider == collider)
{
return hurtbox;
}
}
return null;
}
}
|