Problema em causar dano no player
2 participantes
Página 1 de 1
Problema em causar dano no player
Oi, boa tarde, eu gostaria de ajuda para saber como eu poderia fazer com que quando o inimigo atacasse o player ele desse dano de maneira correta. Eu to fazendo um jogo 2D e esses são os códigos.
Comportamento do Player:
E esse é o ataque do inimigo:
Esse script ta no objeto filho dele que é um collider pra identificar quando deve setar a animação de ataque e quando deve dar o dano, mas quando ele da dano, em questão de um segundo ele deixa o player com a vida negativa, gostaria de um delay ou alguma coisa para deixar mais como os jogos que já existem.
Muito obrigada :D
Comportamento do Player:
- Código:
[size=14]using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerBehaviour : MonoBehaviour
{
Rigidbody2D rb;
Animator anim;
SpriteRenderer spriteRenderer;
public bool movingLeft = false;
public bool movingRight = false;
public bool isAttacking = false;
public float speed = 6f;
public Vector3 moveDirectionLeft = Vector3.left;
public Vector3 moveDirectionRight = Vector3.right;
public GameObject sword;
EnemyBehaviour enemy;
public int maxHealth = 50;
public int currentHealth;
public HealthBar healthBar;
public GameObject gameOverPanel;
void Start () {
movingLeft = false;
movingRight = false;
isAttacking = false;
spriteRenderer = GetComponent<SpriteRenderer>();
anim = GetComponent<Animator>();
rb = GetComponent<Rigidbody2D>();
enemy = GetComponent<EnemyBehaviour>();
currentHealth = maxHealth;
healthBar.SetMaxHealth(maxHealth);
}
void Update () {
if (movingLeft == true) { // LEFT BUTTON //
anim.SetBool ("Walking", true);// walk left
transform.position += Vector3.left * 5.0f * Time.deltaTime;
//transform.Translate (moveDirectionLeft * speed * Time.deltaTime);
spriteRenderer.flipX = true;
}
else if (movingLeft == false) {
speed = 0;
anim.SetBool ("Walking", false); // goes back to idle
}
if (movingRight == true) { // RIGHT BUTTON //
anim.SetBool ("Walking", true); // walks right
transform.position += Vector3.right * 5.0f * Time.deltaTime;
//transform.Translate (moveDirectionRight * speed * Time.deltaTime);
spriteRenderer.flipX = false;
}
else if (movingLeft == false) {
speed = 0;
anim.SetBool ("Walking", false); // goes back to idle
}
if(isAttacking == false)
{
anim.SetBool("Attacking", false);
if(movingLeft == true)
{
anim.SetBool ("Walking", true);
}
else if(movingRight == true)
{
anim.SetBool ("Walking", true);
}
else
{
anim.SetBool ("Walking", false);
}
}
if(currentHealth == 0)
{
gameOverPanel.SetActive(true);
}
}
public void TakeDamage(int damage)
{
currentHealth -= damage;
}
public void Damage()
{
healthBar.SetHealth(currentHealth);
}
public void limitLD() { // UI Button Event trigger - pointUp
movingLeft = false;
}
public void limitRD() { // UI Button Event trigger - pointUp
movingRight = false;
}
public void MoveLeft() { // UI Button Event trigger - pointDown
movingLeft = true;
movingRight = false;
}
public void MoveRight() { // UI Button Event trigger - pointDown
movingLeft = false;
movingRight = true;
}
public void Attack()
{
isAttacking = true;
if(isAttacking == true)
{
StartCoroutine(IsAttacking());
}
}
IEnumerator IsAttacking()
{
anim.SetBool("Attacking", true);
sword.SetActive(true);
yield return new WaitForSeconds(1f);
anim.SetBool("Attacking", false);
sword.SetActive(false);
}
}
[/size]
E esse é o ataque do inimigo:
Esse script ta no objeto filho dele que é um collider pra identificar quando deve setar a animação de ataque e quando deve dar o dano, mas quando ele da dano, em questão de um segundo ele deixa o player com a vida negativa, gostaria de um delay ou alguma coisa para deixar mais como os jogos que já existem.
- Código:
[size=14]using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyAttack : MonoBehaviour
{
EnemyBehaviour enemyBehaviour;
PlayerBehaviour player;
public int enemyAttack = 1;
void Start()
{
enemyBehaviour = gameObject.GetComponentInParent(typeof(EnemyBehaviour)) as EnemyBehaviour;
}
void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.CompareTag("Player") )
{
enemyBehaviour.anim.SetBool("isWalking", false);
enemyBehaviour.anim.SetBool("isAttacking", true);
}
}
void OnTriggerStay2D(Collider2D other)
{
player = other.gameObject.GetComponent<PlayerBehaviour>();
if(player != null)
{
player.TakeDamage(enemyAttack);
player.Damage();
}
}
void OnTriggerExit2D(Collider2D other)
{
enemyBehaviour.anim.SetBool("isAttacking", false);
enemyBehaviour.anim.SetBool("isWalking", true);
}
}
[/size]
Muito obrigada :D
AnaSenpai- Iniciante
- PONTOS : 2272
REPUTAÇÃO : 0
Respeito as regras :
Re: Problema em causar dano no player
Amigo seu código tem muita coisa desnecessária que pode afetar o desempenho do jogo, considere buscar alguns videos sobre o assunto.
Sobre a vida tem um jeito mais simples
Sobre a vida tem um jeito mais simples
- Código:
public int DAMAGE; // Aqui é um exemplo de variável para o dano
void OnTriggerEnter2D(Collider2D col)
{
if(col.tag == "Player")
{
col.GetComponent<PlayerBehaviour>().currentHealth -= DAMAGE;//Aqui o dano está sendo aplicado
}
}
mecjo- Membro
- PONTOS : 2644
REPUTAÇÃO : 10
Respeito as regras :
Re: Problema em causar dano no player
Esse script feito acima é para ser colocado na arma, quando o collider do player entrar no trigger da arma é puxado o script "PlayerBehaviour" (seu script de player) e adicionado uma subtração da vida.
mecjo- Membro
- PONTOS : 2644
REPUTAÇÃO : 10
Respeito as regras :
Tópicos semelhantes
» [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
» Não causar dano no 2º Inimigo
» Dano do player
» (Ajuda) dano ao player
» dano inimigo em player
» Não causar dano no 2º Inimigo
» Dano do player
» (Ajuda) dano ao player
» dano inimigo em player
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos