[RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
5 participantes
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
[RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
Pessoal, boa noite.
Tô tentando usar um script para causar dano em um inimigo e tomar dano do inimigo, mas estou com alguns problemas.
Primeiro problema: não consigo setar o tiro ou fazer com que quando é chamada a animação(sprites) do player atacando o tiro apareça.
Segundo problema: quando o enemy e o personagem ficam sobrepostos, não consigo fazer com que o player tome dano, sendo que ambos player e enemy estão em suas respectivas layers com seus respectivos capsule collider 2D e circle collider 2D.
Terceiro problema: quando o Player toca o inimigo, ou o contrário o inimigo toca o Player, o inimigo não pisca, como eu esperaria, parece que não encontra um ao outro.
A aba Inspector do Player está da seguinte maneira:
A aba Inspector do gameObject chamado Trigger que está dentro do Player:
O script do PlayerBehaviour.cs que está dentro do Player:
O script que encontra-se dentro do Trigger:
E o script que está dentro do inimigo, que também possui um circle collider 2D:
Valeu.
Tô tentando usar um script para causar dano em um inimigo e tomar dano do inimigo, mas estou com alguns problemas.
Primeiro problema: não consigo setar o tiro ou fazer com que quando é chamada a animação(sprites) do player atacando o tiro apareça.
Segundo problema: quando o enemy e o personagem ficam sobrepostos, não consigo fazer com que o player tome dano, sendo que ambos player e enemy estão em suas respectivas layers com seus respectivos capsule collider 2D e circle collider 2D.
Terceiro problema: quando o Player toca o inimigo, ou o contrário o inimigo toca o Player, o inimigo não pisca, como eu esperaria, parece que não encontra um ao outro.
A aba Inspector do Player está da seguinte maneira:
A aba Inspector do gameObject chamado Trigger que está dentro do Player:
O script do PlayerBehaviour.cs que está dentro do Player:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class PlayerBehaviour : MonoBehaviour {
private Rigidbody2D rb;
private Transform tr;
private Animator an;
public Transform verificaChao;
public Transform verificaParede;
public int health = 5;
public bool invunerable = false;
public bool isAlive = true;
private bool estaAndando;
private bool estaNoChao;
private bool estaNaParede;
private bool estaVivo;
private bool viradoParaDireita;
private bool DanoBool;
private bool PersonagemPiscando;
private bool MortoBool;
private bool AtacandoBool;
private bool AbrirPorta;
private bool Porta;
protected SpriteRenderer sprite;
private float axis;
public float velocidade;
public float forcaPulo;
public float raioValidaChao;
public float raioValidaParede;
//variaveis do tiro
public Transform bulletSpawn;
public GameObject bulletObject;
public float fireRate;
private float nextFire;
public LayerMask solido;
//void Awake(){
// rb = GetComponent<Rigidbody2D>();
// sprite = GetComponent<SpriteRenderer>();
// an = GetComponent<Animator>();
//}
// Use this for initialization
void Start () {
rb = GetComponent<Rigidbody2D>();
tr = GetComponent<Transform>();
an = GetComponent<Animator>();
AtacandoBool = true;
MortoBool = false;
AbrirPorta = false;
Porta = false;
estaVivo = true;
viradoParaDireita = true;
}
// Update is called once per frame
void Update () {
estaNoChao = Physics2D.OverlapCircle(verificaChao.position, raioValidaChao, solido);
estaNaParede = Physics2D.OverlapCircle(verificaParede.position, raioValidaParede, solido);
if (estaVivo){
axis = Input.GetAxisRaw("Horizontal");
estaAndando = Mathf.Abs(axis) > 0f;
//a linha debaixo determina que se o personagem está andando e não está virado para a direita, quando
//ele for virado para o outro lado o personagem deve virar e não caminhar de costas
if(axis > 0f && !viradoParaDireita)
Flip();
else if(axis < 0f && viradoParaDireita)
Flip();
if (Input.GetButtonDown("Jump") && estaNoChao)
rb.AddForce(tr.up * forcaPulo);
Animations();
}
if (MortoBool == false)
{
if (DanoBool == false)
{
an.SetFloat("Andando", Mathf.Abs(Input.GetAxis("Horizontal")));
}
if (health <= 0)
{
health = 0;
MortoBool = true;
an.SetBool("Morrendo", true);
this.GetComponent<BoxCollider2D>().offset = new Vector2(-0.01f, -0.41f);
this.GetComponent<BoxCollider2D>().size = new Vector2(0.87f, 0.15f);
this.GetComponent<BoxCollider2D>().sharedMaterial = null;
this.gameObject.layer = LayerMask.NameToLayer("PersonagemMorto");
}
}else
{
health = 0;
}
//botão Fire1 já é pré-designado pela Unity, a linha abaixo diz que ao se apertar ele chamará a função Fire()
if(Input.GetButton("Fire1") && Time.time > nextFire){
Fire();
}
}
void FixedUpdate(){
if (isAlive){
if(estaAndando && !estaNaParede){
if(viradoParaDireita){
rb.velocity = new Vector2(velocidade, rb.velocity.y);
}else{
rb.velocity = new Vector2(-velocidade, rb.velocity.y);
}
}
an.SetBool("Pulando", rb.velocity.y !=0f);
if(Input.GetButton("Fire1") && Time.time > nextFire){
Fire();
}
}
}
void Flip(){
viradoParaDireita = !viradoParaDireita;
tr.localScale = new Vector2(-tr.localScale.x, tr.localScale.y);
sprite.flipX = !sprite.flipX;
//verifica a posição do personagem e faz com que o tiro seja dado de cada lado corretamente
if(!sprite.flipX)
bulletSpawn.position = new Vector3(this.transform.position.x + 0.1f,bulletSpawn.transform.position.y, bulletSpawn.transform.position.z );
else
bulletSpawn.position = new Vector3(this.transform.position.x - 0.1f,bulletSpawn.transform.position.y, bulletSpawn.transform.position.z );
}
//função para chamar a animação do tiro
void Fire(){
an.SetTrigger("Fire");
nextFire = Time.time + fireRate;
//a linha debaixo é para dizer qual objeto será instanciado, a posição e a rotação do mesmo
GameObject cloneBullet = Instantiate(bulletObject, bulletSpawn.position, bulletSpawn.rotation);
//a linha debaixo é para determinar que o tiro possa ser dado para cada lado e não só para um lado
if(sprite.flipX)
cloneBullet.transform.eulerAngles = new Vector3(0,0,180);
}
void Animations(){
an.SetBool("Andando", (estaNoChao && estaAndando));
an.SetBool("Pulando", !estaNoChao);
an.SetFloat("VelVertical", rb.velocity.y);
}
IEnumerator Damage(){
for(float i = 0f; i < 1f; i += 0.1f ){
sprite.enabled = false;
yield return new WaitForSeconds(0.1f);
sprite.enabled = true;
yield return new WaitForSeconds(0.1f);
}
invunerable = false;
}
public void DamagePlayer(){
if(isAlive){
invunerable = true;
health--;
StartCoroutine(Damage());
if(health < 1){
isAlive = false;
an.SetTrigger("Morrendo");
Invoke("ReloadLevel", 3f);
}
}
}
void ReloadLevel(){
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
}
O script que encontra-se dentro do Trigger:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerTrigger : MonoBehaviour {
private PlayerBehaviour player;
void Awake(){
player = GameObject.Find("Player").GetComponent<PlayerBehaviour>();
}
void onTriggerEnter2D(Collider2D other)
{
//as linhas debaixo fazem com que o player ao tocar no inimigo sofra dano
if(other.CompareTag("Enemy")){
if(!player.invunerable){
player.DamagePlayer();
}
}
}
}
E o script que está dentro do inimigo, que também possui um circle collider 2D:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Mosquito : EnemyBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
protected override void Update () {
base.Update();
if(isMoving){
transform.position = Vector3.MoveTowards(transform.position, player.position, Mathf.Abs(speed) * Time.deltaTime);
}
//float distance = PlayerDistance();
//isMoving = (distance <= distanceAttack);
//if(isMoving){
//if ((player.position.x > transform.position.x && sprite.flipX) || (player.position.x < transform.position.x && !sprite.flipX)){
// flip();
//}
//}
}
//void FixedUpdate(){
//if(isMoving){
//rb2d.velocity = new Vector2(speed, rb2d.velocity.y);
//}
//}
}
internal struct OnTriggerStay2D(Collider2D Coll)
{
(Coll.gameObject.tag == "Player")
{
Atacando = true;
ColisorInimigo.enabled = false;
yield return new WaitForSeconds(0.01f);
transform.gameObject.tag = "Dano";
Atacar.gameObject.SetActive(false);
yield return new WaitForSeconds(0.2f);
Atacando = false;
yield return new WaitForSeconds(0.9f);
ColisorInimigo.enabled = true;
Atacar.gameObject.SetActive(true);
transform.gameObject.tag = "Mosquito";
}
//if (Coll.gameObject.tag == "Espada")
// {
// Vida = 0;
//}
}
}
Valeu.
Última edição por MarcosSchultz em Qua Jun 27, 2018 1:21 am, editado 2 vez(es) (Motivo da edição : Resolvido)
kenau- Iniciante
- PONTOS : 2389
REPUTAÇÃO : 2
Respeito as regras :
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
No comando voce colocou __ colocando -= 1
EX
EX
- Código:
public void DamagePlayer(){
if(isAlive){
invunerable = true;
health-= 1;
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
É OnTriggerEnter2D e não onTriggerEnter2D
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
E o tiro não apareceu pq vc não anexou o prefab da bala nem o transform da onde ela vai ser instanciada no script.
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
Obrigado pelas sugestões Callyde Jr e MayLeone. Ocorre agora que está dando outro erro, no arquivo Mosquito.cs, que tem por código o seguinte:
Mosquito.cs(36,36): error CS1644: Feature `primary constructor' cannot be used because it is not part of the C# 4.0 language specification .
Alguma ideia do porquê isto está acontecendo? E como faço para solucionar este problema?
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Mosquito : EnemyBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
protected override void Update () {
base.Update();
if(isMoving){
transform.position = Vector3.MoveTowards(transform.position, player.position, Mathf.Abs(speed) * Time.deltaTime);
}
//float distance = PlayerDistance();
//isMoving = (distance <= distanceAttack);
//if(isMoving){
//if ((player.position.x > transform.position.x && sprite.flipX) || (player.position.x < transform.position.x && !sprite.flipX)){
// flip();
//}
//}
}
//void FixedUpdate(){
//if(isMoving){
//rb2d.velocity = new Vector2(speed, rb2d.velocity.y);
//}
//}
}
internal struct OnTriggerStay2D(Collider2D Coll)
{
(Coll.gameObject.tag == "Player")
{
Atacando = true;
ColisorInimigo.enabled = false;
yield return new WaitForSeconds(0.01f);
transform.gameObject.tag = "Dano";
Atacar.gameObject.SetActive(false);
yield return new WaitForSeconds(0.2f);
Atacando = false;
yield return new WaitForSeconds(0.9f);
ColisorInimigo.enabled = true;
Atacar.gameObject.SetActive(true);
transform.gameObject.tag = "Mosquito";
}
//if (Coll.gameObject.tag == "Espada")
// {
// Vida = 0;
//}
}
Mosquito.cs(36,36): error CS1644: Feature `primary constructor' cannot be used because it is not part of the C# 4.0 language specification .
Alguma ideia do porquê isto está acontecendo? E como faço para solucionar este problema?
kenau- Iniciante
- PONTOS : 2389
REPUTAÇÃO : 2
Respeito as regras :
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
Já fucei a documentação do unity atrás de uma solução para este erro, mas não encontrei. A única coisa que encontrei foi que o
- Código:
(Coll.gameObject.tag == "Player")
kenau- Iniciante
- PONTOS : 2389
REPUTAÇÃO : 2
Respeito as regras :
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
Tente deletar o internal struct antes do OnTriggerStay e colocar void no lugar, talvez resolva.
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
Obrigado MayLeone, mas quando faço isso recebo o seguinte erro:
error CS1525: Unexpected symbol `void'
error CS1525: Unexpected symbol `void'
kenau- Iniciante
- PONTOS : 2389
REPUTAÇÃO : 2
Respeito as regras :
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
Encontrei que as {} estavam em local errado, mas ainda assim, quando coloco estas chaves no local certo e escrevo internal void no lugar de internal struct, recebo a seguinte mensagem de erro:
Assets/Scripts/Mosquito.cs(43,41): error CS1525: Unexpected symbol `{'
O código está desta forma:
Assets/Scripts/Mosquito.cs(43,41): error CS1525: Unexpected symbol `{'
O código está desta forma:
- Código:
internal void OnTriggerStay2D(Collider2D Coll)
{
(Coll.gameObject.tag == "Player"){
Atacando = true;
ColisorInimigo.enabled = false;
yield return new WaitForSeconds(0.01f);
transform.gameObject.tag = "Dano";
Atacar.gameObject.SetActive(false);
yield return new WaitForSeconds(0.2f);
Atacando = false;
yield return new WaitForSeconds(0.9f);
ColisorInimigo.enabled = true;
Atacar.gameObject.SetActive(true);
transform.gameObject.tag = "Mosquito";
}
//if (Coll.gameObject.tag == "Espada")
// {
// Vida = 0;
//}
}
kenau- Iniciante
- PONTOS : 2389
REPUTAÇÃO : 2
Respeito as regras :
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
No caso a linha 43 neste último código que passei é o equivalente à linha 7.
kenau- Iniciante
- PONTOS : 2389
REPUTAÇÃO : 2
Respeito as regras :
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
Isso nunca vai funcionar sem o if antes da condição, deves colocar assim:
- Código:
if (Coll.gameObject.tag == "Player")
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
Então mas quando eu coloco o if dá o seguinte erro:
Mosquito.cs(42,7): error CS1624: The body of `Mosquito.OnTriggerStay2D(UnityEngine.Collider2D)' cannot be an iterator block because `void' is not an iterator interface type
O código está deste jeito:
Mosquito.cs(42,7): error CS1624: The body of `Mosquito.OnTriggerStay2D(UnityEngine.Collider2D)' cannot be an iterator block because `void' is not an iterator interface type
O código está deste jeito:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Mosquito : EnemyBehaviour
{
private bool Atacando = true;
public bool ColisorInimigo = true;
// Use this for initialization
void Start()
{
}
// Update is called once per frame
protected override void Update()
{
base.Update();
if (isMoving)
{
transform.position = Vector3.MoveTowards(transform.position, player.position, Mathf.Abs(speed) * Time.deltaTime);
}
//float distance = PlayerDistance();
//isMoving = (distance <= distanceAttack);
//if(isMoving){
//if ((player.position.x > transform.position.x && sprite.flipX) || (player.position.x < transform.position.x && !sprite.flipX)){
// flip();
//}
//}
}
//void FixedUpdate(){
//if(isMoving){
//rb2d.velocity = new Vector2(speed, rb2d.velocity.y);
//}
//}
void OnTriggerStay2D(Collider2D Coll)
{
if(Coll.gameObject.tag == "Player"){
ColisorInimigo.enabled = false;
yield return new WaitForSeconds(0.01f);
transform.gameObject.tag = "Dano";
Atacar.gameObject.SetActive(false);
yield return new WaitForSeconds(0.2f);
Atacando == false;
yield return new WaitForSeconds(0.9f);
ColisorInimigo.enabled = true;
Atacar.gameObject.SetActive(true);
transform.gameObject.tag = "Mosquito";
}
//if (Coll.gameObject.tag == "Espada")
// {
// Vida = 0;
//}
}
}
kenau- Iniciante
- PONTOS : 2389
REPUTAÇÃO : 2
Respeito as regras :
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
A linha 42 dentro do meu Visual Studio é a linha que contém o void OnTriggerStay2D...
kenau- Iniciante
- PONTOS : 2389
REPUTAÇÃO : 2
Respeito as regras :
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
Mas vc colocou um yield dentro do evento de colisão, ele deve ser colocado dentro de uma corrotina!!!
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
A bem da verdade o que eu fiz foi usar um site que converte scripts de javascript para C#. Ele não é 100%, mas ajuda bastante.
E com a Coroutine ficaria como?
Assim?
[list=linenums]
[*]void OnTriggerStay2D(Collider2D Coll)
[*] {
[*]
[*] if(Coll.gameObject.tag == "Player"){
[*] ColisorInimigo.enabled = false;
[*] yield return new WaitForSeconds(0.01f);
[*] transform.gameObject.tag = "Dano";
[*] Atacar.gameObject.SetActive(false);
[*] yield return new WaitForSeconds(0.2f);
[*] Atacando == false;
[*] StartCoroutine(yield return new WaitForSeconds(0.9f));
[*] ColisorInimigo.enabled = true;
[*] Atacar.gameObject.SetActive(true);
[*] transform.gameObject.tag = "Mosquito";
[*] }
[*] //if (Coll.gameObject.tag == "Espada")
[*] // {
[*] // Vida = 0;
[*] //}
[*] }
[/list]
E com a Coroutine ficaria como?
Assim?
[list=linenums]
[*]void OnTriggerStay2D(Collider2D Coll)
[*] {
[*]
[*] if(Coll.gameObject.tag == "Player"){
[*] ColisorInimigo.enabled = false;
[*] yield return new WaitForSeconds(0.01f);
[*] transform.gameObject.tag = "Dano";
[*] Atacar.gameObject.SetActive(false);
[*] yield return new WaitForSeconds(0.2f);
[*] Atacando == false;
[*] StartCoroutine(yield return new WaitForSeconds(0.9f));
[*] ColisorInimigo.enabled = true;
[*] Atacar.gameObject.SetActive(true);
[*] transform.gameObject.tag = "Mosquito";
[*] }
[*] //if (Coll.gameObject.tag == "Espada")
[*] // {
[*] // Vida = 0;
[*] //}
[*] }
[/list]
kenau- Iniciante
- PONTOS : 2389
REPUTAÇÃO : 2
Respeito as regras :
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
Ok MayLeone,
Coloquei a corotina da seguinte maneira:
Mas daí aparece o seguinte erro:
Mosquito.cs(42,7): error CS1624: The body of `Mosquito.OnTriggerStay2D(UnityEngine.Collider2D)' cannot be an iterator block because `void' is not an iterator interface type
Como arrumar isso?
Coloquei a corotina da seguinte maneira:
- Código:
void OnTriggerStay2D(Collider2D Coll)
{
if(Coll.gameObject.tag == "Player"){
ColisorInimigo.enabled = false;
yield return StartCoroutine(new WaitForSeconds(0.01f));
transform.gameObject.tag = "Dano";
Atacar.gameObject.SetActive(false);
yield return StartCoroutine(new WaitForSeconds(0.2f));
Atacando == false;
yield return Start.Coroutine(new WaitForSeconds(0.9f));
ColisorInimigo.enabled = true;
Atacar.gameObject.SetActive(true);
transform.gameObject.tag = "Mosquito";
}
//yield return new WaitForSeconds(0.01f)
//if (Coll.gameObject.tag == "Espada")
// {
// Vida = 0;
//}
}
Mas daí aparece o seguinte erro:
Mosquito.cs(42,7): error CS1624: The body of `Mosquito.OnTriggerStay2D(UnityEngine.Collider2D)' cannot be an iterator block because `void' is not an iterator interface type
Como arrumar isso?
kenau- Iniciante
- PONTOS : 2389
REPUTAÇÃO : 2
Respeito as regras :
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
Olá amigo, isto é porque você usou yield return, não se deve usar isto dentro de uma void.
NKKF- ProgramadorMaster
- PONTOS : 4820
REPUTAÇÃO : 574
Idade : 20
Áreas de atuação : Desenvolvedor na Unity, NodeJS, React, ReactJS, React Native, MongoDB e Firebase.
Respeito as regras :
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
Então como transformar este script de javascript para c#?
Se não se usa yield return dentro de void, eu posso usar dentro do que então?
- Código:
function OnTriggerStay2D (Coll: Collider2D)
{
if(Coll.gameObject.tag == "Player")
{
Atacando = true;
ColisorInimigo.enabled = false;
yield WaitForSeconds(0.01);
transform.gameObject.tag = "Dano";
Atacar.gameObject.SetActive(false);
yield WaitForSeconds(0.2);
Atacando = false;
yield WaitForSeconds(0.9);
ColisorInimigo.enabled = true;
Atacar.gameObject.SetActive(true);
transform.gameObject.tag = "Mosquito";
}
}
Se não se usa yield return dentro de void, eu posso usar dentro do que então?
kenau- Iniciante
- PONTOS : 2389
REPUTAÇÃO : 2
Respeito as regras :
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
A maioria das coisas que estão aí, o .CS aceita.
(
Você deve usar dentro de uma coroutine. Assim como mostrado neste vídeo do @MarcosSchultz https://www.youtube.com/watch?v=j8nOLyUGLPg
)
(
Você deve usar dentro de uma coroutine. Assim como mostrado neste vídeo do @MarcosSchultz https://www.youtube.com/watch?v=j8nOLyUGLPg
)
NKKF- ProgramadorMaster
- PONTOS : 4820
REPUTAÇÃO : 574
Idade : 20
Áreas de atuação : Desenvolvedor na Unity, NodeJS, React, ReactJS, React Native, MongoDB e Firebase.
Respeito as regras :
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
Mas aí é que está, quando faço como no vídeo e meu script fica assim:
Assets/Scripts/Mosquito.cs(14,9): error CS1502: The best overloaded method match for `UnityEngine.MonoBehaviour.StartCoroutine(string)' has some invalid arguments
Assets/Scripts/Mosquito.cs(14,24): error CS1503: Argument `#1' cannot convert `method group' expression to type `string'
Assets/Scripts/Mosquito.cs(32,28): error CS1061: Type `bool' does not contain a definition for `enabled' and no extension method `enabled' of type `bool' could be found. Are you missing an assembly reference?
Assets/Scripts/Mosquito.cs(36,13): error CS0103: The name `Atacar' does not exist in the current context
Assets/Scripts/Mosquito.cs(39,13): error CS0201: Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement
Assets/Scripts/Mosquito.cs(42,28): error CS1061: Type `bool' does not contain a definition for `enabled' and no extension method `enabled' of type `bool' could be found. Are you missing an assembly reference?
Assets/Scripts/Mosquito.cs(43,13): error CS0103: The name `Atacar' does not exist in the current context
Como que eu consigo dizer que o ColisorInimigo está habilitado?
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Mosquito : EnemyBehaviour
{
private bool Atacando = true;
public bool ColisorInimigo = true;
// Use this for initialization
void Start()
{
StartCoroutine(OnTriggerStay2D);
}
// Update is called once per frame
protected override void Update()
{
base.Update();
if (isMoving)
{
transform.position = Vector3.MoveTowards(transform.position, player.position, Mathf.Abs(speed) * Time.deltaTime);
}
}
IEnumerator OnTriggerStay2D(Collider2D Coll)
{
if(Coll.gameObject.tag == "Player"){
ColisorInimigo.enabled = false;
yield return new WaitForSeconds(0.01f);
transform.gameObject.tag = "Dano";
Atacar.gameObject.SetActive(false);
yield return new WaitForSeconds(0.2f);
Atacando == false;
yield return new WaitForSeconds(0.9f);
ColisorInimigo.enabled = true;
Atacar.gameObject.SetActive(true);
transform.gameObject.tag = "Mosquito";
}
}
}
Assets/Scripts/Mosquito.cs(14,9): error CS1502: The best overloaded method match for `UnityEngine.MonoBehaviour.StartCoroutine(string)' has some invalid arguments
Assets/Scripts/Mosquito.cs(14,24): error CS1503: Argument `#1' cannot convert `method group' expression to type `string'
Assets/Scripts/Mosquito.cs(32,28): error CS1061: Type `bool' does not contain a definition for `enabled' and no extension method `enabled' of type `bool' could be found. Are you missing an assembly reference?
Assets/Scripts/Mosquito.cs(36,13): error CS0103: The name `Atacar' does not exist in the current context
Assets/Scripts/Mosquito.cs(39,13): error CS0201: Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement
Assets/Scripts/Mosquito.cs(42,28): error CS1061: Type `bool' does not contain a definition for `enabled' and no extension method `enabled' of type `bool' could be found. Are you missing an assembly reference?
Assets/Scripts/Mosquito.cs(43,13): error CS0103: The name `Atacar' does not exist in the current context
Como que eu consigo dizer que o ColisorInimigo está habilitado?
kenau- Iniciante
- PONTOS : 2389
REPUTAÇÃO : 2
Respeito as regras :
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
Para o erro do Atacar eu declarei uma variável do tipo pública GameObject e resolveu. Mas e os outros problemas?
kenau- Iniciante
- PONTOS : 2389
REPUTAÇÃO : 2
Respeito as regras :
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
Na verdade esse script ta cheio de erros, tem tanto erro junto que é melhor refazer, só um min que eu refaço.
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
Tentei deixar no contexto que você entregou, é muito difícil saber o que você pretende com o script sem uma explicação, mas eu tentei manter fiel ao que você postou primeiramente, apenas com as alterações sem os possíveis erros.
Não garanto que vá funcionar por causa que não testei, não sei o contexto do uso desse script e porque fiz no bloco de notas:
Obs: Não use conversor de JS para C#, eles não são confiáveis. Tente vc mesmo fazer a conversão.
Não garanto que vá funcionar por causa que não testei, não sei o contexto do uso desse script e porque fiz no bloco de notas:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Mosquito : EnemyBehaviour{
public bool colisorInimigo = true;
private bool atacando = true, esperar;
protected override void Update(){
base.Update();
if (isMoving)
{
transform.position = Vector3.MoveTowards(transform.position, player.position, Mathf.Abs(speed) * Time.deltaTime);
}
}
void OnTriggerEnter2D(Collider2D col){
if (col.gameObject.tag == "Player"){
colisorInimigo = false;
StartCoroutine(Esperar(0.01f));
if(esperar){
transform.gameObject.tag = "Dano";
esperar = false;
}
StartCoroutine(Esperar(0.2f));
if(esperar){atacando = false; esperar = false;}
StartCoroutine(Esperar(0.9f));
if(esperar){
colisorInimigo = true;
transform.gameObject.tag = "Mosquito";
esperar = false;
}
}
}
private IEnumerator Esperar(float t){
esperar = false;
yield return new WaitForSeconds(t);
esperar = true;
}
}
Obs: Não use conversor de JS para C#, eles não são confiáveis. Tente vc mesmo fazer a conversão.
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
MayLeone escreveu:Tentei deixar no contexto que você entregou, é muito difícil saber o que você pretende com o script sem uma explicação, mas eu tentei manter fiel ao que você postou primeiramente, apenas com as alterações sem os possíveis erros.
Não garanto que vá funcionar por causa que não testei, não sei o contexto do uso desse script e porque fiz no bloco de notas:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Mosquito : EnemyBehaviour{
public bool colisorInimigo = true;
private bool atacando = true, esperar;
protected override void Update(){
base.Update();
if (isMoving)
{
transform.position = Vector3.MoveTowards(transform.position, player.position, Mathf.Abs(speed) * Time.deltaTime);
}
}
void OnTriggerEnter2D(Collider2D col){
if (col.gameObject.tag == "Player"){
colisorInimigo = false;
StartCoroutine(Esperar(0.01f));
if(esperar){
transform.gameObject.tag = "Dano";
esperar = false;
}
StartCoroutine(Esperar(0.2f));
if(esperar){atacando = false; esperar = false;}
StartCoroutine(Esperar(0.9f));
if(esperar){
colisorInimigo = true;
transform.gameObject.tag = "Mosquito";
esperar = false;
}
}
}
private IEnumerator Esperar(float t){
esperar = false;
yield return new WaitForSeconds(t);
esperar = true;
}
}
Obs: Não use conversor de JS para C#, eles não são confiáveis. Tente vc mesmo fazer a conversão.
Muito obrigado MayLeone, tirou todos os erros. Porém continua não funcionando o que eu queria que funcionasse. No caso este script era para fazer dano ao personagem principal (Player), quando o inimigo (Mosquito) encostasse nele ele o Player deveria sofrer o dano e piscar, e enquanto estivesse piscando ele estaria invulnerável, mas ele o Player e o inimigo passam um por cima do outro sem causar dano algum.
kenau- Iniciante
- PONTOS : 2389
REPUTAÇÃO : 2
Respeito as regras :
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
É algo muito simples, tente usar esse script no player:
Nesse script, se o player colidir com o inimigo, ele vai ficar com a cor vermelha, e enquanto estiver com essa cor, ele não vai poder levar dano de novo, após 1.2 segundos o player volta ao normal (incluindo a cor dele).
Vale lembrar que eu utilizei um debug.log para detectar se o player colidiu com o inimigo, você pode substituir essa linha pelo o que você deseja que aconteça com o player ao colidir com o inimigo, e pode alterar o tempo de espera de dano também, e a cor do personagem, basta alterar as linhas referentes.
Lembrando que para esse script funcionar você precisa que o mesmo esteja no PLAYER, o inimigo tenha uma tag chamada "Inimigo", e ambos (inimigo e player) tenham colisores com a opção "isTrigger" marcada.
- Código:
using System.Collections;
using UnityEngine;
public class DanoPlayer : MonoBehaviour{
private bool podeDano = true;
private SpriteRenderer sp;
void Start(){
sp = GetComponent<SpriteRenderer>();
}
void OnTriggerEnter2D(Collider2D col){
if (col.gameObject.tag == "Inimigo" && podeDano){
podeDano = false;
Debug.Log("Player levou dano");
StartCoroutine(Esperar(1.2f));
}
}
private IEnumerator Esperar (float t){
sp.material.color = Color.red;
yield return new WaitForSeconds(t);
sp.material.color = Color.white;
podeDano = true;
}
}
Nesse script, se o player colidir com o inimigo, ele vai ficar com a cor vermelha, e enquanto estiver com essa cor, ele não vai poder levar dano de novo, após 1.2 segundos o player volta ao normal (incluindo a cor dele).
Vale lembrar que eu utilizei um debug.log para detectar se o player colidiu com o inimigo, você pode substituir essa linha pelo o que você deseja que aconteça com o player ao colidir com o inimigo, e pode alterar o tempo de espera de dano também, e a cor do personagem, basta alterar as linhas referentes.
Lembrando que para esse script funcionar você precisa que o mesmo esteja no PLAYER, o inimigo tenha uma tag chamada "Inimigo", e ambos (inimigo e player) tenham colisores com a opção "isTrigger" marcada.
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
Aê agora deu certo!!! Muito obrigado MayLeone, agora sim deu certo.
kenau- Iniciante
- PONTOS : 2389
REPUTAÇÃO : 2
Respeito as regras :
Re: [RESOLVIDO] Tomar dano do inimigo e causar dano no mesmo
Tópico resolvidoEste tópico está impedido de receber novos posts. Movido para "Tópicos resolvidos". |
Tópicos semelhantes
» Não causar dano no 2º Inimigo
» [RESOLVIDO] "encostar" em um GameObject e Tomar Dano
» [RESOLVIDO] Dano no inimigo
» Inimigo não recebe dano(RESOLVIDO)
» [RESOLVIDO] inimigo não sofre dano
» [RESOLVIDO] "encostar" em um GameObject e Tomar Dano
» [RESOLVIDO] Dano no inimigo
» Inimigo não recebe dano(RESOLVIDO)
» [RESOLVIDO] inimigo não sofre dano
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos