Detectando Colisão da Arma com o Inimigo
3 participantes
Página 1 de 1
Detectando Colisão da Arma com o Inimigo
Bom dia!
Estou com um problema no meu jogo 2D.
Tenho um objeto pai que é o personagem jogável, este objeto possui os seus filhos que são as armas (que possuem seus próprios colisores e que são ativados somente quando é executada uma animação de ataque). Estou com dois problemas que não consigo resolver.
1. Ao atacar, o colisor da arma está colidindo com objetos que somente o personagem deveria colidir, mesmo eu configurando as armas para colidir somente com a tag "inimigos". Por exemplo, se tem um item coletável na cena, e eu der uma espadada nele, ele será coletado. Eu gostaria que o item fosse coletado somente quando entrar em colisão direta com o personagem. Obs. O Script do personagem está usando a função OnTriggerEnter2D para detectar a colisão com a tag "coletaveis".
2. Se o ataque com as armas acertam os inimigos, o personagem também recebe dano. Obs. O script do inimigo está usando a função OntriggerEnter2D para detectar a colisão com a tag "arma" e somente as armas estão configuradas com esta tag.
Obrigado!
Estou com um problema no meu jogo 2D.
Tenho um objeto pai que é o personagem jogável, este objeto possui os seus filhos que são as armas (que possuem seus próprios colisores e que são ativados somente quando é executada uma animação de ataque). Estou com dois problemas que não consigo resolver.
1. Ao atacar, o colisor da arma está colidindo com objetos que somente o personagem deveria colidir, mesmo eu configurando as armas para colidir somente com a tag "inimigos". Por exemplo, se tem um item coletável na cena, e eu der uma espadada nele, ele será coletado. Eu gostaria que o item fosse coletado somente quando entrar em colisão direta com o personagem. Obs. O Script do personagem está usando a função OnTriggerEnter2D para detectar a colisão com a tag "coletaveis".
2. Se o ataque com as armas acertam os inimigos, o personagem também recebe dano. Obs. O script do inimigo está usando a função OntriggerEnter2D para detectar a colisão com a tag "arma" e somente as armas estão configuradas com esta tag.
Obrigado!
marlok3d- Iniciante
- PONTOS : 2206
REPUTAÇÃO : 0
Respeito as regras :
Re: Detectando Colisão da Arma com o Inimigo
Poderia mostrar o script?
yurinogueira- Membro
- PONTOS : 2495
REPUTAÇÃO : 11
Respeito as regras :
Re: Detectando Colisão da Arma com o Inimigo
- Código:
//Script do Player
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class playerScript : MonoBehaviour
{
public bool getHit = false;
private _GameController _GameController;
private Animator playerAnimator;
private Rigidbody2D playerRb;
private SpriteRenderer sRender;
[Header("Mecanica do Personagem")]
public int vidaAtual;
public int vidaPersonagem;
public Transform groundCheck; //objeto responsável por detectar se o personagem está sobre uma superfície
public LayerMask whatIsGround;//indica o que é superfície para o teste do grounded
public float startSpeed; //velocidade inicial do personagem
public float speed; //velocidade de movimento do personagem
public float jumpForce; //Força aplicada para o pulo do personagem
public bool jumping; //verifica se o personagem está pulando
public bool grounded; //indica se o personagem está pisando em alguma superfície
public bool attacking; // indica se o personagem está atacando
public bool lookLeft; //indica se o personagem está virado para esquerda
public int idAnimation; //indica o ID da animação
private float h, v; //variaveis de movimento horizontal e vertical
public Collider2D standing, crounching; //colisor em pé e colisor agaixado
public Transform hand;
private Vector3 dir = Vector3.right; //cria uma variavel "direção" e indica que o valor inicial dela é "direita"
//Sistema de Ataque
public GameObject[] armas;
// Start is called before the first frame update
void Start()
{
vidaAtual = vidaPersonagem;
speed = startSpeed;
_GameController = FindObjectOfType(typeof(_GameController)) as _GameController;
playerAnimator = GetComponent<Animator>(); // a variavel playerAnimator recebe o componente Animator
playerRb = GetComponent<Rigidbody2D>(); // a variavel playerRb recebe o componente Rigidbody2D
sRender = GetComponent<SpriteRenderer>();
foreach (GameObject o in armas)
{
o.SetActive(false); //desabilita os colisores das armas ao iniciar o jogo
}
}
public void FixedUpdate()
{
grounded = Physics2D.OverlapCircle(groundCheck.position, 0.02f, whatIsGround); //cria um circulo para detectar colisão com a layer whatisGround
playerRb.velocity = new Vector2(h * speed, playerRb.velocity.y);
}
// Update is called once per frame
void Update()
{
h = Input.GetAxisRaw("Horizontal"); // Esquerda e Direita
v = Input.GetAxisRaw("Vertical"); //Cima e Baixo
jumping = !grounded;
//Controle do Personagem
if (h > 0 && lookLeft == true && attacking == false) //se apertar para direita e o personagem estiver olhando para esquerda inverte a posição
{
flip();
}
else if (h < 0 && lookLeft == false && attacking == false) //se apertar para esquerda e o personagem estiver olhando para direita inverte a posição
{
flip();
}
if (v < 0) //se estiver apertando para baixo aplica a animação de agaichado
{
idAnimation = 2;
if (grounded == true) //se estiver abaixo e pisando no chão ele não pode se mover na horizontal
{
h = 0;
}
}
else if (h != 0) //se estiver apertando para esquerda ou direita aplica a animação de andando
{
idAnimation = 1;
}
//se estiver parado aplica a animação de Idle
else
{
idAnimation = 0;
}
if (Input.GetButtonDown("Fire1") && attacking == false)
{
playerAnimator.SetTrigger("atack");
}
//se o personagem estiver atacando, ele não pode se movimentar
if (attacking == true)
{
h = 0;
}
if (getHit == true) //se estiver apanhando
{
h = 0;
}
//Pulo
if (Input.GetButtonDown("Jump") && grounded == true && attacking == false)
{
playerRb.velocity = Vector2.up * jumpForce;
}
//Ativando Animações
playerAnimator.SetBool("grounded", grounded); //Utiliza a vartiavel Grounded para armazenar um valor na variavel do animator "grounded"
playerAnimator.SetInteger("idAnimation", idAnimation);
playerAnimator.SetFloat("speedY", playerRb.velocity.y);
}
void atack(int atk)
{
switch (atk)
{
case 0:
attacking = false;
armas[2].SetActive(false); //desabilita o collider da arma ao terminar o atack
break;
case 1:
attacking = true;
break;
}
}
void flip()
{
lookLeft = !lookLeft; //inverte o valor da variavel lookLeft
float x = transform.localScale.x;
x *= -1; //inverte o sinal do escale x (- +)
transform.localScale = new Vector3(x, transform.localScale.y, transform.localScale.z);
dir.x = x; // muda a direção do raycast usado na função interagir() da esquerda para direita ou vice versa
}
//FUNÇÕES PARA TRATAR TRIGGERS
private void OnTriggerEnter2D(Collider2D col) // executada uma vez ao entrar em colisão
{
switch (col.gameObject.tag)
{
case "Coletaveis":
col.gameObject.SendMessage("coletar", SendMessageOptions.DontRequireReceiver); http://SendMessageOptions.DontRequireReceiver evita erros caso o objeto não tenha a função
break;
case "inimigo":
if (getHit == false)
{
getHit = true;
vidaAtual = -1;
playerAnimator.SetTrigger("hit");//chama a aninação de hit
}
break;
}
}
private void OnTriggerEstay2D(Collider2D col)
{
switch (col.gameObject.tag)
{
case "Coletaveis":
col.gameObject.SendMessage("coletar", SendMessageOptions.DontRequireReceiver); http://SendMessageOptions.DontRequireReceiver evita erros caso o objeto não tenha a função
break;
case "inimigo":
if (getHit == false)
{
getHit = true;
vidaAtual = -1;
playerAnimator.SetTrigger("hit");//chama a aninação de hit
}
break;
}
}
private void OnTriggerExit2D(Collider2D col) // executada uma vez ao sair da colisão
{
}
void controleArma(int id)
{
foreach (GameObject o in armas)
{
o.SetActive(false); //desabilita os colisores das armas
}
armas[id].SetActive(true); //ativa somente o collider correspondente ao frame atual
}
}
- Código:
//Script do Inimigo
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class controleInimigo : MonoBehaviour
{
private Animator animator;
[Header("Configuração de Vida")]
public int vidaInimigo;
public int vidaAtual;
[Header("Configuração da IA")]
public bool died;
private bool getHit;
public float tempoDeInvulnerabilidade;
// Start is called before the first frame update
void Start()
{
animator = GetComponent<Animator>();
vidaAtual = vidaInimigo;
}
// Update is called once per frame
private void Update()
{
if (vidaAtual <= 0)
{
died = true;
Destroy(this.gameObject, 2);
}
}
private void OnTriggerEnter2D(Collider2D col)
{
switch (col.gameObject.tag)
{
case "arma":
if (getHit == false)
{
getHit = true;
vidaAtual = vidaAtual - 1;
animator.SetTrigger("hit");//chama a aninação de hit
StartCoroutine("invulneravel");
}
break;
}
}
IEnumerator invulneravel()
{
yield return new WaitForSeconds(tempoDeInvulnerabilidade);
getHit = false;
}
}
marlok3d- Iniciante
- PONTOS : 2206
REPUTAÇÃO : 0
Respeito as regras :
Re: Detectando Colisão da Arma com o Inimigo
Talvez uma saída seja detectar colisão por meio de Raycast, e utilizar layerMask para decidir quais objetos colidem com o quê.
Tópicos semelhantes
» Como fazer o Tiro do "INIMIGO" seguir o Flip de uma Arma ?
» Unity2D não detectando colisões
» OnTriggerExit2D detectando collider desativado
» Script de health de inimigo sendo acessado mesmo sem acerta o inimigo
» Trigger detectando apenas o character controller
» Unity2D não detectando colisões
» OnTriggerExit2D detectando collider desativado
» Script de health de inimigo sendo acessado mesmo sem acerta o inimigo
» Trigger detectando apenas o character controller
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos