Dano no inimigo
4 participantes
Página 1 de 1
Dano no inimigo
Olá novamente, estou com problemas na hora de aplicar dano no meu inimigo. Ativo o capsule collider quando o player aperta o botão do mouse, mas meu script de averiguação não retorna positivo.
Tentei averiguar se era a tag errada, mas o log não retorna nenhuma mensagem.
Abaixo o script do ataque.
Esta tudo funcionando, menos a parte do OnTriggerEnter. Se alguém souber o motivo por favor me ajude. Aceito sugestões.
Obrigado
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Arma : MonoBehaviour {
public string TipoArma;
public bool PlayerAcertou;
public float Dano;
private bool Ativar;
private float ContAcert;
void Update ()
{
Ativar = GetComponentInParent<AtaqueDoPlayer> ().Atacando;
if (Ativar == true) {
this.GetComponent<CapsuleCollider> ().enabled = true;
} else {
this.GetComponent<CapsuleCollider> ().enabled = false;
}
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "Esqueleto")
{
PlayerAcertou = true;
ContAcert += Time.deltaTime;
Dano = 15;
if (ContAcert > 2)
{
PlayerAcertou = false;
}
}
Debug.Log (other.tag);
}
}
Tentei averiguar se era a tag errada, mas o log não retorna nenhuma mensagem.
Abaixo o script do ataque.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AtaqueDoPlayer : MonoBehaviour {
public bool Atacando;
private float ContAtaqPlayer;
public float TempEntrAtaqPlayer;
public Animator AnimPlayer;
// Use this for initialization
void Start ()
{
ContAtaqPlayer = TempEntrAtaqPlayer;
AnimPlayer.SetBool ("Atack", false);
}
// Update is called once per frame
void Update ()
{
if (Input.GetMouseButton (0))
{
ContAtaqPlayer = TempEntrAtaqPlayer;
Atacando = true;
AnimPlayer.SetBool ("Atack", true);
}
if (ContAtaqPlayer > 0)
{
ContAtaqPlayer -= Time.deltaTime;
}
if (ContAtaqPlayer <= 0)
{
Atacando = false;
AnimPlayer.SetBool ("Atack", false);
}
}
}
Esta tudo funcionando, menos a parte do OnTriggerEnter. Se alguém souber o motivo por favor me ajude. Aceito sugestões.
Obrigado
arnaldojunior- Membro
- PONTOS : 2445
REPUTAÇÃO : 2
Respeito as regras :
Re: Dano no inimigo
o collider esta marcado como isTrigger?
Phph09- Profissional
-
PONTOS : 3182
REPUTAÇÃO : 240
Idade : 17
Respeito as regras :
Re: Dano no inimigo
O inimigo no caso possui rigidbody.
arnaldojunior- Membro
- PONTOS : 2445
REPUTAÇÃO : 2
Respeito as regras :
Re: Dano no inimigo
Olá eu alterei o código e acredito que ficou mais leve. Descobri que o prblema é o inimigo. Por algum motivo ele não acusa colisão, mas não uando coloco um boxcollider pra testar ele não enxerga o player... mais tare eu coloco os novos scripts para vcs opinarem, agora estou no celular.
arnaldojunior- Membro
- PONTOS : 2445
REPUTAÇÃO : 2
Respeito as regras :
Re: Dano no inimigo
Trago o código que estou usando atualmente no meu sistema de dano. Vou testar contra um cubo e trago o resultado mais tarde.
Este é o código que coloquei na arma. Ainda não decidi se deixarei o teste para averiguar qual a tag da arma ou se farei um script para cada tipo de arma. O que seria mais leve?
- Código:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Arma : MonoBehaviour
{
public bool PlayerAcertou;
public float Dano;
private bool Ativar;
private float ContAcert;
void Update()
{
Ativacao();
}
public string TipoArma;
private void Ativacao()
{
Ativar = GetComponentInParent<AtaqueDoPlayer>().Atacando;
if (Ativar == true)
{
GetComponent<CapsuleCollider>().enabled = true;
TipoArma = gameObject.tag;
if (TipoArma == "Espada")
{
Dano = 15;
}
}
else
{
GetComponent<CapsuleCollider>().enabled = false;
}
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag(tag: "Inimigo"))
{
PlayerAcertou = true;
ContAcert += Time.deltaTime;
}
if (ContAcert > 3)
{
PlayerAcertou = false;
}
Debug.Log(message: "Espada acertou");
}
}
Este é o código que coloquei na arma. Ainda não decidi se deixarei o teste para averiguar qual a tag da arma ou se farei um script para cada tipo de arma. O que seria mais leve?
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DadosInimigo : MonoBehaviour {
public static float VidaDoInimigo = 100;
public float VidaAtualInimigo;
public GameObject Arma;
// Use this for initialization
void Awake ()
{
VidaAtualInimigo = VidaDoInimigo;
}
// Update is called once per frame
void Update ()
{
DanoRecebido();
}
private void DanoRecebido()
{
if (Arma.GetComponent<Arma>().PlayerAcertou == true)
{
VidaAtualInimigo = VidaAtualInimigo - GetComponent<Arma>().Dano;
}
}
}
arnaldojunior- Membro
- PONTOS : 2445
REPUTAÇÃO : 2
Respeito as regras :
Re: Dano no inimigo
Umas dicas que dou são:arnaldojunior escreveu:Trago o código que estou usando atualmente no meu sistema de dano. Vou testar contra um cubo e trago o resultado mais tarde.
- Código:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Arma : MonoBehaviour
{
public bool PlayerAcertou;
public float Dano;
private bool Ativar;
private float ContAcert;
void Update()
{
Ativacao();
}
public string TipoArma;
private void Ativacao()
{
Ativar = GetComponentInParent<AtaqueDoPlayer>().Atacando;
if (Ativar == true)
{
GetComponent<CapsuleCollider>().enabled = true;
TipoArma = gameObject.tag;
if (TipoArma == "Espada")
{
Dano = 15;
}
}
else
{
GetComponent<CapsuleCollider>().enabled = false;
}
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag(tag: "Inimigo"))
{
PlayerAcertou = true;
ContAcert += Time.deltaTime;
}
if (ContAcert > 3)
{
PlayerAcertou = false;
}
Debug.Log(message: "Espada acertou");
}
}
Este é o código que coloquei na arma. Ainda não decidi se deixarei o teste para averiguar qual a tag da arma ou se farei um script para cada tipo de arma. O que seria mais leve?Aqui tenho um script para controlar o dano no inimigo. Tentei ser o mais simples possível para evitar erros. Aceito sugestões de como deixar o código mais leve.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DadosInimigo : MonoBehaviour {
public static float VidaDoInimigo = 100;
public float VidaAtualInimigo;
public GameObject Arma;
// Use this for initialization
void Awake ()
{
VidaAtualInimigo = VidaDoInimigo;
}
// Update is called once per frame
void Update ()
{
DanoRecebido();
}
private void DanoRecebido()
{
if (Arma.GetComponent<Arma>().PlayerAcertou == true)
{
VidaAtualInimigo = VidaAtualInimigo - GetComponent<Arma>().Dano;
}
}
}
- Cacheie as classes que você utiliza, como a arma, o script de ataque, collider e tudo mais...
- A variável TipoArma, vi que não é utilizada em ou lugar, a não ser um... Caso não utilize em outra classe, eu sugiro que não há necessidade de cachea-la...
- Variáveis, para não serem confundidas com classes, métodos ou outras coisas, é recomendada que utilize a primeira letra minúscula, para melhor organização...
- Uma outra bem legal, que onde tu utiliza:
- Código:
if (ContAcert > 3)
PlayerAcertou = false;
- Código:
PlayerAcertou = ContAcert <= 3;
No caso eu mudei apenas os operadores, que denomina que caso seja menor ou igual a 3 será sempre igual...
Basicamente é isso, não testei seu code nem algo do tipo, por tempo, mas algumas dicas para te ajudar... Qualquer coisa estamos ai!
Re: Dano no inimigo
Desculpe o floop, mas não achei onde edita e tals...recagonlei escreveu:Umas dicas que dou são:arnaldojunior escreveu:Trago o código que estou usando atualmente no meu sistema de dano. Vou testar contra um cubo e trago o resultado mais tarde.
- Código:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Arma : MonoBehaviour
{
public bool PlayerAcertou;
public float Dano;
private bool Ativar;
private float ContAcert;
void Update()
{
Ativacao();
}
public string TipoArma;
private void Ativacao()
{
Ativar = GetComponentInParent<AtaqueDoPlayer>().Atacando;
if (Ativar == true)
{
GetComponent<CapsuleCollider>().enabled = true;
TipoArma = gameObject.tag;
if (TipoArma == "Espada")
{
Dano = 15;
}
}
else
{
GetComponent<CapsuleCollider>().enabled = false;
}
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag(tag: "Inimigo"))
{
PlayerAcertou = true;
ContAcert += Time.deltaTime;
}
if (ContAcert > 3)
{
PlayerAcertou = false;
}
Debug.Log(message: "Espada acertou");
}
}
Este é o código que coloquei na arma. Ainda não decidi se deixarei o teste para averiguar qual a tag da arma ou se farei um script para cada tipo de arma. O que seria mais leve?Aqui tenho um script para controlar o dano no inimigo. Tentei ser o mais simples possível para evitar erros. Aceito sugestões de como deixar o código mais leve.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DadosInimigo : MonoBehaviour {
public static float VidaDoInimigo = 100;
public float VidaAtualInimigo;
public GameObject Arma;
// Use this for initialization
void Awake ()
{
VidaAtualInimigo = VidaDoInimigo;
}
// Update is called once per frame
void Update ()
{
DanoRecebido();
}
private void DanoRecebido()
{
if (Arma.GetComponent<Arma>().PlayerAcertou == true)
{
VidaAtualInimigo = VidaAtualInimigo - GetComponent<Arma>().Dano;
}
}
}
- Cacheie as classes que você utiliza, como a arma, o script de ataque, collider e tudo mais...
- A variável TipoArma, vi que não é utilizada em ou lugar, a não ser um... Caso não utilize em outra classe, eu sugiro que não há necessidade de cachea-la...
- Variáveis, para não serem confundidas com classes, métodos ou outras coisas, é recomendada que utilize a primeira letra minúscula, para melhor organização...
- Uma outra bem legal, que onde tu utiliza:Você pode trocar por apenas uma linha com esse método:
- Código:
if (ContAcert > 3)
PlayerAcertou = false;
- Código:
PlayerAcertou = ContAcert <= 3;
No caso eu mudei apenas os operadores, que denomina que caso seja menor ou igual a 3 será sempre igual...
Basicamente é isso, não testei seu code nem algo do tipo, por tempo, mas algumas dicas para te ajudar... Qualquer coisa estamos ai!
Um pequeno erro:
No caso eu mudei apenas os operadores, que denomina que caso seja menor ou igual a 3 será sempre true, ao contrário(como no antigo, maior que 3) será false...
E vi também que o objeto Arma no segundo script, está pegando o script Arma nele, é mais fácil tu declarar o script direto...
Re: Dano no inimigo
Obrigado pelas sugestões, ainda não tive tempo para testar, mas não entendi a ultima parte do que você disse:
"...vi também que o objeto Arma no segundo script, está pegando o script Arma nele, é mais fácil tu declarar o script direto..."
Quando testei meu script acusou um erro exatamente nesta parte:
Acredito que eu tenha errado em algo exatamente na sintaxe. Agradeceria se pudessem me explicar o que esta errado, pois ainda sou um iniciante em C##.
"...vi também que o objeto Arma no segundo script, está pegando o script Arma nele, é mais fácil tu declarar o script direto..."
Quando testei meu script acusou um erro exatamente nesta parte:
- Código:
VidaAtualInimigo = VidaAtualInimigo - GetComponent<Arma>().Dano;
Acredito que eu tenha errado em algo exatamente na sintaxe. Agradeceria se pudessem me explicar o que esta errado, pois ainda sou um iniciante em C##.
arnaldojunior- Membro
- PONTOS : 2445
REPUTAÇÃO : 2
Respeito as regras :
Re: Dano no inimigo
arnaldojunior escreveu:Obrigado pelas sugestões, ainda não tive tempo para testar, mas não entendi a ultima parte do que você disse:
"...vi também que o objeto Arma no segundo script, está pegando o script Arma nele, é mais fácil tu declarar o script direto..."
Quando testei meu script acusou um erro exatamente nesta parte:
- Código:
VidaAtualInimigo = VidaAtualInimigo - GetComponent<Arma>().Dano;
Acredito que eu tenha errado em algo exatamente na sintaxe. Agradeceria se pudessem me explicar o que esta errado, pois ainda sou um iniciante em C##.
A sim... No caso eu quis dizer, que onde tu colocou
- Código:
public GameObject Arma;
Você pode substituir por
- Código:
public Arma m_arma;
E chamar depois assim:
- Código:
if(m_arma.PlayerAcertou)
Que não há necessidade de pegar o component, já que foi declarado antes... E quando são valores do tipo bool, não precisa colocar == true, apenas declara do jeito acima para verdadeiro, ou coloque o "!" antes, se quiser falso, ex:
- Código:
if(!m_arma.PlayerAcertou){
Debug.Log("Value false");
}
No caso do erro, não vejo erros, tente assim, caso declare da forma que citei:
- Código:
VidaAtualInimigo = (VidaAtualInimigo - m_arma.Dano);
Re: Dano no inimigo
Eu segui suas sugestões e quase tudo esta funcionando, mas percebi que meu sistema de dano pecava na parte de definir o dano. como eu estava tentando definir o dano diretamente na vida do inimigo, ele acabava tomando dano continuamente mesmo que eu atacasse apenas uma vez. Para resolver isso acredito que terei de contabilizar o dano no script da colisão, mas como este esta na arma estou tendo problemas para acessar a variável de vida do inimigo.
Não sei como faze-lo pois cada tipo de inimigo terá um valor e um script próprio. Não sei se posso torna-lo um script padrão com variável publica e alterar seu valor via Inspector para cada inimigo ou se existe um método melhor.
Não sei como faze-lo pois cada tipo de inimigo terá um valor e um script próprio. Não sei se posso torna-lo um script padrão com variável publica e alterar seu valor via Inspector para cada inimigo ou se existe um método melhor.
arnaldojunior- Membro
- PONTOS : 2445
REPUTAÇÃO : 2
Respeito as regras :
Re: Dano no inimigo
No caso tu está checando toda hora no Update, por isso deve estar recebendo tanto dano assim... Em vez de passar o método lá, crie uma Coroutine para dar um delay e passe dentro do OnTriggerEnter, que ficará mais otimizado... Na questão dos inimigos, sim, o melhor criar um script para todos os inimigos, com variáveis editáveis de acordo com o prefab do mesmo...arnaldojunior escreveu:Eu segui suas sugestões e quase tudo esta funcionando, mas percebi que meu sistema de dano pecava na parte de definir o dano. como eu estava tentando definir o dano diretamente na vida do inimigo, ele acabava tomando dano continuamente mesmo que eu atacasse apenas uma vez. Para resolver isso acredito que terei de contabilizar o dano no script da colisão, mas como este esta na arma estou tendo problemas para acessar a variável de vida do inimigo.
Não sei como faze-lo pois cada tipo de inimigo terá um valor e um script próprio. Não sei se posso torna-lo um script padrão com variável publica e alterar seu valor via Inspector para cada inimigo ou se existe um método melhor.
Re: Dano no inimigo
Obrigado. Consegui arrumar o sistema, tive de arrumar mais algumas coisinhas para evitar bugs, mas por enquanto esta tudo ok. estou implementando outros sistemas e assim que testar melhor o sistema de dano eu posto ele para referencia.
arnaldojunior- Membro
- PONTOS : 2445
REPUTAÇÃO : 2
Respeito as regras :
Re: Dano no inimigo
Um sistema de vidas eficiente seria criar uma classe base de entidades que levam dano, essas entidades herdariam uma interface IDamageable, essa interface define o metodo de hit e o campo de vida. Depois, faca um sistema de Eventos usando Delegates como handlers e dispare o evento assim que o player morrer, notificando todas as classes inscritas no Evento, assim podendo atualizar elas como por exemplo UI.
Dica: Pesquise sobre Delegates, Events, Interfaces e Herança.
Dica: Pesquise sobre Delegates, Events, Interfaces e Herança.

» Ataque e Dano no Inimigo [HELP]
» dano inimigo 2D
» Dano do inimigo
» (Ajuda) Dano ao inimigo
» Inimigo não recebe dano(RESOLVIDO)
» dano inimigo 2D
» Dano do inimigo
» (Ajuda) Dano ao inimigo
» Inimigo não recebe dano(RESOLVIDO)
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos