![](/img/trans.png)
[英]How to reference a script from another script to access multiple variables in unity c#
[英]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。 这不是明智的表现。
有很多方法可以做到这一点。 最简单的一个:
将两个脚本作为组件添加到相同的游戏对象中。
在 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.