2016-01-01 4 views
0

Вот сценарий здоровья игрока ... Он устанавливает здоровье игроков изнутри Unity и выталкивает его в GUI.Триггер не работает должным образом с GetComponent. Что не так?

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

public class PlayerHealth : MonoBehaviour 
{ 


    public Text hpText; //HP Value Text Element. 
    public int PlayerHP; // Make it a property so you can alter its value in the editor 

    void Start() 
    { 
     SetHPText(); 
    } 

    void Update() 
    { 
     SetHPText(); 
    } 

    void SetHPText() 
    { 
     hpText.text = "Health: " + PlayerHP.ToString(); 
    } 
} 

Затем этот захват захватывает текущее состояние игроков (и сохраняет его в курсе). Если здоровье игроков равно 0 (или ниже), он загружает новую сцену. Проблема заключается в проверке тега тега для игрока, и наносить урон не работают.

using UnityEngine; 
using UnityEngine.SceneManagement; 
using System.Collections; 

public class DamageAuroa : MonoBehaviour { 

    public int PHP; //PHP = Player Health from PlayerHealth.cs script. 
    public int Damage; //Amount of damage. 
    public string Level; 

    void Update() 
    { 
     PHP = GameObject.Find("Player").GetComponent<PlayerHealth>().PlayerHP; 
    } 

    void OnTriggerEnter(Collider coll) 
    { 
     if (coll.gameObject.tag == "Player") 
      PHP = PHP - Damage; 

     if (coll.gameObject.tag == "Ball") 
     { 
      gameObject.SetActive(false); 
      SceneManager.LoadScene(Level); 
     } 

     if (PHP <= 0) 
      SceneManager.LoadScene(Level); 

    } 

} 

Самая странная часть ВСЕ ЭТОГО работала до того, как я обновил Unity (я знаю ошибку новичка). Кто-нибудь посмотрит, в чем дело? Прежде чем кто-нибудь спросит, есть триггеры, и теги настроены правильно. Также я понимаю, что мне нужно передать обновленное значение HP в сценарий работоспособности проигрывателя, чтобы он обновлялся в графическом интерфейсе. Просто пытаюсь заставить эти триггеры работать.

ответ

1

Следующий код не работает, потому что вы создаете новую переменную PHP, которая приравнивает к игроку HP (но не ссылается на него, потому что int является типом значения, а не ссылочный тип) и при изменении PHP он изменяет только эта переменная, а не PlayerHP от PlayerHealth сценарий.

void Update() 
    { 
     PHP = GameObject.Find("Player").GetComponent<PlayerHealth>().PlayerHP; 
    } 

    void OnTriggerEnter(Collider coll) 
    { 
     if (coll.gameObject.tag == "Player") 
      PHP = PHP - Damage; 

     .... 

    } 

Если вы хотите изменить PlayerHealth вы должны изменить его непосредственно из PlayerHealth экземпляра сценария.

if (coll.gameObject.tag == "Player") 
       GameObject.Find("Player").GetComponent<PlayerHealth>().PlayerHP= PHP - Damage; 

Или вы можете создать ссылки на переменные ссылки типа для PlayerHealth сценария.

public class DamageAuroa : MonoBehaviour { 

    PlayerHealth player; 

    void Start() 
    { 
     player = GameObject.Find("Player").GetComponent<PlayerHealth>(); 
    } 
    ... 

И затем используйте этот объект для установки игроков hp.

if (coll.gameObject.tag == "Player") 
    player.PlayerHP = player.PlayerHP- Damage; 
+0

Я пробовал это, и он не меняет здоровье плеера вообще. Он просто остается прежним. Кроме того, я дважды проверял все мои теги и триггеры, они в порядке. – Zohan

+0

@ user1768885 Вы ​​установили Damage? Вы пытались установить HP в разные значения в этом скрипте? – Valentin

+0

сделал. Еще ничего. Также я знаю, что мне нужно как можно скорее передать обновленное значение обратно в значение hp игрока, чтобы он обновлял графический интерфейс. – Zohan

0

Да ну, я не уверен, если это будет работать, потому что я не так продвинулся мой сам, но попробуйте использовать coll.tag, потому что класс угольщик имеет метку переменной это сам.

Смежные вопросы