[DB-AL]Plusieurs problèmes au niveau du Timer

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Zanaki
Messages : 18
Inscription : 26 Déc 2018 17:30

[DB-AL]Plusieurs problèmes au niveau du Timer

Message par Zanaki » 10 Juin 2019 03:32

Hey bien le Bonjours/Bonsoir.

Je m'en remet à vous encore un fois ! Au niveau du Timer cette fois-ci ! Je suis entrain de créer un petit quelque chose assez sympa à mon gouts.

Le but du jeux et de faire en sorte que le joueur survit à un temps chronométré, il doit esquiver des objets lui tombant dessus. Ça à l'air de fonctionne je dois dire. Au cours du mini, tout en esquivant les objets, il y a d'autre items, qui rapporte des points, se qu'on peut appeler des gem's. Enfin bref...

Je voudrais faire en sorte qu'une fois le compte à rebours arrivé à 0, le joueurs à gagné, il peux passé à la suite. Donc, pour allez à la salle suivant, il devra allez manuellement, la porte survivra une fois le compte à rebours à 0. Donc les objets continuera de tomber, sauf les objets dites (Gem).

Je sais pas comment faire ça... Je pense que j'ai mélange pas mal de tuto sortie tout droit d'internet.

Je voudrais faire en sorte que les Gem's apparaissent entre de secondes par exemple aléatoirement entre 2 et 7 secondes, pour donner plus de dynamisme.

Je vais vous donner les codes que j'ai pour le moment, les codes dont je pense qui faudrait modifier.

ItemsSpawn => Affiches les item aléatoirement, je voudrais qu'ici on puissent grâce au Timer faire apparaitre des gems aléatoirement, par exemple faire en sorte que entre 1 et 5 secondes, une gems apparaisse. Pour pas que le joueur s'y attend.

Code : Tout sélectionner

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

public class ItemsSpawn : MonoBehaviour
{

    #region Variable
    //Public

    //Private
    [SerializeField] private float minX = 0.0f;
    [SerializeField] private float maxX = 0.0f;
    [SerializeField] private int minItemsToSpawn = 1;
    [SerializeField] private int maxItemsToSpawn = 6;
    [SerializeField] private GameObject[] items; // potential array of hazards
    [SerializeField] private float timeBetweenSpawns = 0.0f;
    private bool canSpawn = false;
    private int qteItemsToSpawn = 0; // QTE => Quantité, Quantité de projectile à apparaitre.
    private int itemToSpawn = 0;
    private int itemSpawnCap = 8;
    #endregion

    #region UnityFunction
    // Start is called before the first frame update
    void Start()
    {
        canSpawn = true;     //Temp start
    }

    // Update is called once per frame
    void Update()
    {
        if (canSpawn == true)
        {
            StartCoroutine("GenerateItems");
        }
    }

    private IEnumerator GenerateItems()
    {
        canSpawn = false;
        timeBetweenSpawns = Random.Range(0.5f, 2.0f);          //Testing Values
        qteItemsToSpawn = Random.Range(minItemsToSpawn, maxItemsToSpawn);            //Testing Values

        for (int i = 0; i < qteItemsToSpawn; i++)
        {
            Vector3 spawnPos = new Vector3(Random.Range(minX, maxX), Random.Range(8.5f, 12.0f), 0.0f);   // Generate a spawnPosition the Hazard
            Instantiate(items[itemToSpawn], spawnPos, Quaternion.identity);     // Spawn the Hazard
        }
        yield return new WaitForSeconds(timeBetweenSpawns);
        canSpawn = true;
    }
    #endregion
}
TimedSpawn =>Il gère le temps mais pas en aléatoire, donc si je choisi de faire spown un object à 2.5 secondes, ça sera tout les 2.5 secondes. de Plus, il sera à l'endroit choisi et non aléatoirement comme les projectiles.

Code : Tout sélectionner

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

public class TimedSpawn : MonoBehaviour
{
    #region Variable
    public GameObject spawnee;
    public bool stopSpawning = false;
    public float spawnTime;
    public float spawnDelay;
    #endregion

    #region UnityFunction
    // Start is called before the first frame update
    void Start()
    {
        InvokeRepeating("SpawnObject", spawnTime, spawnDelay);
    }

    public void SpawnObject()
    {
        Instantiate(spawnee, transform.position, transform.rotation);
        if (stopSpawning)
        {
            CancelInvoke("SpawnObject");
        }
    }

    // Update is called once per frame
    void Update()
    {

    }
    #endregion
}
CountDown => Le compte à rebours, plutôt fonctionnel

Code : Tout sélectionner

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

public class Countdownw : MonoBehaviour
{
    #region Variable
    [SerializeField] public float time = 0f;
    #endregion

    #region UnityFunction
    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine (timer ());
        time += 1;
    }

    IEnumerator timer()
    {
        while (time > 0)
        {
            time--;
             yield return new WaitForSeconds (1f);
            GetComponent<Text> ().text = string.Format ("{0:0}:{1:00}", Mathf.Floor (time / 60), time % 60);
        }

        if(time == 0)
        {
            Debug.Log("Boom");
        }
    }

    // Update is called once per frame
    void Update()
    {

    }
    #endregion
}
ProjectilesSpawn => Les projectiles, ici pareil, je voudrais faire en sorte que je pourrais gérer les projectiles via le Timer, augmenter et diminuer la vitesse des projectiles, ainsi qu'un aléatoirement pour Spawn.
Grâce a la variable minProjectilesToSpawn & miXProjectilesToSpawn, je peux afficher un nombre aléatoire à apparaitre à chaque fois. Par exemple 1 & 6 il y aura entre 1 et 6 projectiles qui apparaitrons à chaque fois que sa Spawn.

Code : Tout sélectionner

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

public class ProjectilesSpawn : MonoBehaviour
{

    #region Variable
    //Public

    //Private
    [SerializeField] private float minX = 0.0f;
    [SerializeField] private float maxX = 0.0f;
    [SerializeField] private int minProjectilesToSpawn = 1;
    [SerializeField] private int maxProjectilesToSpawn = 6;
    [SerializeField] private GameObject[] Projectiles; // potential array of hazards
    [SerializeField] private float timeBetweenSpawns = 0.0f;
    private bool canSpawn = false;
    private int qteProjectilesToSpawn = 0; // QTE => Quantité, Quantité de projectile à apparaitre.
    private int projectileToSpawn = 0;
    private int projectileSpawnCap = 8;
    #endregion

    #region UnityFunction
    // Start is called before the first frame update
    void Start()
    {
        canSpawn = true;     //Temp start
    }

    // Update is called once per frame
    void Update()
    {
        if (canSpawn == true)
        {
            StartCoroutine("GenerateProjectiles");
        }
    }

    private IEnumerator GenerateProjectiles()
    {
        canSpawn = false;
        timeBetweenSpawns = Random.Range(0.5f, 2.0f);          //Testing Values
        qteProjectilesToSpawn = Random.Range(minProjectilesToSpawn, maxProjectilesToSpawn);            //Testing Values

        for (int i = 0; i < qteProjectilesToSpawn; i++)
        {
            Vector3 spawnPos = new Vector3(Random.Range(minX, maxX), Random.Range(8.5f, 12.0f), 0.0f);   // Generate a spawnPosition the Hazard
            Instantiate(Projectiles[projectileToSpawn], spawnPos, Quaternion.identity);     // Spawn the Hazard
        }
        yield return new WaitForSeconds(timeBetweenSpawns);
        canSpawn = true;
    }
    #endregion
}
ProjectilesCollision

Code : Tout sélectionner

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

public class ProjectilesCollision : MonoBehaviour
{
    #region Variable
    //Public

    //Private
    [SerializeField] private ParticleSystem projectilesParticlesToon;

    #endregion

    #region UnityFunction
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.tag == "Platform")
        {
            Destroy(Instantiate(projectilesParticlesToon.gameObject, transform.position, projectilesParticlesToon.transform.rotation), projectilesParticlesToon.startLifetime);
            this.gameObject.SetActive(false);
        }

        if (collision.gameObject.tag == "Player")
        {
            SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
        }
    }
    #endregion
}
J'espère que j'ai étais clair sur les problèmes. N'hésitez pas à me posé des questions si ça peut m'aider. Je vous dis un grand merci à vous et à bientôt !
Dernière édition par Zanaki le 10 Juin 2019 11:40, édité 2 fois.

Avatar de l’utilisateur
Max
Messages : 8771
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL]Plusieurs problèmes au niveau du Timer

Message par Max » 10 Juin 2019 11:10

Bonjour,

Tu donnes beaucoup de scripts, très différents, mais finalement on ne sait pas, pour chacun d'entre eux, ce qui te pose vraiment problème en fait (difficile de prendre chaque script et de chercher à comprendre se qui éventuellement te bloque).
Reprend script par script et donne des informations sur ce qui ne va pas.
Par exemple pour le premier, ItemsSpawn, tes "GEMs" n'apparaissent pas aléatoirement dans le temps comme prévue ?
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Zanaki
Messages : 18
Inscription : 26 Déc 2018 17:30

Re: [DB-AL]Plusieurs problèmes au niveau du Timer

Message par Zanaki » 10 Juin 2019 11:43

Hey salut ! J'ai modifier le premier message, j'espère que sa sera mieux. De mon côtés, je continuer à essayer des trucs et à faire des recherches. En espérant que vous pourriez m'apporter votre lumière.

N'hésitez pas, si vous avez du mal à comprendre. Un grand merci à vous.

Avatar de l’utilisateur
Max
Messages : 8771
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL]Plusieurs problèmes au niveau du Timer

Message par Max » 10 Juin 2019 13:29

On va commencer par ItemsSpawn.
J'ai parcouru le script vite fait, il cela semble faire le job. Tu as un soucis avec ?
Idem pour TimedSpawn, par contre évite les Update() vide dans tes codes.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Zanaki
Messages : 18
Inscription : 26 Déc 2018 17:30

Re: [DB-AL]Plusieurs problèmes au niveau du Timer

Message par Zanaki » 10 Juin 2019 14:33

En faites oui, il fonctionne, je voudrais rajouter une fonction de timer.
Par exemple, l'item spawn aléatoirement entre 1 et 10 secondes pour Spawn, puis un système qui fera en sorte que temps que l'objets existe, il y en à pas d'autre qui spawn. Je pense qu'à force de toucher a tout, j'ai empirer la chose, je suis entrain de tout revoir les codes.

Je ne sais pas, si ça peu t'aider, mais voici une petit video pour comprendre se qui pose problème.
https://www.youtube.com/watch?v=7ta8sZkyW4c
Les gems spawn et tombe plutôt vite alors que je voudrais faire en sorte que se sont des points a récupéré.
Les cubes du nom de projectiles qui servirons à tuer le joueur (La boule) Eux aussi tombe plutôt vite.

Avatar de l’utilisateur
Max
Messages : 8771
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL]Plusieurs problèmes au niveau du Timer

Message par Max » 10 Juin 2019 14:52

Zanaki a écrit :
10 Juin 2019 14:33
En faites oui, il fonctionne, je voudrais rajouter une fonction de timer.
Par exemple, l'item spawn aléatoirement entre 1 et 10 secondes pour Spawn, puis un système qui fera en sorte que temps que l'objets existe, il y en à pas d'autre qui spawn. Je pense qu'à force de toucher a tout, j'ai empirer la chose, je suis entrain de tout revoir les codes.
Ça aussi cela fait parti de l'apprentissage. Bien poser ce que l'on souhaite faire, avec les différentes contraintes. Ne pas hésiter coucher cela sur le papier, voir faire des logigrammes ou autres techniques conceptuelles de base.
Zanaki a écrit :
10 Juin 2019 14:33
Les gems spawn et tombe plutôt vite alors que je voudrais faire en sorte que se sont des points a récupéré.
Les cubes du nom de projectiles qui servirons à tuer le joueur (La boule) Eux aussi tombe plutôt vite.
La vitesse de descente n'est pas liée à la vitesse d'apparition. Cela se règle au niveau de tes prefab GEM et leur script de comportement par exemple, pour qu'une fois en scène, ils descendent moins vite.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Zanaki
Messages : 18
Inscription : 26 Déc 2018 17:30

Re: [DB-AL]Plusieurs problèmes au niveau du Timer

Message par Zanaki » 10 Juin 2019 15:44

Ça aussi cela fait parti de l'apprentissage. Bien poser ce que l'on souhaite faire, avec les différentes contraintes. Ne pas hésiter coucher cela sur le papier, voir faire des logigrammes ou autres techniques conceptuelles de base.
Oui, je me doute bien, c'est pas facile d'expliquer se qu'on souhaite faire. Encore moins de résoudre un problème qu'on ne connait pas.

Une petit idée de comment je peux m'y prendre ??

Avatar de l’utilisateur
Max
Messages : 8771
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL]Plusieurs problèmes au niveau du Timer

Message par Max » 10 Juin 2019 17:12

Tu as fait comment par exemple pour ton code ItemsSpawn ?

Donc si je reprend un peu ton explication ci-dessus:
Zanaki a écrit :
10 Juin 2019 14:33
En faites oui, il fonctionne, je voudrais rajouter une fonction de timer.
Par exemple, l'item spawn aléatoirement entre 1 et 10 secondes pour Spawn, puis un système qui fera en sorte que temps que l'objets existe, il y en à pas d'autre qui spawn. Je pense qu'à force de toucher a tout, j'ai empirer la chose, je suis entrain de tout revoir les codes.
Visiblement tu sais comment faire apparaitre un certains nombre de GEM de façon aléatoire dans le temps. Dans ce cas, dans ton gestionnaire ItemsSpawn, tu peux initialiser un compteur avec le nombre de GEM créés, puis à chaque destruction de GEM, le compteur est décrémenté. Quand le compteur arrive à zéro, tu autorises alors la création d'une nouvelle série de GEM.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Zanaki
Messages : 18
Inscription : 26 Déc 2018 17:30

Re: [DB-AL]Plusieurs problèmes au niveau du Timer

Message par Zanaki » 10 Juin 2019 19:06

Max a écrit :
10 Juin 2019 17:12
Tu as fait comment par exemple pour ton code ItemsSpawn ?
Je t'es envoyer le scriptes. Sinon, je comprend pas la question de comment j'ai fais.

En faites non, c'est ça le problème, je n'arrive pas à faire apparaitre les gem aléatoire dans le temps.
je pense que l'idée des GEM et un mauvais exemple. Prenons par exemple, une système de coeur, pour nous redonner une chance si ont se fait toucher.

Dans la video que j'ai envoyer, on vois clairement que le joueur survivra quoi qu'il arrive grâce au coeur qui viendra à lui.
Maintenant si je met un coeur à 30 secondes, toutes les 30 secondes, le coeur arrivera, mais c'est vite prévisible à la longue et c'est pas l'objectif.

Du coup, si on prend toujours le système de coeur, mais qu'on génère un Random au niveau du Timer, ça pourrait donner un peu plus de dynamisme.

Faire Spown un coeur toutes les 20 - 40 secondes. sur des stage de 1 minutes, changer le Timer, si les stage dure plus longtemps pour rajouter de la difficulté.

Faire Spawn des GEM toutes les 3 - 9 secondes. Etc...

En faites, j'ai énormément d'idées, mais il met impossible de tous les mettre en place, alors je préfère venir vous demander votre aide au lieu de m'arracher les cheveux. Je sais que c'est possible, et que ça reste accessible pour un débutant.

Je suis désolé de pas être aussi précis qu'il le faudrait et j'espère que grâce à vous, je pourrais avancer. J'ai l'impression de faire du surplace... Merci à toi du temps que tu nous accord.

Avatar de l’utilisateur
Max
Messages : 8771
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL]Plusieurs problèmes au niveau du Timer

Message par Max » 11 Juin 2019 08:31

Zanaki a écrit :
10 Juin 2019 19:06
Max a écrit :
10 Juin 2019 17:12
Tu as fait comment par exemple pour ton code ItemsSpawn ?
Je t'es envoyer le scriptes. Sinon, je comprend pas la question de comment j'ai fais.
Ben tu dis ceci:
Zanaki a écrit :
10 Juin 2019 19:06
En faites non, c'est ça le problème, je n'arrive pas à faire apparaitre les gem aléatoire dans le temps....
...Faire Spawn des GEM toutes les 3 - 9 secondes. Etc...
alors que c'est ce que fait ce script (ItemsSpawn), il fait bien apparaitre quelques GameObjects (dont le nombre est compris entre minItemsToSpawn et maxItemsToSpawn) de manière aléatoire avec un timing compris entre 0.5 et 2 secondes. Donc niveau principe, tu en maitrises une partie visiblement.
Zanaki a écrit :
10 Juin 2019 19:06
Du coup, si on prend toujours le système de coeur, mais qu'on génère un Random au niveau du Timer, ça pourrait donner un peu plus de dynamisme.
Oui, ça j'ai bien compris l'objectif. Mais pour rejoindre ce que je dis plus haut, pourquoi ne partir sur ce que tu as déjà écris dans tes script précédents, c'est à dire faire un Random pour la durée (genre Random.value*30.0f+30.0f pour avoir une valeur comprise entre 30 seconde et 60 seconde), et utiliser une coroutine pour déclencher une action (apparition d'un coeur par exemple) au bout de cette durée.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Répondre

Revenir vers « (C#) CSharp »