-1
votes

Comment collecter des pièces dans Unity 3D qui apparaissent aléatoirement dans la scène, détruire l'objet de jeu après avoir été collecté et afficher le score sur la toile?

J'essaie que mon personnage de jeu collecte des pièces qui apparaissent aléatoirement dans la scène, à travers cinq voies et que le score de chaque pièce obtenue apparaisse à l'écran. Tout fonctionne bien sauf pour une chose, après les avoir collectées, aucune des pièces n'est détruite de la scène mais le système de score semble bien fonctionner, je ne sais vraiment pas ce que je fais de mal.

L'objet de jeu de la pièce est un préfabriqué et est chargé par un autre objet de jeu principal de la scène. Il existe deux scripts C #, l'un pour le script de texte de score et l'autre pour le script de pièces. J'apprécierais si quelqu'un pouvait m'aider s'il vous plaît, merci!

Voici le code du script Coin:

public class ScoreTextScript : MonoBehaviour {

    Text text;

    public static int coinAmount;

    void Start()
    {
        text = GetComponent<Text>();
    }

    void Update()
    {
        text.text = coinAmount.ToString();
    }
}

Voici le code du script de texte de score:

public class CoinScript : MonoBehaviour {

    public GameObject PickUp;

    void OnTriggerEnter(Collider col)
    {
        PickUp = GameObject.FindGameObjectWithTag("PickUp");

        if (gameObject != null)
        {
            // Do something  
            Destroy(gameObject);
            ScoreTextScript.coinAmount++;
        }  
    }
}


1 commentaires

à quoi votre CoinScript est-il attaché? comme la moitié de ce code semble redondant, comme trouver 1 objet avec un ramassage de balises - à quoi ça sert? gameObject ne sera nul sauf s'il est déjà détruit. donc ... si ce script est sur une pièce de monnaie, la pièce sera détruite, mais peut-être pas immédiatement ...


3 Réponses :


0
votes

Bien que votre question soit assez difficile à lire, je peux proposer la solution suivante pour la montrer à l'interface utilisateur:

1) créer un objet et un script de canal d'événement

Les canaux d'événements sont des observateurs qui informeront une classe lorsqu'un événement se produit

utilisons le code de mon équipe comme exemple, utilisez-le comme source d'inspiration pour vos pièces

score++    
scoreUI.text = score.ToString()

Le gestionnaire d'événements est utilisé sur les classes où ils "s'abonnent" à l'événement et attendent un signal. La méthode Publish est destinée à ceux qui informeront les classes souscrites de l'événement.

N'oubliez pas de l'ajouter à un GameObject (de préférence accessible à tous les autres scripts gameobject)

Maintenant dans la classe où il détecte que le joueur entre en collision avec une pièce, instanciez le EventChannel en trouvant son gameObject et appelez la méthode publish () juste après la collision.

Sur la classe UI, ajoutez le code suivant (n'oubliez pas de rechercher également le canal d'événement dans cette classe):

 private void OnEnable()
        {
            playerGainedScoreEventChannel.OnCoinGained += YourMethodToUpdateScore;
        }

et dans la méthode de mise à jour du score, vous pouvez faire quelque chose comme:

namespace Game
{
    [Findable(R.S.GameObject.GameHasEndedFormallyEventChannel)]
    public class GameHasEndedFormallyEventChannel : EventChannel
    {
        public event EventHandler OnGameEnded;

        public override void Publish()
        {
            if (OnGameEnded != null)
            {
                OnGameEnded();
            } 
        }
    }
}

J'espère que ça aide


0 commentaires

0
votes

Comme Adrian l'a dit malgré que si codeamount fonctionne, l'appel Destroy devrait également fonctionner. Etes-vous sûr que dans votre préfabriqué, le gameObject que vous êtes en train de détruire (le gameObject où le script est placé) est le même que la pièce entière?

Voici un exemple de ce code peu nettoyé:

public class CoinScript : MonoBehaviour {

    //You don't use it, at least at OntriggerEnter, so you might not need it
    //public GameObject PickUp; 

    void OnTriggerEnter(Collider col)

        //You don't use this at this method PickUp at this method
        //PickUp = GameObject.FindGameObjectWithTag("PickUp");

        //gameobject is never null if it's not destroyed, u dont need this if.
        //if (gameObject != null)

        //if you want to be sure only PickUp gameObject is able to collect the coin you can do this
        if(col.gameObject.tag == "PickUp")
        {
            // Do something  
            ScoreTextScript.coinAmount++;
            Destroy(gameObject);
        }  
    }
}


0 commentaires

0
votes

Voici les scripts utilisant C #

Script de pièces

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class scorescript : MonoBehaviour {
    public static int scorevalue = 0;
    Text score1;
    // Use this for initialization
    void Start () {
        score1 = GetComponent<Text>();
    }
// Update is called once per frame
void Update () {
        score1.text = "score : " + scorevalue;
    }
}

Script de score

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Coins : MonoBehaviour {

    void Start () {}
    private void OnTriggerEnter2D(Collider2D other)
    {
        Debug.Log("Triggered");
        Destroy(gameObject);
        scorescript.scorevalue += 3;
    }
    // Update is called once per frame
    void Update () {
}
}


0 commentaires