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

本文关键字:另一个 脚本 访问 变量 游戏 何通过 GetComponent 对象 | 更新日期: 2023-09-27 18:27:40

我到处找了找,就是找不到。我想我只是不知道正确的语法,或者只是没有完全理解上下文。

我有一个BombDrop脚本,它包含一个公共int。我用它来处理公共静态,但有人说这是一个非常糟糕的编程习惯,我应该学习封装。这是我写的:

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

因此,我希望附加到预制名称对象Bombpremab的Bomb脚本访问BombDrop中的maxBombs整数,这样当炸弹被摧毁时,它会在BombDrop中的最大炸弹数上加+1。

这是需要参考的炸弹脚本。

 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吗?因为那没有任何作用。我仍然得到错误:"Object reference not set do an instance of a Object"在我的BombDropScript.maxBombs down in the explode()

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

您需要找到包含您计划获得引用的脚本组件的GameObject。确保GameObject已经在场景中,否则Find将返回null

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

然后你可以获取脚本:

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

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

 bScript.foo();

我刚刚意识到前几天我回答了一个非常相似的问题,请查看此处:Don';我不知道如何对付敌人;s健康


由于我已经回答了你的问题,我将进一步阐述一下

您的代码正在执行的操作是:;在我的游戏对象中查找BombDropScript,大多数时候脚本不会附加到同一个游戏对象。

还可以为maxBombs使用setter和getter。

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

在开始时使用它而不是唤醒,不要使用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);
 }

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

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

可以使用这个:

entBombDropScript.maxBombs += 1;

之前:

Destroy(gameObject);

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