Como fazer o clique não acertar o inimigo atrás de um objeto (hit collider)
3 participantes
Página 1 de 1
Como fazer o clique não acertar o inimigo atrás de um objeto (hit collider)
Estou criando um jogo onde os inimigos saem de uma árvore, mas ao clicar já na árvore eu consigo matar eles antecipadamente e eu não quero isso. O jogo é 2D estilo aqueles jogos antigos onde o inimigo sai em alguma parte da tela e você atira nele simplesmente clicando.
Esta é a parte do código que eu utilizo para atirar no inimigo:
Eu tentei também por uma tag na árvore, mas não adiantou nada. Alguém poderia me ajudar?
Esta é a parte do código que eu utilizo para atirar no inimigo:
- Código:
if (hit.collider.gameObject.CompareTag("Enemy"))
{
hit.collider.GetComponent<Enemies>().DeathState(); //dar dano no inimigo
Score.instance.scoreCounter++;
}
Eu tentei também por uma tag na árvore, mas não adiantou nada. Alguém poderia me ajudar?
darkrj- Avançado
- PONTOS : 2326
REPUTAÇÃO : 15
Respeito as regras :
Re: Como fazer o clique não acertar o inimigo atrás de um objeto (hit collider)
Acredito que voce tenha 3 jeitos de resolver este problema, sendo esses, colocando um box collider e ativando o IsTrigger nas arvores e criando um novo script que modifica uma bool pelo script do player, o segundo jeito pode ser criar um temporizador quando o inimigo é instanciado que ao finalizar ativa altera uma bool ou parecido com sua primeira solução, colocando uma tag a arvore e uma instrução if para o raycast.
Exemplos:
1° Jeito
Utilizando o Box Colider:
Adicione um Box Collider as árvores e ative os IsTrigger (lembrando que o IsTrigger só funciona se o colisor ou ele mesmo possuir um rigidbody)
No seu script principal, que possui o código de dar dano ao inimigo, adicione uma nova bool:
E atribua ela ao seu código de raycast:
Depois crie um novo script com qualquer nome (dei o nome de árvore) e coloque a void OnTriggerEnter() e OnTriggerExit():
2° Jeito
Criando um Temporizador:
Bom, eu nao sei como voce instancia o inimigo, mas voce pode fazer que ao instanciar o inimigo chame o temporizador através de uma rotina utilizando uma bool, porém nao estatica que nao pode atacar o inimigo. Eu nao sei como voce fez para instaciar o inimigo então nao precisa copiar como utlizei no exemplo abaixo, apenas veja o temporizador. Exemplo:
Criando o Temporizador:
Depois disso no inspector voce pode colocar no time o valor em segundos de quanto demora para o inimigo sair da árvore.
3° Jeito
Adicionando a tag "Arvore" as arvores:
Depois de adicionar a tag as árvores, voce pode colocar uma instrução if na colisão com o raycast através de uma bool, olhe o exemplo:
Exemplos:
1° Jeito
Utilizando o Box Colider:
Adicione um Box Collider as árvores e ative os IsTrigger (lembrando que o IsTrigger só funciona se o colisor ou ele mesmo possuir um rigidbody)
No seu script principal, que possui o código de dar dano ao inimigo, adicione uma nova bool:
- Código:
public static bool canDamageEnemy;
E atribua ela ao seu código de raycast:
- Código:
if(canDamageEnemy == true)
{
if (hit.collider.gameObject.CompareTag("Enemy"))
{
hit.collider.GetComponent<Enemies>().DeathState(); //dar dano no inimigo
Score.instance.scoreCounter++;
}
}
Depois crie um novo script com qualquer nome (dei o nome de árvore) e coloque a void OnTriggerEnter() e OnTriggerExit():
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Arvore : MonoBehaviour
{
void OnTriggerEnter(Collider other)
{
if(other.tag == "Enemy")
{
yourScript.canDamageEnemy = false;
}
}
void OnTriggerExit(Collider other)
{
if(other.tag == "Enemy")
{
yourScript.canDamageEnemy = true;
}
}
}
2° Jeito
Criando um Temporizador:
Bom, eu nao sei como voce instancia o inimigo, mas voce pode fazer que ao instanciar o inimigo chame o temporizador através de uma rotina utilizando uma bool, porém nao estatica que nao pode atacar o inimigo. Eu nao sei como voce fez para instaciar o inimigo então nao precisa copiar como utlizei no exemplo abaixo, apenas veja o temporizador. Exemplo:
Criando o Temporizador:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class YourScript: MonoBehaviour
{
public float time;
private float countdown;
public GameObject enemy;
private bool canDamageEnemy;
private bool canInstantiateEnemy = true;
void Start()
{
countdown = time;
}
void Update()
{
InstantiateEnemy();
RaycastHit2D hit;
if (canDamageEnemy == true)
{
if (hit.collider.gameObject.CompareTag("Enemy"))
{
hit.collider.GetComponent<Enemies>().DeathState(); //dar dano no inimigo
Score.instance.scoreCounter++;
}
}
}
void InstantiateEnemy()
{
time -= Time.deltaTime;
if(time > 0)
{
canDamageEnemy = false;
}
else if(time <= 0)
{
canDamageEnemy = true;
}
if(canInstantiateEnemy == true)
{
Instantiate(enemy);
time = countdown;
canInstantiateEnemy = false;
StartCoroutine(WaitToInstatiateEnemy());
}
}
IEnumerator WaitToInstatiateEnemy()
{
yield return new WaitForSeconds(30);
canInstantiateEnemy = true;
}
}
Depois disso no inspector voce pode colocar no time o valor em segundos de quanto demora para o inimigo sair da árvore.
3° Jeito
Adicionando a tag "Arvore" as arvores:
Depois de adicionar a tag as árvores, voce pode colocar uma instrução if na colisão com o raycast através de uma bool, olhe o exemplo:
- Código:
private bool canDamageEnemy;
if (hit.collider.gameObject.CompareTag("Arvore"))
{
canDamageEnemy = false;
}
else
{
canDamageEnemy = true;
}
if(canDamageEnemy == true)
{
if (hit.collider.gameObject.CompareTag("Enemy"))
{
hit.collider.GetComponent<Enemies>().DeathState(); //dar dano no inimigo
Score.instance.scoreCounter++;
}
}
Última edição por Pokedlg em Sex Mar 05, 2021 8:36 pm, editado 1 vez(es)
Pokedlg- ProgramadorMaster
- PONTOS : 2339
REPUTAÇÃO : 198
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: Como fazer o clique não acertar o inimigo atrás de um objeto (hit collider)
@Pokedlg mas eu acho que do 1 jeito não funcionaria pois apareceu o seguinte erro no console: Assets\Prefabs\teste2.cs(19,20): error CS0122: 'teste1.canDamageEnemy' is inaccessible due to its protection level
creio que para resolver basta apenas deixar a variável estática como publica
creio que para resolver basta apenas deixar a variável estática como publica
Re: Como fazer o clique não acertar o inimigo atrás de um objeto (hit collider)
Muito bem lembrado, obrigado por avisar! Editei. vlw
Pokedlg- ProgramadorMaster
- PONTOS : 2339
REPUTAÇÃO : 198
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: Como fazer o clique não acertar o inimigo atrás de um objeto (hit collider)
Eu utilizei o método 1 e 3 e acabou não dando certo. O método 2 não utilizarei pois não é por timer, mas de qualquer forma agradeço pela ajuda. Continuarei tentando aqui outras formas.
PS: O método 3 foi o método que eu tentei antes de fazer o post, o engraçado é que pra mim esse era o que era mais pra funcionar... anyways...
PS: O método 3 foi o método que eu tentei antes de fazer o post, o engraçado é que pra mim esse era o que era mais pra funcionar... anyways...
darkrj- Avançado
- PONTOS : 2326
REPUTAÇÃO : 15
Respeito as regras :
Re: Como fazer o clique não acertar o inimigo atrás de um objeto (hit collider)
Atualização: Resolvi meu problema, basicamente eu tava pegando e colocando o colisor do tilemap, nisso eu tinha colocado também o composite collider, isso fazia com que apenas envolta da árvore estivesse com colisor, o fantasma como se escondia no meio dela, não era afetado pelo código. Utilizei o exemplo 3 mesmo e funcionou. Obrigado pela ajuda!
darkrj- Avançado
- PONTOS : 2326
REPUTAÇÃO : 15
Respeito as regras :
Pokedlg- ProgramadorMaster
- PONTOS : 2339
REPUTAÇÃO : 198
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Tópicos semelhantes
» Como fazer para um objeto não colidir com um "collider" e o outro objeto si
» Acertar apenas um componente Collider2D em objeto com mais de um Collider
» Como fazer com que collider detecte colisao de objeto especifico?
» OLÁ! Como fazer um objeto (lazer no meu caso) cortar toda vez que passar em um collider?
» Fazer objeto com textura fica atrás de tudo na cena
» Acertar apenas um componente Collider2D em objeto com mais de um Collider
» Como fazer com que collider detecte colisao de objeto especifico?
» OLÁ! Como fazer um objeto (lazer no meu caso) cortar toda vez que passar em um collider?
» Fazer objeto com textura fica atrás de tudo na cena
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos