C# Unity 2D,C-为什么我的OnCollisionInter2D没有碰撞?

C# Unity 2D,C-为什么我的OnCollisionInter2D没有碰撞?,c#,unity3d,C#,Unity3d,因此,我创建了两个脚本,一个名为Stats.cs,用于注册玩家的统计信息,另一个名为PlayerHealth.cs,用于让玩家在接触时受到伤害并更新HUD中的心脏。我的问题是,每当我与一个有一个名为“射弹”的标签的物体碰撞时,它根本不起作用,我的玩家根本不会受到伤害。Stats.cs脚本不在任何对象中,PlayerHealth.cs在我的玩家对象中 统计数据 using System.Collections; using System.Collections.Generic; using Uni

因此,我创建了两个脚本,一个名为Stats.cs,用于注册玩家的统计信息,另一个名为PlayerHealth.cs,用于让玩家在接触时受到伤害并更新HUD中的心脏。我的问题是,每当我与一个有一个名为“射弹”的标签的物体碰撞时,它根本不起作用,我的玩家根本不会受到伤害。Stats.cs脚本不在任何对象中,PlayerHealth.cs在我的玩家对象中

统计数据

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class Stats{

private int health;

public int maxHP = 3;

public int Health
{
    get
    {
        //Some code
        return health;
    }
    set
    {
        //Some code
        health = Mathf.Clamp(value, 0, maxHP);
    }
}
public void SetHealth()
{
    Health = maxHP;
}
}
PlayerHealth.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PlayerHealth : MonoBehaviour
{
Stats playerStats = new Stats();

public int curHealth;
public int numOfHearts = 3;

public Image[] hearts;
public Sprite fullHeart;
public Sprite emptyHeart;

void OnCollisionEnter2D(Collision2D other)
{
    if (other.gameObject.CompareTag("Projectile"))
    {
        Debug.Log("Hello");
        DamagePlayer(1);
        Destroy(other.gameObject);
    }
}

public void DamagePlayer(int damage)
{
    playerStats.Health -= damage;
}

// Start is called before the first frame update
void Start()
{
    playerStats.SetHealth();
    curHealth = numOfHearts;
}

// Update is called once per frame
void Update()
{

    curHealth = playerStats.Health;
    numOfHearts = playerStats.maxHP;

    if (curHealth>numOfHearts){
        curHealth = numOfHearts;
    }
    if(curHealth <= 0){

        Die();

    }

    for (int i = 0; i < hearts.Length; i++)
    {
        if(i < curHealth){
            hearts[i].sprite = fullHeart;
        } else
        {
            hearts[i].sprite = emptyHeart;
        }

        if(i < numOfHearts){
            hearts[i].enabled = true;
        } else {
            hearts[i].enabled = false;
        }

    }
}

void Die(){
    //Restart
    Application.LoadLevel(Application.loadedLevel);
}


}
curHealth正在更新,因此它将保持为Stats中的实际运行状况,并将更改HUD中的图像

玩家身上有一个刚体2D两个碰撞器,一个是身体的盒子,另一个是圆碰撞器,因此当玩家蹲下时,圆碰撞器禁用


弹丸还具有0重力的刚性体2D,因此它不会落在半空中,不会发生BoxCollide R2D。

我会检查并确保弹丸被标记为弹丸,并且BoxCollider没有触发检查

我还应该说,在更新中使用for循环进行迭代在性能方面是非常糟糕的。事实上,这种情况正在以机器能够循环的速度发生,而且它每次都在这样做。我会考虑在某个活动中更新它


希望这有帮助

从你的帖子中还不完全清楚什么是有效的,什么是无效的。你的对撞机是一个触发器吗?如果是这样,请确保在“项目设置”>“物理”>“碰撞矩阵”中,您的层正在碰撞,并且“查询命中触发器”处于选中状态。另外,使用OnTiggerEnter2D代替OnCollisionEnter2D进行调试。LogHello;有人打过电话吗?