Sistema de probabilidade de Spawn para Waves
3 participantes
Página 1 de 1
Sistema de probabilidade de Spawn para Waves
Opa, estou desenvolvendo um jogo com sistema de Waves, e queria implementar um sistema de Probabilidade de Spawn de certo inimigo ou Power up, tenho uma ideia mais ou menos de como pode ser feito mas estou tendo problemas e não estou conseguindo, espero que alguém disposto possa me ajudar nesse meu problema;
Código do sistema de Waves:
Código do sistema de Waves:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Wave_spawn : MonoBehaviour {
public enum SpawnState { SPAWNING, WAITING, COUNTING };
[System.Serializable]
public class Enemy
{
public Transform enemyPrefab;
[Range(0,100)]
public float probability = 0;
}
[System.Serializable]
public class Wave {
public string name;
public Enemy[] enemies;
public int count;
public float rate;
}
public Wave[] waves;
private int nextWave = 0;
public Transform[] spawnPoints;
public float timeBetweenWaves = 5f;
private float waveCountdown;
private float searchCountdown = 1f;
public SpawnState state = SpawnState.COUNTING;
void Start() {
waveCountdown = timeBetweenWaves;
}
void Update() {
if (state == SpawnState.WAITING) {
if (!EnemyIsAlive ()) {
WaveCompleted ();
} else {
return;
}
}
if (waveCountdown <= 0) {
if (state != SpawnState.SPAWNING) {
StartCoroutine (SpawnWave(waves[nextWave]));
}
} else {
waveCountdown -= Time.deltaTime;
}
}
void WaveCompleted() {
state = SpawnState.COUNTING;
waveCountdown = timeBetweenWaves;
if (nextWave + 1 > waves.Length - 1) {
nextWave = 0;
} else {
nextWave++;
}
}
bool EnemyIsAlive() {
searchCountdown -= Time.deltaTime;
if(searchCountdown <= 0f) {
searchCountdown = 1f;
if (GameObject.FindGameObjectWithTag ("Enemy") == null) {
return false;
}
}
return true;
}
IEnumerator SpawnWave (Wave _wave) {
state = SpawnState.SPAWNING;
for (int i = 0; i < _wave.count; i++) {
int ran = Random.Range(0, 100);
//Probabilidade
int e = Random.Range(0, _wave.enemies.Length);
SpawnEnemy (_wave.enemies[e].enemyPrefab);
yield return new WaitForSeconds (1f / _wave.rate);
}
state = SpawnState.WAITING;
yield break;
}
void SpawnEnemy(Transform _enemy) {
Transform _sp = spawnPoints[Random.Range(0, spawnPoints.Length)];
Instantiate (_enemy, _sp.position, _sp.rotation);
}
}
Gwiisk- Membro
- PONTOS : 3266
REPUTAÇÃO : 0
Respeito as regras :
Re: Sistema de probabilidade de Spawn para Waves
SISTEMA DE HORDAS(^)
Phph09- Profissional
- PONTOS : 3791
REPUTAÇÃO : 240
Idade : 19
Respeito as regras :
Re: Sistema de probabilidade de Spawn para Waves
Acho que não entendeu bem meu problema kk, eu tenho um sistema de Waves funcionando normalmente, porém ele só sorteia entre os Prefabs que eu escolhi, eu quero que um tipo de inimigo tenha mais chance que aparecer que outroPhph09 escreveu:
SISTEMA DE HORDAS(^)
Gwiisk- Membro
- PONTOS : 3266
REPUTAÇÃO : 0
Respeito as regras :
Re: Sistema de probabilidade de Spawn para Waves
Voce poderia criar um tipo de id ou facçao para os inimigos ou ate mesmo um tipo de level,
Ex; Level de 1 a 5 spawnar inimigos classe baixa e 6 a 10 classe media 11 a 20 classe alta entedeu.
Ex; Level de 1 a 5 spawnar inimigos classe baixa e 6 a 10 classe media 11 a 20 classe alta entedeu.
Re: Sistema de probabilidade de Spawn para Waves
Eu queria mais de probabilidade, qro por chance de aparecer um inimigo especial ou item especial por exemplo, mas que não sejam comuns,Callyde Jr escreveu:Voce poderia criar um tipo de id ou facçao para os inimigos ou ate mesmo um tipo de level,
Ex; Level de 1 a 5 spawnar inimigos classe baixa e 6 a 10 classe media 11 a 20 classe alta entedeu.
Gwiisk- Membro
- PONTOS : 3266
REPUTAÇÃO : 0
Respeito as regras :
Re: Sistema de probabilidade de Spawn para Waves
Eu fiz um texte no script ver se funciona,
E so alterar com outro script o level desse script que ele tem que spawnar o enemy com o mesmo level
E so alterar com outro script o level desse script que ele tem que spawnar o enemy com o mesmo level
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Wave_spawn : MonoBehaviour {
public enum SpawnState { SPAWNING, WAITING, COUNTING };
[System.Serializable]
public class Enemy
{
public int level;
public Transform enemyPrefab;
[Range(0,100)]
public float probability = 0;
}
[System.Serializable]
public class Wave {
public string name;
public Enemy[] enemies;
public int count;
public float rate;
}
public Wave[] waves;
private int nextWave = 0;
public Transform[] spawnPoints;
public float timeBetweenWaves = 5f;
private float waveCountdown;
private float searchCountdown = 1f;
public SpawnState state = SpawnState.COUNTING;
public int level = 1;
void Start() {
waveCountdown = timeBetweenWaves;
}
void Update() {
if (state == SpawnState.WAITING) {
if (!EnemyIsAlive ()) {
WaveCompleted ();
} else {
return;
}
}
if (waveCountdown <= 0) {
if (state != SpawnState.SPAWNING) {
StartCoroutine (SpawnWave(waves[nextWave]));
}
} else {
waveCountdown -= Time.deltaTime;
}
}
void WaveCompleted() {
state = SpawnState.COUNTING;
waveCountdown = timeBetweenWaves;
if (nextWave + 1 > waves.Length - 1) {
nextWave = 0;
} else {
nextWave++;
}
}
bool EnemyIsAlive() {
searchCountdown -= Time.deltaTime;
if(searchCountdown <= 0f) {
searchCountdown = 1f;
if (GameObject.FindGameObjectWithTag ("Enemy") == null) {
return false;
}
}
return true;
}
IEnumerator SpawnWave (Wave _wave) {
state = SpawnState.SPAWNING;
for (int i = 0; i < _wave.count; i++) {
int ran = Random.Range(0, 100);
//Probabilidade
int e = Random.Range(0, _wave.enemies.Length);
SpawnEnemy (_wave.enemies[e].enemyPrefab);
yield return new WaitForSeconds (1f / _wave.rate);
}
state = SpawnState.WAITING;
yield break;
}
void SpawnEnemy(Transform _enemy) {
if(level == enemies.level){
Transform _sp = spawnPoints[Random.Range(0, spawnPoints.Length)];
Instantiate (_enemy, _sp.position, _sp.rotation);
}
}
}
Re: Sistema de probabilidade de Spawn para Waves
É bacana, mas para o que eu procuro não é o que preciso, quero ser capaz de por exemplo, dar 5% de chance de spawnar um inimigo super forte, ou seja, pode ser que ele apareça ou não na rodada, depende da sorte(ou azar né) do jogadorCallyde Jr escreveu:Eu fiz um texte no script ver se funciona,
E so alterar com outro script o level desse script que ele tem que spawnar o enemy com o mesmo level
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Wave_spawn : MonoBehaviour {
public enum SpawnState { SPAWNING, WAITING, COUNTING };
[System.Serializable]
public class Enemy
{
public int level;
public Transform enemyPrefab;
[Range(0,100)]
public float probability = 0;
}
[System.Serializable]
public class Wave {
public string name;
public Enemy[] enemies;
public int count;
public float rate;
}
public Wave[] waves;
private int nextWave = 0;
public Transform[] spawnPoints;
public float timeBetweenWaves = 5f;
private float waveCountdown;
private float searchCountdown = 1f;
public SpawnState state = SpawnState.COUNTING;
public int level = 1;
void Start() {
waveCountdown = timeBetweenWaves;
}
void Update() {
if (state == SpawnState.WAITING) {
if (!EnemyIsAlive ()) {
WaveCompleted ();
} else {
return;
}
}
if (waveCountdown <= 0) {
if (state != SpawnState.SPAWNING) {
StartCoroutine (SpawnWave(waves[nextWave]));
}
} else {
waveCountdown -= Time.deltaTime;
}
}
void WaveCompleted() {
state = SpawnState.COUNTING;
waveCountdown = timeBetweenWaves;
if (nextWave + 1 > waves.Length - 1) {
nextWave = 0;
} else {
nextWave++;
}
}
bool EnemyIsAlive() {
searchCountdown -= Time.deltaTime;
if(searchCountdown <= 0f) {
searchCountdown = 1f;
if (GameObject.FindGameObjectWithTag ("Enemy") == null) {
return false;
}
}
return true;
}
IEnumerator SpawnWave (Wave _wave) {
state = SpawnState.SPAWNING;
for (int i = 0; i < _wave.count; i++) {
int ran = Random.Range(0, 100);
//Probabilidade
int e = Random.Range(0, _wave.enemies.Length);
SpawnEnemy (_wave.enemies[e].enemyPrefab);
yield return new WaitForSeconds (1f / _wave.rate);
}
state = SpawnState.WAITING;
yield break;
}
void SpawnEnemy(Transform _enemy) {
if(level == enemies.level){
Transform _sp = spawnPoints[Random.Range(0, spawnPoints.Length)];
Instantiate (_enemy, _sp.position, _sp.rotation);
}
}
}
Gwiisk- Membro
- PONTOS : 3266
REPUTAÇÃO : 0
Respeito as regras :
Re: Sistema de probabilidade de Spawn para Waves
Eu consegui aplicar o sistema, porém agora surgiu um problema, as wave não para de dar spawn e não passa para a proxima.Callyde Jr escreveu:Hummm etendi da uma olhada nesse
Topico
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Wave_spawn : MonoBehaviour {
public enum SpawnState { SPAWNING, WAITING, COUNTING };
[System.Serializable]
public class Enemy
{
public Transform enemyPrefab;
[Range(0,100)]
public float probability = 0;
}
[System.Serializable]
public class Wave {
public string name;
public Enemy[] enemies;
public int count;
public float rate;
}
public Wave[] waves;
private int nextWave = 0;
float value;
public Transform[] spawnPoints;
public float timeBetweenWaves = 5f;
private float waveCountdown;
private float searchCountdown = 1f;
public SpawnState state = SpawnState.COUNTING;
void Start() {
waveCountdown = timeBetweenWaves;
}
void Update() {
if (state == SpawnState.WAITING) {
if (!EnemyIsAlive ()) {
WaveCompleted ();
} else {
return;
}
}
if (waveCountdown <= 0) {
if (state != SpawnState.SPAWNING) {
StartCoroutine (SpawnWave(waves[nextWave]));
}
} else {
waveCountdown -= Time.deltaTime;
}
}
void WaveCompleted() {
state = SpawnState.COUNTING;
waveCountdown = timeBetweenWaves;
if (nextWave + 1 > waves.Length - 1) {
nextWave = 0;
} else {
nextWave++;
}
}
bool EnemyIsAlive() {
searchCountdown -= Time.deltaTime;
if(searchCountdown <= 0f) {
searchCountdown = 1f;
if (GameObject.FindGameObjectWithTag ("Enemy") == null) {
return false;
}
}
return true;
}
IEnumerator SpawnWave (Wave _wave) {
state = SpawnState.SPAWNING;
if(_wave.enemies.Length == 1)
_wave.enemies[0].probability = 100f;
for (int i = 0; i < _wave.count; i++) {
int ran = Random.Range(0, 100);
for(i = 0; i < _wave.enemies.Length; i++) {
value += _wave.enemies[i].probability;
if (ran < value) {
Debug.Log(_wave.enemies[i].enemyPrefab);
yield return i;
break;
}
}
value = 0;
SpawnEnemy (_wave.enemies[i].enemyPrefab);
yield return new WaitForSeconds (1f / _wave.rate);
}
state = SpawnState.WAITING;
yield break;
}
void SpawnEnemy(Transform _enemy) {
Transform _sp = spawnPoints[Random.Range(0, spawnPoints.Length)];
Instantiate (_enemy, _sp.position, _sp.rotation);
}
}
Gwiisk- Membro
- PONTOS : 3266
REPUTAÇÃO : 0
Respeito as regras :
Re: Sistema de probabilidade de Spawn para Waves
Eu achei um exemplo na net ver ai se pode te ajudar
Probabilidades Diferentes
Probabilidades Diferentes
Re: Sistema de probabilidade de Spawn para Waves
Então, consegui montar o sistema, porém tem algo estranho acontecendo, a Wave atual(No caso a primeira) não termina, ele continua spawnando inimigos indeterminadamente, não consigo achar o problema sendo que só adicionei um for dentro do spawn de wave.Callyde Jr escreveu:Eu achei um exemplo na net ver ai se pode te ajudar
Probabilidades Diferentes
Gwiisk- Membro
- PONTOS : 3266
REPUTAÇÃO : 0
Respeito as regras :
Re: Sistema de probabilidade de Spawn para Waves
Ha ele fica spawnando direto sem parar?
Eu fiz um pra mim e coloquei um tipo de quantidade quando chegar a zero parar
Eu fiz um pra mim e coloquei um tipo de quantidade quando chegar a zero parar
Re: Sistema de probabilidade de Spawn para Waves
Voce pode adicionar EX:
Quando a quantidade chegar a 0 voce desativa a bool que faz parar a intanciar
Em cont toda vez que um enemy for morto voce adiciona += 1 cont
Quando cont for igual a quantidade voce adiciona mais um level e cont = 0
almentando agora a quantidade
level 1, quantidade = 5
level 2 , quantidade = 8
e etc...
- Código:
public int level = 1;
public int quantidade = 5; //de enemys
public int count; //contagem de kill
bool ativado = false;
Quando a quantidade chegar a 0 voce desativa a bool que faz parar a intanciar
Em cont toda vez que um enemy for morto voce adiciona += 1 cont
Quando cont for igual a quantidade voce adiciona mais um level e cont = 0
almentando agora a quantidade
level 1, quantidade = 5
level 2 , quantidade = 8
e etc...
Tópicos semelhantes
» Sistema de "Avaliação" / Probabilidade / Notas
» Código para drop de itens conforme raridade (probabilidade)
» Sistema de spawn de monstros multiplayer
» Como fazer um sistema de Spawn aleatório?
» [RESOLVIDO][AJUDA] Sistema de spawn de Árvores
» Código para drop de itens conforme raridade (probabilidade)
» Sistema de spawn de monstros multiplayer
» Como fazer um sistema de Spawn aleatório?
» [RESOLVIDO][AJUDA] Sistema de spawn de Árvores
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos