J'ai cherché et je n'arrive pas à faire fonctionner ça. Je pense que je ne connais tout simplement pas la syntaxe appropriée, ou ne saisis pas tout à fait le contexte.
J'ai un script BombDrop qui contient un int public. Je l'ai fait fonctionner avec de la statique publique, mais quelqu'un a dit que c'était une très mauvaise habitude de programmation et que je devais apprendre l'encapsulation. Voici ce que j'ai écrit:
script 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);
}
}
Je veux donc que le script Bomb attaché au prefabgameobject Bombprefab accède à l'entier maxBombs dans BombDrop, de sorte que lorsque la bombe est détruite, il ajoute +1 à maxBombs dans BombDrop.
Et c'est le script Bomb qui a besoin de la référence.
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);
Dans la documentation, il est dit que cela devrait être quelque chose comme
BombDropScript = otherGameObject.GetComponent<BombDrop>();
Mais ça ne marche pas. Peut-être que je ne comprends tout simplement pas la syntaxe ici. Est-ce supposé dire otherGameObject? Parce que ça ne fait rien. J'obtiens toujours l'erreur: "La référence d'objet non définie fait une instance d'un objet" sur mes BombDropScript.maxBombs dans l'explode ()
Vous devez trouver le GameObject qui contient le composant de script auquel vous prévoyez d'obtenir une référence. Assurez-vous que le GameObject est déjà dans la scène, ou Find
renverra null
.
GameObject g = GameObject.Find("GameObject Name");
Ensuite, vous pouvez saisir le script:
BombDrop bScript = g.GetComponent<BombDrop>();
Ensuite, vous pouvez accéder aux variables et fonctions du script.
bScript.foo();
Je viens de réaliser que j'ai répondu à une question très similaire l'autre jour, vérifiez ici: Je ne sais pas comment obtenir la santé de l'ennemi
Je vais développer un peu votre question car j'ai déjà répondu.
Ce que fait votre code, c'est "Cherchez dans mon GameObject un BombDropScript
, la plupart du temps le script ne sera pas attaché au même GameObject.
Utilisez également un setter et un getter pour maxBombs
.
public class BombDrop : MonoBehaviour
{
public void setMaxBombs(int amount)
{
maxBombs += amount;
}
public int getMaxBoms()
{
return maxBombs;
}
}
utilisez-le au début au lieu de réveillé et n'utilisez pas Destroy(gameObject);
vous détruisez votre objet de jeu alors vous en voulez quelque chose
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);
}
si vous voulez accéder à un script dans un autre gameObject, vous devez assigner l'objet de jeu via l'inspecteur et y accéder comme ça
public gameObject another;
void Start () {
BombDropScript =another.GetComponent<BombDrop> ();
}