J'ai du mal à engendrer des ennemis dans l'unité 2d. Les ennemis se clonent trop rapidement et cela traîne. Voici mon code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemySpawner : MonoBehaviour
{
public Transform[] spawnPoints;
public GameObject enemy;
public float spawnTime = 5f;
public float spawnDelay = 3f;
// Use this for initialization
void Start () {
InvokeRepeating ("addEnemy", spawnDelay, spawnTime);
}
void addEnemy() {
int spawnPointIndex = Random.Range(0, spawnPoints.Length);
Instantiate (enemy, spawnPoints[spawnPointIndex].position,
spawnPoints[spawnPointIndex].rotation);
}
}
3 Réponses :
Je suppose qu'ils apparaissent plus que toutes les 3 secondes? Avez-vous plusieurs scripts "EnemySpawner" attachés aux objets de la scène?
modifiez les sons comme si vous aviez un script «EnemySpawner» dans votre préfabriqué, supprimez-le du préfabriqué et placez-le sur un GameObject distinct dans votre scène.
Non, je ne l'ai que sur mon player gameObject. Si je le mets sur mon gameObject ennemi, les ennemis ne se reproduiront tout simplement pas.
Il est étrange que les clones d'objet de jeu aient (Clone) (Clone) écrit dessus.
J'ai mis à jour ma réponse, faites-moi savoir si cela résout votre problème
Oh, je suis en train de créer un jeu 2D où je dois engendrer des ennemis et voici le code que j'ai utilisé, édité pour vous bien sûr:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemySpawner : MonoBehaviour
{
public GameObject enemyPrefab;
public float interval = 100;
private float counter = 0;
// Update is called once per frame
void FixedUpdate()
{
counter += 1;
if(counter >= interval){
counter = 0;
Instantiate(enemyPrefab, transform.position,transform.rotation);
}
}
}
Créez simplement un nouvel objet de jeu, mettez ce script, ajoutez le préfabriqué ennemi dans la variable Game Object et vous êtes prêt. Vous pouvez modifier l'intervalle entre chaque ennemi avec la variable d'intervalle. Bonne chance avec votre projet :)
Vous ne devriez pas faire cela dans FixedUpdate mais plutôt utiliser un minuteur dans Update
@derHugo serait utile pour préciser pourquoi - pourquoi devriez-vous utiliser un minuteur dans Update au lieu d'utiliser un compteur dans FixedUpdate ?
J'utilise FixedUpdate car le timing est Fixed? Haha
car vous ne voulez certainement pas vous fier à la valeur 100 ... 100 quoi? ^^ Si vous le faites dans Update , vous fournissez une valeur en secondes indépendamment de la façon dont la physique est configurée pour l'intervalle de mises à jour de physique fixe. FixedUpdate ne doit être utilisé que pour tout ce qui concerne la physique
Eh bien, c'est comme ça que je le ferais. C'est à peu près la préférence. Je l'aime de cette façon, c'est pourquoi je l'ai montré et comme il semble que ma réponse a résolu le problème d'OP, alors qu'est-ce qui est mauvais à ce sujet? S'ils ont besoin d'être plus précis en quelques secondes, ils pourraient tout aussi bien le faire dans Update, mais je doute fortement qu'ils en aient besoin en quelques secondes parfaitement chronométrées.
@derHugo eh bien, c'est là où je ne suis pas d'accord - 100 dans ce cas signifie 100 étapes de mise à jour fixes - engendrer des ennemis à l'aide d'un chronomètre interrompt le jeu si le framerate (à moins que vous ne parliez du temps delta). Le jeu engendrera des ennemis plus fréquemment qu'il ne le devrait. Fixedupdate est garanti pour être appelé pour faire avancer le pas de temps physique (qui est une période fixe par trame physique et est configurable). Je choisirais FixedUpdate car il est en phase avec la physique réelle, ce qui garantit de générer des ennemis au bon moment, même si votre jeu se débat sur une machine faible.
Et d'ailleurs je l'ai fait;) stackoverflow.com/a/62894752/7111561
@Charleh bien sûr, je veux dire en utilisant le temps delta qui fait exactement la même chose, mais vous configureriez directement les secondes en temps réel souhaitées au lieu d'avoir à calculer x = real-time-seconds / physicsUpdateInterval ...
Je ne dis pas que le vôtre est faux ... au début, je voulais en fait vous dire que vous devriez plutôt le faire dans Update car l'UX est bien meilleur / plus attrayant en le faisant .. mais comme vous avez continué à résister j'ai décidé d'ajouter une réponse afin de guider les futurs lecteurs à tomber dans le même piège ... appeler des saccadés qui tentent d'améliorer un fil ou de poster des solutions différentes n'est pas vraiment professionnel
@derHugo J'ai dit que j'avais utilisé FixedUpdate parce qu'il utilisait un pas de temps fixe, donc je n'aurais pas à utiliser fixedDeltaTime ou deltaTime. Je n'ai pas commencé la discussion, je n'ai pas posté ma réponse pour entrer dans une dispute. Le fait que j'ai répondu à votre question et que vous ayez continué en disant "vous ne voulez pas vous fier à la valeur 100 ... 100 quoi?" C'est ce que j'ai comme dans la plupart des programmeurs "professionnels", c'est qu'ils trouvent toujours quelque chose qui ne va pas dans votre code ou essaient de le rendre plus "professionnel". Spawn enemes dans un intervalle défini.
@derHugo passe de 0 à l'intervalle défini. Je n'ai pas besoin de savoir ce que c'est en quelques secondes et j'ai nouveau à savoir, et je ne le veux pas en quelques secondes. C'est un exemple simple de géniteur pour les ennemis, ou si vous fabriquez une arme à feu, tirez des balles et / ou créez une minuterie de rechargement ou une minuterie qui s'arrête pendant un intervalle défini. Je n'en ai pas besoin en quelques secondes. Si je l'avais fait, j'aurais posté la réponse pour la minuterie qui utilise des secondes. De plus, je n'ai pas vu la personne poser la question en ayant besoin en quelques secondes. Ils voulaient juste créer un géniteur qui fonctionne, ils peuvent définir i terval pour le frai des ennemis. Notant compliqué. :RÉ
Je n'ai pas besoin de savoir ce que c'est en quelques secondes et j'ai du nouveau à savoir, et je ne le veux pas en quelques secondes bien quand je conçois et implémente un jeu, je préfère définir mes intervalles en secondes et non un certain nombre magique qui finalement "fonctionne" .. c'est ce que je veux dire;)
@derHugo Je dirais qu'un nombre magique est sans utiliser de variable. Comme si je n'utilisais que 100 au lieu de l'intervalle variable.
@xXrandomryzeXx un nombre magique est une valeur où vous ne savez pas exactement pourquoi vous devez définir exactement cette valeur pour que cela fonctionne. 100 semble juste aléatoire .. pourquoi pas 5 ou 250 ? Comme dit à chaque fois, vous devez recalculer la valeur a) pour trouver l'intervalle souhaité en temps réel et b) Vous devez également mettre à jour chaque instance si vous modifiez l'intervalle de mise à jour physique à quelque chose de différent de la valeur par défaut de 0,02 seconde
@derHugo eh bien, j'évite généralement d'utiliser un certain nombre qui n'est pas une variable de tri parce que c'est pour moi un nombre magique. Je suppose que ne pas savoir ce que vous devez définir, c'est aussi un nombre magique
Comme dans la réponse acceptée , utilisez FixedUpdate pour cela! Il utilise 100 étapes de mise à jour fixes ... mais qui veut calculer combien de temps cela prend réellement?
Par défaut, l'étape de mise à jour fixe est de 0.02s donc 100 signifie 2 secondes en temps réel - mais que se passe-t-il si vous modifiez l'étape de mise à jour fixe pour une raison quelconque?
Je préfère le faire en utilisant une simple minuterie dans Mise à jour :
public class EnemySpawner : MonoBehaviour
{
public GameObject enemyPrefab;
// In seconds
[SerializeField]private float interval = 2f;
private float timer = 0f;
// Update is called once per frame
void Update()
{
timer += Time.deltaTime;
if(timer >= interval){
timer = 0f;
Instantiate(enemyPrefab, transform.position,transform.rotation);
}
}
}
En fait, ce que vous aviez devrait également fonctionner! Cela dépend bien sûr aussi des valeurs que vous avez définies via l'inspecteur.
MAIS Ce que je peux voir sur l'image que vous avez publiée est: Dans ennemi vous avez référencé l'objet lui-même!
Par conséquent, ils sont appelés Enemy [Clone] puis Enemy [Clone] [Clone] puis Enemy [Clone] [Clone] [Clone ] etc donc
Je ne sais pas si c'était prévu, mais je préférerais placer le script spawner sur un seul objet de la scène et plutôt faire référence à un préfabriqué sans script de spawner supplémentaire.