如何通过GetComponent从另一个游戏对象中的另一个脚本访问变量?

我四处寻找,我无法让它发挥作用。 我想我只是不知道正确的语法,或者只是不完全掌握上下文。

我有一个BombDrop脚本,它包含一个public int。 我使用public static工作,但有人说这是一个非常糟糕的编程习惯,我应该学习封装。 这是我写的:

BombDrop脚本:

 public class BombDrop : MonoBehaviour { public GameObject BombPrefab; //Bombs that the player can drop public int maxBombs = 1; // Update is called once per frame void Update () { if (Input.GetKeyDown(KeyCode.Space)){ if(maxBombs > 0){ DropBomb(); //telling in console current bombs Debug.Log("maxBombs = " + maxBombs); } } } void DropBomb(){ // remove one bomb from the current maxBombs maxBombs -= 1; // spawn bomb prefab Vector2 pos = transform.position; pos.x = Mathf.Round(pos.x); pos.y = Mathf.Round(pos.y); Instantiate(BombPrefab, pos, Quaternion.identity); } } 

因此,我希望附加到prefabgameobject Bombprefab的Bomb脚本访问BombDrop中的maxBombs整数,这样当炸弹被销毁时,它会在BombDrop中向maxBombs添加+ 1。

这是需要参考的Bomb脚本。

  public class Bomb : MonoBehaviour { // Time after which the bomb explodes float time = 3.0f; // Explosion Prefab public GameObject explosion; BoxCollider2D collider; private BombDrop BombDropScript; void Awake (){ BombDropScript = GetComponent (); } void Start () { collider = gameObject.GetComponent (); // Call the Explode function after a few seconds Invoke("Explode", time); } void OnTriggerExit2D(Collider2D other){ collider.isTrigger = false; } void Explode() { // Remove Bomb from game Destroy(gameObject); // When bomb is destroyed add 1 to the max // number of bombs you can drop simultaneously . BombDropScript.maxBombs += 1; // Spawn Explosion Instantiate(explosion, transform.position, Quaternion.identity); 

在文档中它说它应该是这样的

 BombDropScript = otherGameObject.GetComponent(); 

但这不起作用。 也许我只是不明白这里的语法。 是否可以说是otherGameObject? 因为没有做任何事情。 我仍然在爆炸()中的BombDropScript.maxBombs上得到错误:“对象引用未设置对象的实例”

您需要找到包含您计划获取引用的脚本Component的GameObject。 确保GameObject已经在场景中,或者Find将返回null

  GameObject g = GameObject.Find("GameObject Name"); 

然后你可以抓住脚本:

  BombDrop bScript = g.GetComponent(); 

然后,您可以访问脚本的变量和函数。

  bScript.foo(); 

我才意识到前几天我回答了一个非常相似的问题,请点击这里: 不知道如何让敌人的健康


因为我已经回答了问题,所以我会对你的问题进行一些扩展。

你的代码正在做的是“在我的BombDropScript查找BombDropScript ,大多数情况下脚本不会附加到同一个GameObject。

同时使用maxBombs的setter和getter。

 public class BombDrop : MonoBehaviour { public void setMaxBombs(int amount) { maxBombs += amount; } public int getMaxBoms() { return maxBombs; } } 

在start中使用它而不是唤醒并且不要使用Destroy(gameObject); 你正在摧毁你的游戏对象然后你需要它的东西

 void Start () { BombDropScript =gameObject.GetComponent (); collider = gameObject.GetComponent (); // Call the Explode function after a few seconds Invoke("Explode", time); } void Explode() { //.. //.. //at last Destroy(gameObject); } 

如果你想访问另一个gameObject中的脚本,你应该通过检查器分配游戏对象并像这样访问它

  public gameObject another; void Start () { BombDropScript =another.GetComponent (); }