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

时间:2014-10-24 15:51:13

标签: c# reference unity3d

我已经四处寻找,但我无法让它发挥作用。我想我不知道正确的语法,或者只是没有完全理解上下文。

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

BombDrop脚本:

 <!-- language: c# -->

 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<BombDrop> ();
 }

 void Start () {

     collider = gameObject.GetComponent<BoxCollider2D> ();

     // 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<BombDrop>();

但这并不奏效。也许我只是不理解这里的语法。是否可以说是otherGameObject?因为没有做任何事情。我仍然得到错误:&#34;未设置对象引用做一个对象的实例&#34;在我的BombDropScript.maxBombs下面的explode()

3 个答案:

答案 0 :(得分:21)

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

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

然后你可以抓住剧本:

 BombDrop bScript = g.GetComponent<BombDrop>();

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

 bScript.foo();

我刚才意识到我前几天回答了一个非常类似的问题,请点击此处: Don't know how to get enemy's health


我已经回答了一些问题,因为我已经回答了问题。

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

还为maxBombs使用setter和getter。

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

    public int getMaxBoms()
    {
        return maxBombs;
    }
}

答案 1 :(得分:2)

在开始时使用它而不是清醒,不要使用Destroy(gameObject);你正在摧毁你的游戏对象然后你需要它的东西

void Start () {
     BombDropScript =gameObject.GetComponent<BombDrop> ();
     collider = gameObject.GetComponent<BoxCollider2D> ();

     // 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<BombDrop> ();
}

答案 2 :(得分:1)

可以使用这个:

entBombDropScript.maxBombs += 1;

之前:

Destroy(gameObject);

我只想说你可以在游戏对象maxBombs之前增加Destroying的值。这是必要的,因为如果您先销毁游戏对象然后增加值,那么那时您的脚本 BombDropScript 的引用将消失,您无法修改其中的值。