一、碰撞的分类
1. 弹性碰撞(Elastic Collision)
生活比喻
- 像打台球、弹珠碰撞,球撞球后会弹开,各自继续运动,几乎没有能量损失。
- 想象两个弹力球互相撞击,碰撞后都弹开,速度和方向都变了,但总能量和动量都守恒。
物理特征
- 动量守恒,动能也守恒。
- 物体会“弹开”,不会粘在一起。
公式
- m₁v₁ + m₂v₂ = m₁v₁’ + m₂v₂’(动量守恒)
- ½m₁v₁² + ½m₂v₂² = ½m₁v₁’² + ½m₂v₂’²(动能守恒)
2. 非弹性碰撞(Inelastic Collision)
生活比喻
- 想象一团泥巴扔到墙上,啪的一声粘住了,不会弹开。
- 或者子弹射进西瓜,子弹和西瓜的一部分“合体”一起动。
物理特征
- 动量守恒,动能不守恒(有一部分能量变成了热、形变等)。
- 物体可能会“粘在一起”或部分嵌入。
公式
- m₁v₁ + m₂v₂ = (m₁ + m₂)v’(完全非弹性碰撞,合体一起动)
二、射击游戏中的实际应用
1. 弹性碰撞的应用
场景举例
- 子弹反弹:比如霰弹枪的弹丸、激光武器、弹跳子弹等,子弹打到墙上会弹开,继续飞行。
- 爆炸碎片反弹:爆炸后碎片撞到金属表面会弹开,造成二次伤害。
游戏体验
- 增加策略性,比如利用反弹打击掩体后的敌人。
- 让场景更有趣,子弹轨迹多变。
伪代码
void OnCollisionEnter(Collision collision)
{
// 计算反弹方向
Vector3 incoming = bulletRb.velocity;
Vector3 normal = collision.contacts[0].normal;
Vector3 reflected = Vector3.Reflect(incoming, normal);
// 保持速度大小不变(理想弹性碰撞)
bulletRb.velocity = reflected;
}
2. 非弹性碰撞的应用
场景举例
- 子弹击中敌人:大多数射击游戏中,子弹击中敌人后会停下或嵌入体内,不会弹开。
- 爆炸冲击:手雷爆炸后,碎片嵌入物体或敌人,动能损失,物体被击退。
游戏体验
- 真实还原子弹打击感,敌人被击退或击飞。
- 爆炸后物体不会乱弹,而是被推开或倒地。
伪代码
void OnBulletHit(Rigidbody bulletRb, Rigidbody enemyRb)
{
// 完全非弹性碰撞,子弹和敌人合体
float m1 = bulletRb.mass;
float v1 = bulletRb.velocity.magnitude;
float m2 = enemyRb.mass;
float vPrime = m1 * v1 / (m1 + m2);
Vector3 direction = bulletRb.velocity.normalized;
// 敌人获得冲量
enemyRb.AddForce(direction * vPrime * m2, ForceMode.Impulse);
// 子弹消失
Destroy(bulletRb.gameObject);
}
三、对比总结
类型 | 动量守恒 | 动能守恒 | 典型表现 | 射击游戏应用 |
---|---|---|---|---|
弹性碰撞 | 是 | 是 | 物体弹开 | 子弹反弹、碎片反弹 |
非弹性碰撞 | 是 | 否 | 物体粘合/嵌入 | 子弹击中敌人、爆炸冲击 |
四、进阶玩法建议
- 弹性碰撞:可做“反弹射击”关卡、机关弹跳、激光反射谜题等。
- 非弹性碰撞:用于表现真实打击感、爆炸推力、尸体物理等。
五、形象小结
- 弹性碰撞像弹力球,碰了就弹开,能量不损失。
- 非弹性碰撞像泥巴,碰了就粘住,能量损失,动量还在。
我们来聊聊特殊子弹和特殊材质(比如橡胶墙、吸能装甲)下的碰撞实现。这里会结合生动比喻+物理原理+游戏场景+实现思路+伪代码,让你一看就懂!
一、橡胶墙(高弹性材质)+特殊子弹
1. 场景描述
- 橡胶墙:像蹦床一样,子弹打上去会弹得很高很远,甚至比普通墙弹得更快。
- 特殊子弹:比如“反弹弹”,遇到橡胶墙会多次弹跳,遇到普通墙可能只弹一次。
2. 物理原理
- 弹性系数(Restitution):衡量碰撞后速度保留多少。1为完全弹性(不损失能量),0为完全非弹性(全损失)。
- 橡胶墙的弹性系数接近1,普通墙可能是0.5,吸能装甲可能是0.1。
3. 游戏实现思路
- 检测碰撞时,判断碰撞材质的弹性系数。
- 计算反弹速度时,乘以弹性系数,决定反弹后速度有多大。
- 特殊子弹可以设置最大反弹次数或特殊反弹规则。
4. 伪代码示例
// 假设每种材质有一个弹性系数 restitution
void OnCollisionEnter(Collision collision)
{
float restitution = 1.0f; // 默认完全弹性
if (collision.collider.CompareTag("RubberWall"))
restitution = 0.95f; // 橡胶墙,几乎完全弹性
else if (collision.collider.CompareTag("NormalWall"))
restitution = 0.5f; // 普通墙
else if (collision.collider.CompareTag("AbsorbArmor"))
restitution = 0.1f; // 吸能装甲
Vector3 incoming = bulletRb.velocity;
Vector3 normal = collision.contacts[0].normal;
Vector3 reflected = Vector3.Reflect(incoming, normal);
// 反弹速度根据弹性系数衰减
bulletRb.velocity = reflected * restitution;
// 特殊子弹:记录反弹次数
if (isSpecialBouncyBullet)
{
bounceCount++;
if (bounceCount > maxBounces)
Destroy(bulletRb.gameObject);
}
else
{
// 普通子弹遇到非弹性墙直接消失
if (restitution < 0.5f)
Destroy(bulletRb.gameObject);
}
}
5. 游戏体验
- 橡胶墙让子弹“蹦蹦跳跳”,可以用来解谜、打击隐藏敌人。
- 普通墙子弹反弹一次就消失。
- 吸能装甲几乎不反弹,子弹能量被吸收。
二、吸能装甲(高吸收材质)+特殊子弹
1. 场景描述
- 吸能装甲:比如某些BOSS穿的高科技护甲,子弹打上去几乎不反弹,能量被吸收,甚至能量条会增加。
- 特殊子弹:比如“穿甲弹”,遇到吸能装甲会损失大部分能量,但还能穿透一点。
2. 物理原理
- 吸能装甲的弹性系数极低,碰撞后子弹速度大幅降低,甚至直接停下。
- 可以设置“能量吸收”效果,子弹动能的一部分转化为护甲能量。
3. 游戏实现思路
- 检测碰撞材质,若为吸能装甲,子弹速度大幅衰减。
- 计算能量吸收,给护甲加能量。
- 穿甲弹可设置“最小剩余速度”,即使能量被吸收,也能继续前进一小段。
4. 伪代码示例
void OnCollisionEnter(Collision collision)
{
if (collision.collider.CompareTag("AbsorbArmor"))
{
float restitution = 0.1f; // 吸能装甲
Vector3 incoming = bulletRb.velocity;
Vector3 normal = collision.contacts[0].normal;
Vector3 reflected = Vector3.Reflect(incoming, normal);
// 子弹速度大幅衰减
bulletRb.velocity = reflected * restitution;
// 能量吸收
float lostEnergy = 0.9f * bulletRb.mass * incoming.sqrMagnitude * 0.5f;
collision.collider.GetComponent<Armor>().AbsorbEnergy(lostEnergy);
// 穿甲弹特性
if (isArmorPiercing)
{
float minSpeed = 5f;
if (bulletRb.velocity.magnitude < minSpeed)
bulletRb.velocity = bulletRb.velocity.normalized * minSpeed;
}
else
{
// 普通子弹直接消失
Destroy(bulletRb.gameObject);
}
}
}
5. 游戏体验
- 吸能装甲让BOSS更难对付,普通子弹几乎无效,玩家需要用特殊弹药。
- 穿甲弹能略微穿透,考验玩家策略。
- 护甲能量条可用于BOSS技能释放,增加战斗变化。
三、更多创意玩法
- 反弹谜题:利用橡胶墙和反弹弹,解锁机关或击中难以直射的目标。
- 能量吸收机制:玩家或敌人用吸能装甲吸收子弹能量,转化为护盾或技能能量。
- 多材质互动:同一场景中不同墙体、敌人有不同弹性,玩家需灵活选择武器和射击角度。
四、形象小结
- 橡胶墙:像蹦床,子弹弹得高高的,能量损失很少。
- 吸能装甲:像厚厚的棉被,子弹打上去几乎没反应,能量被“吃掉”。
- 特殊子弹:有的能多次反弹,有的能穿透吸能装甲,玩法丰富。