Unity 2D, C # - Почему мой OnCollisionEnter2D не сталкивается? - PullRequest
0 голосов
/ 17 июня 2019

Итак, я создал два скрипта, один с именем «Stats.cs» регистрирует статистику игрока, а другой с именем «PlayerHealth.cs» «заставляет игрока получать урон при контакте и обновляет сердца в HUD.Моя проблема в том, что всякий раз, когда я сталкиваюсь с объектом, имеющим тег «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 обновляется, поэтому он будет оставаться фактическим здоровьем в статистике и будет менять изображения в HUD.

У игрока есть RigidBody2D на нем два коллайдера, один - ящик для тела, а другой -является круговым коллайдером, поэтому, когда игрок приседает, круговой коллайдер отключается.

Снаряды также имеют и RigidBody2D с 0 гравитацией (чтобы он не падал в воздухе) и BoxCollider2D.

1 Ответ

1 голос
/ 17 июня 2019

Я бы проверил и удостоверился, что снаряд помечен как «Снаряд» и что на BoxCollider не отмечен «Is Trigger».

Я также должен сказать, что повторение цикла for в обновлении очень плохая практика производительности.Это происходит буквально так быстро, как машина может зациклить его, и это делает каждый раз .Я бы посмотрел, как обновить его на мероприятии.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...