我已经四处寻找,但我无法让它发挥作用。我想我不知道正确的语法,或者只是没有完全理解上下文。
我有一个包含public 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?因为没有做任何事情。我仍然得到错误:&#34;未设置对象引用做一个对象的实例&#34;在我的BombDropScript.maxBombs下面的explode()
答案 0 :(得分:21)
您需要找到包含您计划获取引用的脚本Component的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;
}
}
答案 1 :(得分:2)
在开始时使用它而不是清醒,不要使用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 :(得分:1)
可以使用这个:
entBombDropScript.maxBombs += 1;
之前:
Destroy(gameObject);
我只想说你可以在游戏对象maxBombs
之前增加Destroying
的值。这是必要的,因为如果您先销毁游戏对象然后增加值,那么那时您的脚本 BombDropScript
的引用将消失,您无法修改其中的值。