Unity 2D,C#-为什么我的OnCollisionEnter2D不碰撞?

时间:2019-06-17 12:33:41

标签: c# unity3d

因此,我创建了两个脚本,一个名为“ Stats.cs”的脚本注册了玩家的统计信息,另一个名为“ PlayerHealth.cs”的“脚本”使玩家在接触时受到伤害并更新了HUD中的Hearts。我的问题是,每当我与带有标签“ Projectile”的对象碰撞时,它根本就无法工作,我的播放器根本不会受到伤害。 Stats.cs脚本不在任何对象中,PlayerHealth.cs在我的Player对象中。

Stats.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中的实际Health,并会更改HUD中的图像。

玩家在他的两个对撞机上都具有RigidBody2D,一个是用于身体的盒子,另一个是圆形对撞机,因此当玩家蹲下时,圆形对撞机将禁用。

弹丸还具有重力为0的RigidBody2D(这样它就不会掉到空中)和BoxCollider2D。

1 个答案:

答案 0 :(得分:1)

我将检查并确保将射弹标记为“射弹”,并且BoxCollider没有选中“触发”。

我也应该说,在Update中用for循环进行迭代是非常糟糕的做法,从性能角度来讲很不明智。从字面上看,这是机器可以循环的最快速度,并且每次都会这样做。我会考虑在事件中进行更新。

希望这会有所帮助!