[RESOLVIDO] Inimigo patrulhando constantemente estilo mario
2 participantes
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
[RESOLVIDO] Inimigo patrulhando constantemente estilo mario
Boa noite pessoal,
Estou trabalhando num jogo 2D e queria que o meu inimigo patrulhasse uma área predeterminada, eu consegui fazer ele andar por toda ela, o problema é que ele faz isso parecendo os inimigos do Mario, ele simplesmente vai e volta durante todo o percurso, eu queria que ele parasse nas extremidades pra dar tempo do Player fazer alguma "feature" atrás, porém, ele não consegue fazer isso. Estou usando o código abaixo:
Se alguém puder me ajudar por favor.
Estou trabalhando num jogo 2D e queria que o meu inimigo patrulhasse uma área predeterminada, eu consegui fazer ele andar por toda ela, o problema é que ele faz isso parecendo os inimigos do Mario, ele simplesmente vai e volta durante todo o percurso, eu queria que ele parasse nas extremidades pra dar tempo do Player fazer alguma "feature" atrás, porém, ele não consegue fazer isso. Estou usando o código abaixo:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Patrulha : MonoBehaviour {
private Rigidbody2D rb; //rigidbody do inimigo
private bool olhandoParaDireita; //variavel para verificar se o personagem está olhando para a direita
public float velocidade, distancia; //variaveis de controle
public Transform DetectaChao; // variavel para verificar o chão
void Start () {
rb = GetComponent<Rigidbody2D> ();
}
void Update () {
transform.Translate(Vector2.right * velocidade * Time.deltaTime); //faz o personagem começar a andar
RaycastHit2D groundInfo = Physics2D.Raycast(DetectaChao.position, Vector2.down, distancia); //verifica constantemente se o personagem está ou não sobre a plataforma
if (groundInfo.collider == false) //se não
{
transform.Translate (new Vector2(-1,0) * velocidade * Time.deltaTime); //para o personagem
rb.velocity = new Vector2(0,0); //outro codigo pra parar o personagem por motivos de só o de cima não funcionava
StartCoroutine (Wait()); //começa uma CoRotina
}
}
IEnumerator Wait(){
yield return new WaitForSeconds (5); //Espera 5 segundos antes de continuar o código;
Debug.Log ("CHEGOU"); //verificando se a CoRotina está funcionando
StopCoroutine (Wait()); //finaliza a CoRotina
}
void virar (){
if (olhandoParaDireita == true) {
transform.eulerAngles = new Vector3 (0, -180, 0); //vira o persoanagem para a esquerda
olhandoParaDireita = false;
transform.Translate (Vector2.right * velocidade * Time.deltaTime); //faz o personagem andar
} else {
transform.eulerAngles = new Vector3 (0, 0, 0); //vira o personagem para a direita
olhandoParaDireita = true;
transform.Translate (Vector2.right * velocidade * Time.deltaTime); //faz o personaegem andar
}
}
}
Se alguém puder me ajudar por favor.
MrMattD- Iniciante
- PONTOS : 2469
REPUTAÇÃO : 1
Respeito as regras :
Re: [RESOLVIDO] Inimigo patrulhando constantemente estilo mario
Isso tudo você vai ter que criar a gosto no código... pode ser com IENumerator, fazendo uma rotina de comportamento sequencial, ou pode ser com base em Random.Range pra gerar comportamentos aleatórios.
Aconselho ver a minha série de C#... você realmente vai ter que programar a rotina a gosto mesmo.
Aconselho ver a minha série de C#... você realmente vai ter que programar a rotina a gosto mesmo.
Re: [RESOLVIDO] Inimigo patrulhando constantemente estilo mario
MarcosSchultz escreveu:Isso tudo você vai ter que criar a gosto no código... pode ser com IENumerator, fazendo uma rotina de comportamento sequencial, ou pode ser com base em Random.Range pra gerar comportamentos aleatórios.
Aconselho ver a minha série de C#... você realmente vai ter que programar a rotina a gosto mesmo.
Na verdade o código esta "funcionando", porém o que acontece é que o código do Update não para quando o IEnumerator começa, então a variável continua verificando e quando os 5 segundos passam ela dispara de uma vez girando o personagem loucamente. Tem alguma maneira de eu fazer o Update para enquanto ele esta esperando? Pensei em desligar o Raycast enquanto não voltar para o código, porém, não tenho certeza de como fazer nenhum dos dois.
MrMattD- Iniciante
- PONTOS : 2469
REPUTAÇÃO : 1
Respeito as regras :
Re: [RESOLVIDO] Inimigo patrulhando constantemente estilo mario
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody2D))]
public class Patrulha : MonoBehaviour{
Rigidbody2D rb2D;
bool direita, parado;
public float velocidade = 1.5f;
public float posicX1 = -2, posicX2 = 2;
void Start(){
direita = parado = false;
rb2D = GetComponent<Rigidbody2D>();
}
void Update(){
if (!parado){
if (direita){
rb2D.velocity = (Vector2.right * velocidade * rb2D.mass);
if (transform.position.x > posicX2){
StartCoroutine("Esperar5Segundos");
}
}
else{
rb2D.velocity = (-Vector2.right * velocidade * rb2D.mass);
if (transform.position.x < posicX1){
StartCoroutine("Esperar5Segundos");
}
}
}
}
IEnumerator Esperar5Segundos(){
rb2D.velocity = Vector2.zero;
parado = true;
yield return new WaitForSeconds(5);
parado = false;
direita = !direita;
}
}
Re: [RESOLVIDO] Inimigo patrulhando constantemente estilo mario
MarcosSchultz escreveu:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody2D))]
public class Patrulha : MonoBehaviour{
Rigidbody2D rb2D;
bool direita, parado;
public float velocidade = 1.5f;
public float posicX1 = -2, posicX2 = 2;
void Start(){
direita = parado = false;
rb2D = GetComponent<Rigidbody2D>();
}
void Update(){
if (!parado){
if (direita){
rb2D.velocity = (Vector2.right * velocidade * rb2D.mass);
if (transform.position.x > posicX2){
StartCoroutine("Esperar5Segundos");
}
}
else{
rb2D.velocity = (-Vector2.right * velocidade * rb2D.mass);
if (transform.position.x < posicX1){
StartCoroutine("Esperar5Segundos");
}
}
}
}
IEnumerator Esperar5Segundos(){
rb2D.velocity = Vector2.zero;
parado = true;
yield return new WaitForSeconds(5);
parado = false;
direita = !direita;
}
}
Muito obrigado, funcionou exatamente como eu pensei. Me senti até besta por não ter pensado nisso antes...
Muito obrigado mesmo
MrMattD- Iniciante
- PONTOS : 2469
REPUTAÇÃO : 1
Respeito as regras :
Tópicos semelhantes
» [RESOLVIDO] SISTEMA DE PATENTE ESTILO CS:GO
» [RESOLVIDO] Camera Estilo Showroom
» [RESOLVIDO] Inimigo detecta outro Inimigo.
» [RESOLVIDO] Dano no inimigo
» [RESOLVIDO] Visão estilo CS
» [RESOLVIDO] Camera Estilo Showroom
» [RESOLVIDO] Inimigo detecta outro Inimigo.
» [RESOLVIDO] Dano no inimigo
» [RESOLVIDO] Visão estilo CS
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos