私は周りを検索しましたが、これを機能させることができません。適切な構文を知らないか、コンテキストをまったく把握していないと思います。
パブリック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で「オブジェクト参照が設定されていないため、オブジェクトのインスタンスが設定されていません」というエラーが表示されます。
参照を取得する予定のスクリプトコンポーネントを含むGameObjectを見つける必要があります。 GameObjectがすでにシーンに存在することを確認してください。そうでない場合、Find
はnull
を返します。
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;
}
}
起動中に起動する代わりに使用し、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> ();
}