Как получить доступ к переменной из другого script в другой игровой объект через GetComponent?
Я искал, и я просто не могу заставить это работать. Я думаю, что просто не знаю правильного синтаксиса или просто не понимаю контекст.
У меня есть BombDrop script, который содержит общедоступный int. Я получил это, чтобы работать с публичной статикой, но Кто-то сказал, что это очень плохая привычка программирования, и я должен научиться инкапсуляции. Вот что я написал:
BombDrop script:
<!-- 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);
}
}
Итак, я хочу, чтобы Bomb script, прикрепленный к prefabgameobject Bombprefab для доступа к целому числу maxBombs в BombDrop, так что, когда бомба уничтожена, она добавляет +1 к maxBombs в BombDrop.
И это Bomb script, которому нужна ссылка.
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()
Ответы
Ответ 1
Вам нужно найти GameObject, содержащий компонент script, на который вы хотите получить ссылку. Убедитесь, что GameObject уже находится в сцене, или Find
вернет null
.
GameObject g = GameObject.Find("GameObject Name");
Затем вы можете захватить script:
BombDrop bScript = g.GetComponent<BombDrop>();
Затем вы можете получить доступ к переменным и функциям Script.
bScript.foo();
Я только понял, что на тот же день я ответил на очень похожий вопрос, проверьте здесь:
Не знаю, как получить здоровье врага
Я немного расскажу о вашем вопросе, так как я уже ответил на него.
Что делает ваш код: "Посмотрите в мой GameObject для BombDropScript
, большую часть времени script не будет прикреплен к тому же GameObject.
Также используйте setter и getter для maxBombs
.
public class BombDrop : MonoBehaviour
{
public void setMaxBombs(int amount)
{
maxBombs += amount;
}
public int getMaxBoms()
{
return maxBombs;
}
}
Ответ 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);
}
если вы хотите получить доступ к script в другом объекте gameObject, вы должны назначить игровой объект через инспектора и получить доступ к нему как таковой
public gameObject another;
void Start () {
BombDropScript =another.GetComponent<BombDrop> ();
}