繁体   English   中英

Unity - 无法访问对另一个脚本的引用

[英]Unity - Cant access reference to another script

我正在尝试了解 Unity 是如何工作的,现在我遇到了无法从另一个脚本访问脚本的问题。 我在 Interner 上搜索了几个小时,我尝试了很多选择,但没有任何帮助。

我有 2 个脚本。

  • CoinSpawn.cs - 附加到播放器(我会将其更改为其他 object 但我还不知道哪个,因为它在后台运行所以它真的不需要在播放器上)

  • CollectingCoin.cs - 附加到 Coin(Coin 是 object,它在开始时不在游戏场景中,它随机生成)

CoinSpawn 是随机生成 object Coin 实例的脚本。 我想从 CollectingCoin 更改 CoinSpawn.currentCoinOnScreen 的值。 我试过了

CoinSpawn test = GameObject.Find("CoinSpawn").GetComponent<CoinSpawn>(); 

它不起作用。 我的两个脚本也在同一个资产文件夹中。 我究竟做错了什么? 谢谢

CoinSpawn.cs

public class CoinSpawn : MonoBehaviour
{
    public GameObject coin;
    public int maximumCoinPerScreen = 10;
    public int currentCoinOnScreen = 0;
    private int randomNumber;
    private Vector2 spawnPosition;

    private void Update()
    {
        randomNumber = Random.Range(1, 1000);
        if(randomNumber >= 0 && randomNumber <= 1 && currentCoinOnScreen != maximumCoinPerScreen)
        {
            currentCoinOnScreen++;
            float spawnY = Random.Range
    (Camera.main.ScreenToWorldPoint(new Vector2(0, 0)).y, Camera.main.ScreenToWorldPoint(new Vector2(0, Screen.height)).y);
            float spawnX = Random.Range
                (Camera.main.ScreenToWorldPoint(new Vector2(0, 0)).x, Camera.main.ScreenToWorldPoint(new Vector2(Screen.width, 0)).x);
            spawnPosition = new Vector2(spawnX, spawnY);
            GameObject coinObject = Instantiate(coin, spawnPosition, Quaternion.identity);
        } 
    } 
}

收藏币.cs

public class CollectingCoin : MonoBehaviour
{
    UnityEngine.UI.Text Coins;
    public static int totalCoins = 0;

    private void Start()
    {
        Coins = GameObject.Find("Score").GetComponent<UnityEngine.UI.Text>(); 
    } 
    void OnTriggerEnter2D(Collider2D c2d)
    { 
        if (c2d.CompareTag("Player"))
        { 
            totalCoins++; 
            Destroy(gameObject);
            Coins.text = "COINS: " + totalCoins.ToString();

            // TESTING 
           CoinSpawn test = GameObject.Find("CoinSpawn").GetComponent<CoinSpawn>();
            CoinSpawn test2 = GetComponent<CoinSpawn>();
        }   
    }
}

首先,永远不要使用 GameObject.Find(),它非常昂贵,因为它会 go 通过场景中的所有游戏对象找到 object。 这不是明智的表现。

有很多方法可以做到这一点。 最简单的一个:

  1. 将两个脚本作为组件添加到相同的游戏对象中。

  2. 在 CollectingCoin 脚本中创建一个全局变量 CoinSpawn,然后在其上使用 [serializedFiled] 标签,通过这种方式,您可以在开始播放之前将引用拖放到编辑器中。 你可以按照你想要的方式访问它。

第二种方式:

与第一个相同,但不是serializedFiled,而是使用GetComponent将其缓存在开头。

只需确保将两个脚本都附加到同一个游戏对象。

public class CollectingCoin : MonoBehaviour
{
    UnityEngine.UI.Text Coins;
    public static int totalCoins = 0;
    CoinSpawn coinSpawn;

    private void Start()
    {
        coinSpawn = GetComponent<CoinSpawn>();
        Coins = GameObject.Find("Score").GetComponent<UnityEngine.UI.Text>(); 
    } 

    void OnTriggerEnter2D(Collider2D c2d)
    { 
        if (c2d.CompareTag("Player"))
        { 
            totalCoins++; 
            Destroy(gameObject);
            Coins.text = "COINS: " + totalCoins.ToString();

            // DO Whaterver you want with coinSpawn here 
        
        }   
    }
}
GameObject.Find("CoinSpawn").GetComponent<CoinSpawn>();

搜索名称为GameObject的游戏CoinSpawn 既然你告诉我们这个组件是相当附加到播放器 object 的,所以找不到它是有道理的。

GetComponent<CoinSpawn>();

在您的CollectingCoin所连接的同一个 object 上搜索CoinSpawn组件。 从你的描述来看,显然也不是这样。


既然您说CoinSpawn已附加到播放器,那么您可能更希望从

void OnTriggerEnter2D(Collider2D c2d)
{ 
    if (c2d.CompareTag("Player"))
    { 
        ...

        // rather get the component on the player object you collided with
        CoinSpawn test = c2d.GetComponent<CoinSpawn>();
    }   
}

或者假设您的场景中只有一个CoinSpawn实例,不一定在您的播放器上,您可以使用FindObjectOfType

CoinSpawn test = FindObjectOfType<CoinSpawn>();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM