Заставьте игрока получать урон в Unity 2D - PullRequest
0 голосов
/ 14 ноября 2018

Я сделал два сценария. Тот, который будет отслеживать здоровье игрока, индикатор здоровья и заставлять экран мигать, когда игрок поврежден. Другой сценарий предназначен для размещения на любом объекте, который я хочу нанести игроку повреждения при контакте. Моя проблема в том, что, похоже, ничто не причиняет игроку вреда.

PlayerHealth.cs:

using UnityEngine;
using UnityEngine.UI;

public class PlayerHealth : MonoBehaviour
{
    public int currentHealth;
    public float flashSpeed = 5;
    public Slider healthSlider;
    public Color flashColour = new Color(1, 0, 0, 0.1f);
    bool isDead;
    bool damaged;

    private void Awake()
    {
        currentHealth = 100;
    }

    private void Update()
    {
        damaged = false;
    }

    public void TakeDamage(int amount)
    {
        damaged = true;
        currentHealth -= amount;
        healthSlider.value = currentHealth;
    }
}

AttackPlayer.cs:

using UnityEngine;

public class AttackPlayer : MonoBehaviour
{
    public float timeBetweenAttacks = 0.5f;
    public int attackDamage = 10;

    GameObject player;
    PlayerHealth playerHealth;

    float timer;

    private void Awake()
    {
        player = GameObject.FindGameObjectWithTag("Player");
        playerHealth = player.GetComponent<PlayerHealth>();
    }

    private void OnTriggerEnter2D(Collider2D col)
    {
        if (col.gameObject == player)
        {
            Attack();
        }
    }

    private void Update()
    {
        timer += Time.deltaTime;

        if(playerHealth.currentHealth <=0)
        {
            // TODO: add death script here.
        }
    }

    void Attack()
    {
        timer = 0f;
        if(playerHealth.currentHealth > 0)
        {
            playerHealth.TakeDamage(attackDamage);
        }
    }
}

У игрока жесткое тело2D. На игроке и на разрушающих предметах есть Box Collider 2D.

1 Ответ

0 голосов
/ 14 ноября 2018
  1. Убедитесь, что у игроков Collider включено isTrigger.

  2. attackDamage общедоступно -> установлено в инспекторе.Убедитесь, что это не 0.

    Вы можете использовать

    [Range(1,100)] public int attackDamage = 10;
    

    , чтобы автоматически зафиксировать значение в инспекторе.

  3. Догадываюсь, но я бы сказал, что ваш Colliderможет быть не на GameObject player, но, возможно, на одном из его дочерних элементов => условие col.gameObject == player не соответствует действительности.

    Вместо GameObject ссылок сравните PlayerHealth (поскольку существует только одна) ссылка, например

    private void OnTriggerEnter2D(Collider2D col)
    {
        // gets PlayerHealth component on this or any parent object
        var health = col.GetComponentInParent<PlayerHealth>();
        if (health  == playerHealth)
        {
            Attack();
        }
    }
    
  4. У вас есть

    private void Update()
    {
        damaged = false;
    }
    
    public void TakeDamage(int amount)
    {
        damaged = true;
        currentHealth -= amount;
        healthSlider.value = currentHealth;
    }
    

    Я не знаю, что еще должно произойти на TakeDamage, но значение damaged сбрасывается в Update, поэтому сразу после того, как оно было установлено Trigger, потому что физические события, такие как OnTriggerEnter, выполняются раньшеUpdate ( см. Порядок исполнения ).


Подсказка: вместо

player = GameObject.FindGameObjectWithTag("Player");
playerHealth = player.GetComponent<PlayerHealth>();

вы также можете использовать

playerHealth = FindObjectOfType<PlayerHealth>();

, если этот компонент существует только один раз в вашей сцене.


Или для большей гибкости (с несколькими игроками) все, что вам нужно сделать, это изменить свои OnTriggerEnter2D и Attackметод

private void OnTriggerEnter2D(Collider2D col)
{
    // gets PlayerHealth component on this or any parent object
    var health = col.GetComponentInParent<PlayerHealth>();
    if (health != null)
    {
        Attack(health);
    }
}

void Attack(PlayerHealth health)
{
    timer = 0f;
    if(health.currentHealth > 0)
    {
        health.TakeDamage(attackDamage);
    }
}

Так что вам не нужно будет получать ссылку раньше.

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