Inteligencia Artificial
3 participantes
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Inteligencia Artificial
To criando uma IA Mais to com um poblema na vida do player pq quando o inimigo ataca o player a vida do player diminui mais quando eu saiu da area do OverlapCircle a vida continua caindo ate o player morrer alguem pode mim ajuda
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Inimigo : MonoBehaviour {
public Transform player;
public bool playerEncontrado;
public int vida = 100;
public float velocidade;
public float tempoDeEsperar;
public float tempoDeMorte;
public Vector2 pontoColisaoPiso = Vector2.zero;
public float raio;
public Color debugCorColisao = Color.red;
public LayerMask plataforma;
public bool ficaTomandoDano;
private Animator animator;
void Start () {
animator = GetComponent<Animator> ();
}
void Update () {
Correndo ();
Morte ();
PlayerEncontrado ();
FicaTomandoDano ();
}
private void PlayerEncontrado() {
var pontoPosicao = pontoColisaoPiso;
pontoPosicao.x += transform.position.x;
pontoPosicao.y += transform.position.y;
playerEncontrado = Physics2D.OverlapCircle (pontoPosicao, raio, plataforma);
}
void OnDrawGizmos() {
Gizmos.color = debugCorColisao;
var pontoPosicao = pontoColisaoPiso;
pontoPosicao.x += transform.position.x;
pontoPosicao.y += transform.position.y;
Gizmos.DrawWireSphere (pontoPosicao, raio);
}
private void Correndo() {
if (playerEncontrado == true && velocidade == 1) {
transform.position = Vector3.Lerp (transform.position, player.position, velocidade * Time.deltaTime);
animator.SetBool ("Ataque", false);
animator.SetBool ("Correndo", true);
}
}
void OnTriggerEnter2D(Collider2D colisor) {
if (colisor.tag == "Player") {
velocidade = 0;
ficaTomandoDano = true;
}
if (colisor.tag == "Bala") {
vida -= 10;
}
}
void OnTriggerExit2D(Collider2D colisor) {
if (colisor.tag == "Player") {
velocidade = 1;
ficaTomandoDano = false;
}
}
private void FicaTomandoDano() {
if (ficaTomandoDano == true) {
StartCoroutine ("TempoDeAtaque");
}
}
IEnumerator TempoDeAtaque() {
ficaTomandoDano = false;
yield return new WaitForSeconds (tempoDeEsperar);
ficaTomandoDano = true;
animator.SetBool ("Correndo", false);
animator.SetBool ("Ataque", true);
player.GetComponent<Player> ().vida -= 10;
}
IEnumerator TempoDeMorte() {
yield return new WaitForSeconds (tempoDeMorte);
Destroy (gameObject);
}
private void Morte() {
if (vida <= 0) {
vida = 0;
playerEncontrado = false;
animator.SetTrigger ("Morrendo");
StartCoroutine ("TempoDeMorte");
}
}
}
Bruno- ProgramadorMaster
- PONTOS : 3415
REPUTAÇÃO : 142
Idade : 22
Áreas de atuação : C# Avançado, SQL Intermediário, Unity3D Intermediário, HTML Iniciante, CSS Iniciante e ASP.NET
Respeito as regras :
Re: Inteligencia Artificial
aqui está o erro (eu acho)
Tente isto:
- Código:
IEnumerator TempoDeAtaque() {
ficaTomandoDano = false;
yield return new WaitForSeconds (tempoDeEsperar);
ficaTomandoDano = true;
animator.SetBool ("Correndo", false);
animator.SetBool ("Ataque", true);
player.GetComponent<Player> ().vida -= 10;
}
Tente isto:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Inimigo : MonoBehaviour {
public Transform player;
public bool playerEncontrado;
public int vida = 100;
public float velocidade;
public float tempoDeEsperar;
public float tempoDeMorte;
public Vector2 pontoColisaoPiso = Vector2.zero;
public float raio;
public Color debugCorColisao = Color.red;
public LayerMask plataforma;
public bool ficaTomandoDano;
private Animator animator;
void Start () {
animator = GetComponent<Animator> ();
}
void Update () {
Correndo ();
Morte ();
PlayerEncontrado ();
FicaTomandoDano ();
}
private void PlayerEncontrado() {
var pontoPosicao = pontoColisaoPiso;
pontoPosicao.x += transform.position.x;
pontoPosicao.y += transform.position.y;
playerEncontrado = Physics2D.OverlapCircle (pontoPosicao, raio, plataforma);
}
void OnDrawGizmos() {
Gizmos.color = debugCorColisao;
var pontoPosicao = pontoColisaoPiso;
pontoPosicao.x += transform.position.x;
pontoPosicao.y += transform.position.y;
Gizmos.DrawWireSphere (pontoPosicao, raio);
}
private void Correndo() {
if (playerEncontrado == true && velocidade == 1) {
transform.position = Vector3.Lerp (transform.position, player.position, velocidade * Time.deltaTime);
animator.SetBool ("Ataque", false);
animator.SetBool ("Correndo", true);
}
}
void OnTriggerEnter2D(Collider2D colisor) {
if (colisor.tag == "Player") {
velocidade = 0;
ficaTomandoDano = true;
}
if (colisor.tag == "Bala") {
vida -= 10;
}
}
void OnTriggerExit2D(Collider2D colisor) {
if (colisor.tag == "Player") {
velocidade = 1;
ficaTomandoDano = false;
}
}
private void FicaTomandoDano() {
if (ficaTomandoDano == true) {
StartCoroutine ("TempoDeAtaque");
}
}
IEnumerator TempoDeAtaque() {
ficaTomandoDano = false;
yield return new WaitForSeconds (tempoDeEsperar);
ficaTomandoDano = true;
animator.SetBool ("Correndo", false);
animator.SetBool ("Ataque", true);
player.GetComponent<Player> ().vida -= 10;
ficaTomandoDano = false;
}
IEnumerator TempoDeMorte() {
yield return new WaitForSeconds (tempoDeMorte);
Destroy (gameObject);
}
private void Morte() {
if (vida <= 0) {
vida = 0;
playerEncontrado = false;
animator.SetTrigger ("Morrendo");
StartCoroutine ("TempoDeMorte");
}
}
}
Re: Inteligencia Artificial
Ja tentei fazer isso mais não deu serto o player só toma dano uma vezMarcosSchultz escreveu:aqui está o erro (eu acho)depois do player tomar dano, a variável "ficarTomandoDano" deve voltar para o false, para não repetir o comando.
- Código:
IEnumerator TempoDeAtaque() {
ficaTomandoDano = false;
yield return new WaitForSeconds (tempoDeEsperar);
ficaTomandoDano = true;
animator.SetBool ("Correndo", false);
animator.SetBool ("Ataque", true);
player.GetComponent<Player> ().vida -= 10;
}
Tente isto:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Inimigo : MonoBehaviour {
public Transform player;
public bool playerEncontrado;
public int vida = 100;
public float velocidade;
public float tempoDeEsperar;
public float tempoDeMorte;
public Vector2 pontoColisaoPiso = Vector2.zero;
public float raio;
public Color debugCorColisao = Color.red;
public LayerMask plataforma;
public bool ficaTomandoDano;
private Animator animator;
void Start () {
animator = GetComponent<Animator> ();
}
void Update () {
Correndo ();
Morte ();
PlayerEncontrado ();
FicaTomandoDano ();
}
private void PlayerEncontrado() {
var pontoPosicao = pontoColisaoPiso;
pontoPosicao.x += transform.position.x;
pontoPosicao.y += transform.position.y;
playerEncontrado = Physics2D.OverlapCircle (pontoPosicao, raio, plataforma);
}
void OnDrawGizmos() {
Gizmos.color = debugCorColisao;
var pontoPosicao = pontoColisaoPiso;
pontoPosicao.x += transform.position.x;
pontoPosicao.y += transform.position.y;
Gizmos.DrawWireSphere (pontoPosicao, raio);
}
private void Correndo() {
if (playerEncontrado == true && velocidade == 1) {
transform.position = Vector3.Lerp (transform.position, player.position, velocidade * Time.deltaTime);
animator.SetBool ("Ataque", false);
animator.SetBool ("Correndo", true);
}
}
void OnTriggerEnter2D(Collider2D colisor) {
if (colisor.tag == "Player") {
velocidade = 0;
ficaTomandoDano = true;
}
if (colisor.tag == "Bala") {
vida -= 10;
}
}
void OnTriggerExit2D(Collider2D colisor) {
if (colisor.tag == "Player") {
velocidade = 1;
ficaTomandoDano = false;
}
}
private void FicaTomandoDano() {
if (ficaTomandoDano == true) {
StartCoroutine ("TempoDeAtaque");
}
}
IEnumerator TempoDeAtaque() {
ficaTomandoDano = false;
yield return new WaitForSeconds (tempoDeEsperar);
ficaTomandoDano = true;
animator.SetBool ("Correndo", false);
animator.SetBool ("Ataque", true);
player.GetComponent<Player> ().vida -= 10;
ficaTomandoDano = false;
}
IEnumerator TempoDeMorte() {
yield return new WaitForSeconds (tempoDeMorte);
Destroy (gameObject);
}
private void Morte() {
if (vida <= 0) {
vida = 0;
playerEncontrado = false;
animator.SetTrigger ("Morrendo");
StartCoroutine ("TempoDeMorte");
}
}
}
Bruno- ProgramadorMaster
- PONTOS : 3415
REPUTAÇÃO : 142
Idade : 22
Áreas de atuação : C# Avançado, SQL Intermediário, Unity3D Intermediário, HTML Iniciante, CSS Iniciante e ASP.NET
Respeito as regras :
Re: Inteligencia Artificial
Eu tava utilizando 2 colisor agora eu coloquei o OverlapCircle pra Detectar o Player mais a vida do player em vez de desser mais devagar ela desse muito rapido eu ja coloquei o IEnumerator mais não deu serto
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Inimigo : MonoBehaviour {
public Transform player;
public bool playerEncontrado;
public bool playerEncontrado2;
public int vida = 100;
public float velocidade;
public float tempoDeEsperar;
public float tempoDeMorte;
public Vector2 pontoColisaoPiso = Vector2.zero;
public float raio;
public Color debugCorColisao = Color.red;
public LayerMask plataforma;
public Vector2 pontoColisaoPiso2 = Vector2.zero;
public float raio2;
public Color debugCorColisao2 = Color.red;
public LayerMask plataforma2;
public bool ficaTomandoDano;
private Animator animator;
void Start () {
animator = GetComponent<Animator> ();
}
void Update () {
Correndo ();
Morte ();
PlayerEncontrado ();
Ataque ();
}
private void PlayerEncontrado() {
var pontoPosicao = pontoColisaoPiso;
pontoPosicao.x += transform.position.x;
pontoPosicao.y += transform.position.y;
playerEncontrado = Physics2D.OverlapCircle (pontoPosicao, raio, plataforma);
var pontoPosicao2 = pontoColisaoPiso2;
pontoPosicao2.x += transform.position.x;
pontoPosicao2.y += transform.position.y;
playerEncontrado2 = Physics2D.OverlapCircle (pontoPosicao2, raio2, plataforma2);
}
void OnDrawGizmos() {
Gizmos.color = debugCorColisao;
var pontoPosicao = pontoColisaoPiso;
pontoPosicao.x += transform.position.x;
pontoPosicao.y += transform.position.y;
Gizmos.DrawWireSphere (pontoPosicao, raio);
Gizmos.color = debugCorColisao2;
var pontoPosicao2 = pontoColisaoPiso2;
pontoPosicao2.x += transform.position.x;
pontoPosicao2.y += transform.position.y;
Gizmos.DrawWireSphere (pontoPosicao2, raio2);
}
private void Correndo() {
if (playerEncontrado == true && velocidade == 1) {
transform.position = Vector3.Lerp (transform.position, player.position, velocidade * Time.deltaTime);
animator.SetBool ("Ataque", false);
animator.SetBool ("Correndo", true);
}
}
private void Ataque() {
if (playerEncontrado2 == true) {
velocidade = 0;
ficaTomandoDano = true;
StartCoroutine ("TempoDeAtaque");
}
if (playerEncontrado2 == false) {
velocidade = 1;
ficaTomandoDano = false;
}
}
IEnumerator TempoDeAtaque() {
ficaTomandoDano = false;
yield return new WaitForSeconds (tempoDeEsperar);
ficaTomandoDano = true;
animator.SetBool ("Correndo", false);
animator.SetBool ("Ataque", true);
player.GetComponent<Player> ().vida -= 10;
ficaTomandoDano = false;
}
IEnumerator TempoDeMorte() {
yield return new WaitForSeconds (tempoDeMorte);
Destroy (gameObject);
}
private void Morte() {
if (vida <= 0) {
vida = 0;
playerEncontrado = false;
animator.SetTrigger ("Morrendo");
StartCoroutine ("TempoDeMorte");
}
}
}
Bruno- ProgramadorMaster
- PONTOS : 3415
REPUTAÇÃO : 142
Idade : 22
Áreas de atuação : C# Avançado, SQL Intermediário, Unity3D Intermediário, HTML Iniciante, CSS Iniciante e ASP.NET
Respeito as regras :
Re: Inteligencia Artificial
O poblema ta nessa linha
[list=linenums]
[*]IEnumerator TempoDeAtaque() {
[*] ficaTomandoDano = false;
[*] yield return new WaitForSeconds (tempoDeEsperar);
[*] ficaTomandoDano = true;
[*] animator.SetBool ("Correndo", false);
[*] animator.SetBool ("Ataque", true);
[*] player.GetComponent<Player> ().vida -= 10;
[*] ficaTomandoDano = false;
[*] }
[/list]
Eu acho
[list=linenums]
[*]IEnumerator TempoDeAtaque() {
[*] ficaTomandoDano = false;
[*] yield return new WaitForSeconds (tempoDeEsperar);
[*] ficaTomandoDano = true;
[*] animator.SetBool ("Correndo", false);
[*] animator.SetBool ("Ataque", true);
[*] player.GetComponent<Player> ().vida -= 10;
[*] ficaTomandoDano = false;
[*] }
[/list]
Eu acho
Bruno- ProgramadorMaster
- PONTOS : 3415
REPUTAÇÃO : 142
Idade : 22
Áreas de atuação : C# Avançado, SQL Intermediário, Unity3D Intermediário, HTML Iniciante, CSS Iniciante e ASP.NET
Respeito as regras :
Re: Inteligencia Artificial
Tente algo assim:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Inimigo : MonoBehaviour {
public Transform player;
public bool playerEncontrado;
public int vida = 100;
public float velocidade;
public float tempoDeEsperar;
public float tempoDeMorte;
public Vector2 pontoColisaoPiso = Vector2.zero;
public float raio;
public Color debugCorColisao = Color.red;
public LayerMask plataforma;
public bool ficaTomandoDano;
private Animator animator;
void Start () {
animator = GetComponent<Animator> ();
}
void Update () {
Correndo ();
Morte ();
PlayerEncontrado ();
}
private void PlayerEncontrado() {
var pontoPosicao = pontoColisaoPiso;
pontoPosicao.x += transform.position.x;
pontoPosicao.y += transform.position.y;
playerEncontrado = Physics2D.OverlapCircle (pontoPosicao, raio, plataforma);
}
void OnDrawGizmos() {
Gizmos.color = debugCorColisao;
var pontoPosicao = pontoColisaoPiso;
pontoPosicao.x += transform.position.x;
pontoPosicao.y += transform.position.y;
Gizmos.DrawWireSphere (pontoPosicao, raio);
}
private void Correndo() {
if (playerEncontrado == true && velocidade == 1) {
transform.position = Vector3.Lerp (transform.position, player.position, velocidade * Time.deltaTime);
animator.SetBool ("Ataque", false);
animator.SetBool ("Correndo", true);
}
}
void OnTriggerEnter2D(Collider2D colisor) {
if (colisor.tag == "Player") {
velocidade = 0;
ficaTomandoDano = true;
StartCoroutine("TempoDeAtaque");
}
if (colisor.tag == "Bala") {
vida -= 10;
}
}
void OnTriggerExit2D(Collider2D colisor) {
if (colisor.tag == "Player") {
velocidade = 1;
ficaTomandoDano = false;
StopCoroutine("TempoDeAtaque");
}
}
IEnumerator TempoDeAtaque() {
while(ficaTomandoDano){
yield return new WaitForSeconds (tempoDeEsperar);
animator.SetBool ("Correndo", false);
animator.SetBool ("Ataque", true);
player.GetComponent<Player> ().vida -= 10;
}
}
IEnumerator TempoDeMorte() {
yield return new WaitForSeconds (tempoDeMorte);
Destroy (gameObject);
}
private void Morte() {
if (vida <= 0) {
vida = 0;
playerEncontrado = false;
ficaTomandoDano = false;
animator.SetTrigger ("Morrendo");
StartCoroutine ("TempoDeMorte");
}
}
}
Re: Inteligencia Artificial
Manawydan escreveu:Tente algo assim:Obs: Não é muito bom executar coroutines junto com o Update, sempre que possivel tente evitar usar o Update ou qualquer outro metodo que se executa repetidamente.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Inimigo : MonoBehaviour {
public Transform player;
public bool playerEncontrado;
public int vida = 100;
public float velocidade;
public float tempoDeEsperar;
public float tempoDeMorte;
public Vector2 pontoColisaoPiso = Vector2.zero;
public float raio;
public Color debugCorColisao = Color.red;
public LayerMask plataforma;
public bool ficaTomandoDano;
private Animator animator;
void Start () {
animator = GetComponent<Animator> ();
}
void Update () {
Correndo ();
Morte ();
PlayerEncontrado ();
}
private void PlayerEncontrado() {
var pontoPosicao = pontoColisaoPiso;
pontoPosicao.x += transform.position.x;
pontoPosicao.y += transform.position.y;
playerEncontrado = Physics2D.OverlapCircle (pontoPosicao, raio, plataforma);
}
void OnDrawGizmos() {
Gizmos.color = debugCorColisao;
var pontoPosicao = pontoColisaoPiso;
pontoPosicao.x += transform.position.x;
pontoPosicao.y += transform.position.y;
Gizmos.DrawWireSphere (pontoPosicao, raio);
}
private void Correndo() {
if (playerEncontrado == true && velocidade == 1) {
transform.position = Vector3.Lerp (transform.position, player.position, velocidade * Time.deltaTime);
animator.SetBool ("Ataque", false);
animator.SetBool ("Correndo", true);
}
}
void OnTriggerEnter2D(Collider2D colisor) {
if (colisor.tag == "Player") {
velocidade = 0;
ficaTomandoDano = true;
StartCoroutine("TempoDeAtaque");
}
if (colisor.tag == "Bala") {
vida -= 10;
}
}
void OnTriggerExit2D(Collider2D colisor) {
if (colisor.tag == "Player") {
velocidade = 1;
ficaTomandoDano = false;
StopCoroutine("TempoDeAtaque");
}
}
IEnumerator TempoDeAtaque() {
while(ficaTomandoDano){
yield return new WaitForSeconds (tempoDeEsperar);
animator.SetBool ("Correndo", false);
animator.SetBool ("Ataque", true);
player.GetComponent<Player> ().vida -= 10;
}
}
IEnumerator TempoDeMorte() {
yield return new WaitForSeconds (tempoDeMorte);
Destroy (gameObject);
}
private void Morte() {
if (vida <= 0) {
vida = 0;
playerEncontrado = false;
ficaTomandoDano = false;
animator.SetTrigger ("Morrendo");
StartCoroutine ("TempoDeMorte");
}
}
}
Valeu cara fucionor
Bruno- ProgramadorMaster
- PONTOS : 3415
REPUTAÇÃO : 142
Idade : 22
Áreas de atuação : C# Avançado, SQL Intermediário, Unity3D Intermediário, HTML Iniciante, CSS Iniciante e ASP.NET
Respeito as regras :
Tópicos semelhantes
» Inteligência Artificial
» Inteligencia Artificial
» Inteligência Artificial
» Inteligencia Artificial
» Inteligencia artificial?
» Inteligencia Artificial
» Inteligência Artificial
» Inteligencia Artificial
» Inteligencia artificial?
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos