触发器无法正常使用GetComponent.出了什么问题

本文关键字:什么 问题 GetComponent 常使用 触发器 | 更新日期: 2023-09-27 18:28:37

这是玩家健康脚本。。。它从Unity内部设置玩家的健康状况,并将其推送到GUI上。

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值传递给玩家健康脚本,以便它在GUI上更新。只是想让这些触发器发挥作用。

触发器无法正常使用GetComponent.出了什么问题

以下代码不起作用,因为您正在创建等于玩家HP的新变量PHP(但不引用它,因为int是一种值类型,而不是引用类型),并且当您更改PHP时,它只更改此变量,而不更改PlayerHealth脚本中的PlayerHP

    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;

是的,我不确定这是否有效,因为我没有那么先进,但试着使用coll.tag,因为coller类有一个标记变量it self。