我已经搜寻了一下,但无法正常工作。我想我只是不知道正确的语法,或者只是不太了解上下文。
我有一个包含公共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添加+一个。
这是需要参考的炸弹脚本。
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。
Find
null
GameObject g = GameObject.Find("GameObject Name");
然后,您可以获取脚本:
BombDrop bScript = g.GetComponent<BombDrop>();
然后,您可以访问脚本的变量和函数。
bScript.foo();
我刚刚意识到,前几天我回答了一个非常类似的问题,请在此处查看: 不知道如何获得敌人的健康
由于我已经回答了您的问题,因此我将对其进行扩展。
您的代码正在执行的操作是说:“在BombDropScript大多数情况下,脚本不会附加到相同的GameObject中。
BombDropScript
也可以使用setter和getter maxBombs。
maxBombs
public class BombDrop : MonoBehaviour { public void setMaxBombs(int amount) { maxBombs += amount; } public int getMaxBoms() { return maxBombs; } }