如何通过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 (); }