Tranform.Find 没有获得正确的游戏对象

Tranform.Find Isn't Getting the Correct GameObject

我觉得这个问题不好问,但我无法弄清楚问题出在哪里。

我正在制作一个 ScoreController,我想制作一个硬币对象,当它被击中时,得分 GUI 会增加 100。所有的硬币里面都有这个脚本:

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

public class CoinScoreController : MonoBehaviour
{

    public void OnTriggerEnter2D(Collider2D collider)
    {
        transform.parent.parent.parent.Find("Canvas/ScoreUIController").CollectCoin();
    }
}

我知道这是一种非常糟糕的获取对象的方法,但我不知道问题出在哪里。这是我试图引用的脚本:

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

public class ScoreController : MonoBehaviour
{

    public static int score = 0; //Number of coins
    public static GameObject scoreUI; //A gameObject for the CoinUI

    // Update is called once per frame
    void Start()
    {
        scoreUI = GameObject.Find("ScoreUI"); //Automatically sets all coins to have their coinUI GameObject equal the CoinUI UI.
    }

    public void CollectCoin() //Runs when a coin is collected. Makes it disapear and adds one to the counter.
    {
        gameObject.SetActive(false);
        score += 100;
        scoreUI.GetComponent<Text>().text = "Score: " + score.ToString();
    }

    public void KilledMonster()
    {
        score += 1000;
    }

}

ScoreControllerUI 在 Canvas 里面,所以我认为我的路径没有错误。你能不transform.Find()从现场吗?这是我的场景:

我相信你会说,我是这个网站和 Unity 的新手,所以对于我提出这个问题的方式中的任何错误,我深表歉意。也请随时给我建设性的批评。我正在使用统一版本 2020.3.24f1 并使用 C# 进行编码。我不知道这是否相关,但我正在使用 visual studio.

进行编码

再次为我犯下的愚蠢错误道歉。

而不是使用

transform.parent.parent.parent.Find("Canvas/ScoreUIController").CollectCoin();

使用

GameObject.Find("Canvas/ScoreUIController").GetComponent<ScoreController>().CollectCoin();

建议:在您的 CoinScoreController 中定义一个 public ScoreController ScoreUIController(我假设您的硬币是预制件)然后将 ScoreUIController 拖放到其中以将您的脚本分配给我们定义的变量。 现在,您可以调用

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

public class CoinScoreController : MonoBehaviour
{
    public ScoreController ScoreUIController;

    public void OnTriggerEnter2D(Collider2D collider)
    {
        ScoreUIController.CollectCoin();
    }
}

P.S。 : 请先按照教程阅读文档,因为我看到你的代码非常繁重。