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

C# 如何通过GetComponent从另一个游戏对象中的另一个脚本访问变量?,c#,reference,unity3d,C#,Reference,Unity3d,我到处找了又找不到这个。我想我只是不知道正确的语法,或者只是不太理解上下文 我有一个BombDrop脚本,它保存一个public int。我用public static编写这个脚本,但是有人说这是一个非常糟糕的编程习惯,我应该学习封装。以下是我写的: 投弹脚本: 公共类炸弹投放:单一行为{ 公共游戏对象爆炸; //玩家可以投下的炸弹 公共整数=1; //每帧调用一次更新 无效更新(){ if(Input.GetKeyDown(KeyCode.Space)){ 如果(最大值>0){ 投弹();

我到处找了又找不到这个。我想我只是不知道正确的语法,或者只是不太理解上下文

我有一个BombDrop脚本,它保存一个public int。我用public static编写这个脚本,但是有人说这是一个非常糟糕的编程习惯,我应该学习封装。以下是我写的:

投弹脚本:


公共类炸弹投放:单一行为{
公共游戏对象爆炸;
//玩家可以投下的炸弹
公共整数=1;
//每帧调用一次更新
无效更新(){
if(Input.GetKeyDown(KeyCode.Space)){
如果(最大值>0){
投弹();
//在当前的炸弹中讲述
Debug.Log(“maxBombs=“+maxBombs”);
}
}
}    
空投炸弹(){
//从当前最大炸弹中移除一个炸弹
maxBombs-=1;
//产卵炸弹预制
矢量2位置=变换位置;
位置x=数学圆(位置x);
位置y=数学圆(位置y);
实例化(bombprefact、pos、四元数.identity);
}
}
所以我希望附加到PrefactGameObject BombPrefact的Bomb脚本访问BombDrop中的maxBombs整数,这样当炸弹被销毁时,它会向BombDrop中的maxBombs添加+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);
公共级炸弹:单一行为{
//炸弹爆炸后的时间
浮动时间=3.0f;
//爆炸预制
公开游戏对象爆炸;
BoxCollider2D对撞机;
私有BombDrop BombDropScript;
无效唤醒(){
BombDropScript=GetComponent();
}
无效开始(){
collider=gameObject.GetComponent();
//几秒钟后调用Explode函数
调用(“爆炸”,时间);
}
无效OnTriggerExit2D(碰撞的R2D其他){
collider.isTrigger=错误;
}
空洞爆炸(){
//从游戏中移除炸弹
摧毁(游戏对象);
//当炸弹被摧毁时,最多增加1
//你可以同时投下的炸弹数量。
BombDropScript.maxBombs+=1;
//产卵爆炸
实例化(爆炸,
变换位置,
四元数(恒等式);
在文档中,它说它应该是

BombDropScript = otherGameObject.GetComponent<BombDrop>();
BombDropScript=otherGameObject.GetComponent();

但这不起作用。也许我只是不理解这里的语法。它应该是说otherGameObject吗?因为那没有任何作用。我仍然会在BombDropScript.maxBombs中得到错误:“对象引用未设置执行对象的实例”。maxBombs在explode()中放下。

在开始时使用它,而不是唤醒,并且不要使用
销毁(游戏对象);
你正在摧毁你的游戏对象,然后你想从中得到一些东西

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);
 }
void Start(){
BombDropScript=gameObject.GetComponent();
collider=gameObject.GetComponent();
//几秒钟后调用Explode函数
调用(“爆炸”,时间);
}
空洞爆炸(){
//..
//..
//终于
摧毁(游戏对象);
}
如果你想访问另一个游戏对象中的脚本,你应该通过inspector分配游戏对象并像那样访问它

 public gameObject another;
void Start () {
     BombDropScript =another.GetComponent<BombDrop> ();
}
公共游戏对象另一个;
无效开始(){
BombDropScript=other.GetComponent();
}

您需要找到包含您计划获取引用的脚本组件的游戏对象。确保游戏对象已在场景中,否则
find
将返回
null

 GameObject g = GameObject.Find("GameObject Name");
然后您可以获取脚本:

 BombDrop bScript = g.GetComponent<BombDrop>();
我刚刚意识到前几天我回答了一个非常类似的问题,请检查这里:


既然我已经回答了你的问题,那么我将进一步阐述你的问题

您的代码所做的是“在我的游戏对象中查找
BombDropScript
,大多数时候脚本不会附加到同一个游戏对象

还可以为
maxBombs
使用setter和getter

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

    public int getMaxBombs()
    {
        return maxBombs;
    }
}
您可以使用以下命令:

entBombDropScript.maxBombs += 1;
之前:

Destroy(gameObject);

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

您可以使用此
BombDropScript=this.GetComponent();
Hmm。仍然是相同的错误。:/Hmm的可能重复的可能重复,否仍然不起作用。可能是爆炸方法的问题?不要使用销毁(gameObject);你正在销毁你的游戏对象,然后你想从itAh得到一些东西,所以它会在调用之前销毁它?但是我如何才能让它在销毁后更改变量。如果我在Explode()中将它设置为destroy,它永远不会销毁。只要让它成为它最不喜欢的东西,就像这个void
Explode(){//../..//..//at last Destroy(gameObject);}
hmm。我现在在Destroy(gameObject)之前爆炸了({BombDropScript.maxBombs}但是Ingame现在它永远不会破坏,它永远不会消失。我仍然在我的BombDropScript上获得空引用。MaxBombins我怀疑它仍然没有从BombDropScript中找到MaxBombles,因此只是停止了。但它确实与公共静态一起工作。这听起来是正确的,但有一个问题。BombPrefare是一个我不想留在其中的预设场景。因为销毁后它会改变我的最大炸弹数。如果我在场景中已经有炸弹,它会弄乱计数器。难道没有办法在不在场景中访问Prefacts脚本吗?有办法让类对象在不在场景中的情况下保持活动状态。例如,静态类,常规C#类,它不是Mono类行为等。然而,你的代码确实意味着
BombDrop
需要出现在场景中,因为
Update
代码会产生炸弹。而且我刚刚意识到你可以编写简单得多的代码。我会
entBombDropScript.maxBombs += 1;
Destroy(gameObject);