【问题标题】:Trigger not working properly with GetComponent. What is wrong?触发器无法与 GetComponent 一起正常工作。怎么了?
【发布时间】:2016-01-02 06:57:32
【问题描述】:

这是玩家健康脚本...它在 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 上更新。只是试图让这些触发器发挥作用。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    以下代码不起作用,因为您正在创建等于玩家 HP 的新变量 PHP(但没有引用它,因为 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;
    

    【讨论】:

    • 我试过了,它根本不会改变玩家健康。它只是保持不变。我还仔细检查了我所有的标签,并触发它们很好。
    • @user1768885 你设置了损害吗?您是否尝试在此脚本中将 HP 设置为不同的值?
    • 我做到了。依然没有。另外我知道我需要以某种方式将更新后的值传递回玩家的 hp 值,以便它更新 GUI。
    • @user1768885 要更改 hpText,您应该更改 PlayerHealth 中的 PlayerHP,您可以这样做 - GameObject.Find("Player").GetComponent().PlayerHP= PHP - Damage ;
    • @user1768885 你能显示一个触发器对象吗?它有 Mesh Collider 吗?
    【解决方案2】:

    好吧,我不确定这是否可行,因为我自己没有那么先进,但尝试使用 coll.tag,因为 collier 类有一个标签变量它自己。

    【讨论】:

      猜你喜欢
      • 2011-10-29
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 2015-12-02
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多