我已经搜索过,我只是不能让这个工作.我想我只是不知道正确的语法,或者只是不了解上下文.
我有一个持有公共int的BombDrop脚本.我有这个工作与公共静态,但有人说,这是一个非常糟糕的编程习惯,我应该学习封装.这是我写的:
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); } }
所以我想要附加到preabgameobject Bombprefab的Bomb脚本来访问BombDrop中的maxBombs整数,这样当炸弹被破坏时,它会在BombDrop中添加一个maxBombs.
这是需要引用的炸弹脚本.
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?因为没有做任何事情.我仍然得到错误:“对象引用未设置一个对象的实例”在我的BombDropScript.maxBombs下面的explode()
解决方法
您需要找到包含您计划获得引用的脚本组件的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; } }