【问题标题】:Player attacks another player, both take damage since both are colliding玩家攻击另一名玩家,双方都受到伤害,因为双方都在碰撞
【发布时间】:2020-05-18 16:35:03
【问题描述】:

我对 unity 还很陌生,遇到了一个问题,即当我的一个游戏对象与另一个游戏对象发生碰撞时,它们都会受到伤害。我的伤害被降低了,但是当我撞到对手时问题就来了,它会受到伤害,但我也会受到伤害。试着想一想如何修复,这样他只会受到我的冲击造成的伤害,如果另一个游戏物体撞到我身上,那么我只会受到伤害,而不是他。

public void TakeDamage(float amount)
{
    health -= amount;
    healthbar.fillAmount = health / starthealth;


    if (health <= 0)
    {
        gameObject.SetActive(false);
    }

}

public void OnCollisionEnter(Collision collision)
{
    if (collision.collider.gameObject.tag == "player") 
    {
        collision.gameObject.GetComponent<playerScript> ().TakeDamage (damage);

    }
}

这是受到伤害和碰撞的样子,敌人与我发生碰撞,它使用玩家脚本中的受到伤害方法

【问题讨论】:

  • 好吧,如果我的车撞到你的车上,我们都会受到伤害,所以发生这种情况有很多逻辑。您可以确定可能是移动速度较快的物品造成了损坏
  • 这是关于c#,而不是unityscript

标签: c# unity3d game-engine game-development


【解决方案1】:

我认为您需要区分 HitboxesHurtboxes。 (A good Article about these here)

然后当 Hitbox 与 Hurtbox 碰撞时,只有 Hurtbox 的角色会受到伤害。

如何处理这个问题取决于您正在开发的游戏类型。近战格斗类游戏可能会使用不同的碰撞器组件来区分 Hitbox 和 Hurtbox。

另一个更复杂的场景是“汽车碰撞”类型的游戏,汽车在相互碰撞时会受到伤害。由于汽车上的 Hitbox 和 Hurtbox 基本相同,因此您需要额外的逻辑来确定哪辆车受到了多少伤害。

我可以认为另一辆车受到的损坏程度取决于碰撞时汽车的速度和汽车所面对的实际方向。

因此,当玩家 1 攻击/撞到玩家 2 时,只有玩家 2 会受到伤害,因为玩家 2 要么没有任何速度,要么没有驶向玩家 1 的方向。

使用这样的游戏逻辑,您通常可以涵盖所有不同的受到伤害的边缘情况,并为每个玩家分配适当的伤害。

【讨论】:

    【解决方案2】:

    如果您的两个对象也有刚体组件,那么您可以检查它们之前的速度,并将损坏分配给速度较低的那个。我理解这就是您在夯实描述中的概念含义。为了确保使用碰撞前的速度(而不是碰撞后已经解决的速度),您可以将碰撞存储在 FixedUpdate 函数中。所以你得到(假设一个 Player 类附加到两个对象,使用你的术语):

    using UnityEngine;
    
    public class Player : MonoBehaviour
    {
        Vector3 velocityBeforeCollisions = Vector3.zero;
        Rigidbody body = null;
        float health = 1f;
    
        void Start()
        {
            body = GetComponent<Rigidbody>();
        }
    
        void FixedUpdate()
        {
            velocityBeforeCollisions = body.velocity;
        }
    
        public float GetSpeed()
        {
            return velocityBeforeCollisions.magnitude;
        }
    
        void OnCollisionEnter(Collision collision)
        {
            Player otherPlayer = collision.gameObject.GetComponent<Player>();
            if (otherPlayer != null && otherPlayer.GetSpeed() > GetSpeed())
            {
                Damage();
            }
        }
    
        public void Damage()
        {
            Debug.Log(name + " damaged");
            health -= 0.1f;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-03
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      相关资源
      最近更新 更多