web-dev-qa-db-ja.com

GetComponentを介して別のゲームオブジェクトの別のスクリプトから変数にアクセスする方法は?

私は周りを検索しましたが、これを機能させることができません。適切な構文を知らないか、コンテキストをまったく把握していないと思います。

パブリック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と言うことを想定していますか?何もしない原因。 explode()のBombDropScript.maxBombsで「オブジェクト参照が設定されていないため、オブジェクトのインスタンスが設定されていません」というエラーが表示されます。

13
DoubleCode

参照を取得する予定のスクリプトコンポーネントを含むGameObjectを見つける必要があります。 GameObjectがすでにシーンに存在することを確認してください。そうでない場合、Findnullを返します。

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

次に、スクリプトを取得できます。

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

その後、スクリプトの変数と関数にアクセスできます。

 bScript.foo();

先日、非常によく似た質問に答えたことに気付いたので、こちらをチェックしてください。 敵の体力を得る方法がわからない


私はすでに答えたので、あなたの質問を少し拡大します。

コードが行っていることは、「GameObject内でBombDropScriptを探してください。ほとんどの場合、スクリプトは同じGameObjectにアタッチされません。

maxBombsにもセッターとゲッターを使用します。

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

    public int getMaxBoms()
    {
        return maxBombs;
    }
}
23
FunctionR

起動中に起動する代わりに使用し、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
Milad Qasemi