[RESOLVIDO] Fazer o inimigo virar para o lado que você está quando você chega perto
2 participantes
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
[RESOLVIDO] Fazer o inimigo virar para o lado que você está quando você chega perto
Eu estava tentando fazer o inimigo virar para onde eu estou em relação a ele no eixo x, mas quando eu chego perto dele ele começa a flipar sem parar.
Quando eu olho no Inspector ele fala que a rotação do inimigo vai para 180, depois vai para 0 e depois volta para 180 e continua assim sem parar.
Aqui meu código:
Quando eu olho no Inspector ele fala que a rotação do inimigo vai para 180, depois vai para 0 e depois volta para 180 e continua assim sem parar.
Aqui meu código:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
public GameObject enemyBullet;
public GameObject player;
public float minimunDistance = 4f;
public int enemyHealth = 100;
public GameObject firePoint2;
public float move;
Rigidbody2D rb;
private bool collide ;
private float waitingTime = 0.5f;
public bool canShoot;
void Start()
{
canShoot = true;
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
rb.velocity = new Vector2(move, rb.velocity.y);
float playerDistance = Vector2.Distance(transform.position, player.transform.position);
if (playerDistance < minimunDistance && Mathf.Abs(transform.position.y - player.transform.position.y) < 1 && canShoot)
{
Shoot();
canShoot = false;
StartCoroutine("WaitToShoot");
move = 0;
if (player.transform.position.x > transform.position.x)
{
transform.Rotate(0f, 180f, 0f);
}
else if (player.transform.position.x < transform.position.x)
{
transform.Rotate(0f, 180f, 0f);
}
}
if (collide)
{
Flip();
}
}
IEnumerator WaitToShoot()
{
yield return new WaitForSeconds(waitingTime);
canShoot = true;
}
public void TakeDamage(int Damage)
{
enemyHealth -= Damage;
if (enemyHealth <= 0)
{
Destroy(gameObject);
}
}
void Shoot()
{
Instantiate(enemyBullet, firePoint2.transform.position, transform.rotation);
}
void Flip()
{
transform.Rotate(0f,180f,0f);
move *= -1f;
collide = false;
}
void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.tag == "Wall")
{
collide = true;
}
}
}
Hamassfall- Avançado
- PONTOS : 2067
REPUTAÇÃO : 7
Respeito as regras :
Re: [RESOLVIDO] Fazer o inimigo virar para o lado que você está quando você chega perto
Apesar de não entender muito desses codigos chiques vou tentar ajudar kkk
Olha essa Linha
[list=linenums]
[*]if (player.transform.position.x > transform.position.x)
[*] {
[*] transform.Rotate(0f, 180f, 0f);
[*] }
[*] else if (player.transform.position.x < transform.position.x)
[*] {
[*] transform.Rotate(0f, 180f, 0f);
[*] }
[/list]
Primeira coisa, acredito que não é necessario esse elseIf. Por que se o if verifica oque esta dentro (Se o personagem ta perto do inimigo) um else faria tudo que ta fora executar o contrario.
Ex:
Se tiver perto Olha pra ele
Senão não olha.
Começa por ai e tenta executar.
Ok, como ele ta fzr isso direto acredito que seu script ta precisando de uma pausa.
Como eu ja disse eu não entendo os codigos chiques e provavelmente existe um comando bobo que vai fzr oq eu vou falar.
Como eu resolveria :
Criaria uma variavel do tipo int, chamada stop.
Na função start ela receberia 0.
Quando o personagem chegar perto do inimigo e ele virar ela recebe 1.
[list=linenums]
[*]if (player.transform.position.x > transform.position.x)
[*] {
[*] if(stop == 0)
[*] {
[*] transform.Rotate(0f, 180f, 0f);
[*] stop =1;
[*] }
[*] }
[*] else if (player.transform.position.x < transform.position.x)
[*] {
[*]
[*] if(stop == 1)
[*] {
[*] transform.Rotate(0f, 180f, 0f);
[*] stop =0;
[*] }
[*] }
[/list]
Oque eu fiz :
Quando a variavel esta valendo 0, significa que o personagem pode virar e então se ele tiver no range do inimigo ele vai virar.
Mas ele só vai fzr isso uma vez pq após ele virar a variavel recebe 1 e ele não vira mais.
Quando ele sai do range ele desvira e a variavel recebe 0 (Impedindo que ele vire denovo) e claro, ele só vai ter permissão para desvirar quando a variavel receber 1 novamente.
Em fim, se souber uma maneira chique fique a vontade para usa-la.
O problema é que ele ta recebendo 180 toda hora e ai fica :
0 > 180 > 0 > 180, pq não tem um pause entende?
Tudo que vc precisa fzr é criar algo para que ele gire somente uma vez.
Espero que tenha ajudado .
Olha essa Linha
[list=linenums]
[*]if (player.transform.position.x > transform.position.x)
[*] {
[*] transform.Rotate(0f, 180f, 0f);
[*] }
[*] else if (player.transform.position.x < transform.position.x)
[*] {
[*] transform.Rotate(0f, 180f, 0f);
[*] }
[/list]
Primeira coisa, acredito que não é necessario esse elseIf. Por que se o if verifica oque esta dentro (Se o personagem ta perto do inimigo) um else faria tudo que ta fora executar o contrario.
Ex:
Se tiver perto Olha pra ele
Senão não olha.
Começa por ai e tenta executar.
Ok, como ele ta fzr isso direto acredito que seu script ta precisando de uma pausa.
Como eu ja disse eu não entendo os codigos chiques e provavelmente existe um comando bobo que vai fzr oq eu vou falar.
Como eu resolveria :
Criaria uma variavel do tipo int, chamada stop.
Na função start ela receberia 0.
Quando o personagem chegar perto do inimigo e ele virar ela recebe 1.
[list=linenums]
[*]if (player.transform.position.x > transform.position.x)
[*] {
[*] if(stop == 0)
[*] {
[*] transform.Rotate(0f, 180f, 0f);
[*] stop =1;
[*] }
[*] }
[*] else if (player.transform.position.x < transform.position.x)
[*] {
[*]
[*] if(stop == 1)
[*] {
[*] transform.Rotate(0f, 180f, 0f);
[*] stop =0;
[*] }
[*] }
[/list]
Oque eu fiz :
Quando a variavel esta valendo 0, significa que o personagem pode virar e então se ele tiver no range do inimigo ele vai virar.
Mas ele só vai fzr isso uma vez pq após ele virar a variavel recebe 1 e ele não vira mais.
Quando ele sai do range ele desvira e a variavel recebe 0 (Impedindo que ele vire denovo) e claro, ele só vai ter permissão para desvirar quando a variavel receber 1 novamente.
Em fim, se souber uma maneira chique fique a vontade para usa-la.
O problema é que ele ta recebendo 180 toda hora e ai fica :
0 > 180 > 0 > 180, pq não tem um pause entende?
Tudo que vc precisa fzr é criar algo para que ele gire somente uma vez.
Espero que tenha ajudado .
lesgoy- Mestre
- PONTOS : 3488
REPUTAÇÃO : 49
Respeito as regras :
Re: [RESOLVIDO] Fazer o inimigo virar para o lado que você está quando você chega perto
Esqueci de corrigir o else if kkk
É só no lugar de else if deixar só else.
É só no lugar de else if deixar só else.
- Código:
if ( Condição ){
}else
{
}
lesgoy- Mestre
- PONTOS : 3488
REPUTAÇÃO : 49
Respeito as regras :
Re: [RESOLVIDO] Fazer o inimigo virar para o lado que você está quando você chega perto
PS : Eu coloquei o codigo na caixinha script mas não sei pq da primeira vez bugou e n foi
lesgoy- Mestre
- PONTOS : 3488
REPUTAÇÃO : 49
Respeito as regras :
Re: [RESOLVIDO] Fazer o inimigo virar para o lado que você está quando você chega perto
Era isso mesmo, funcionou certinho aqui.lesgoy escreveu:Apesar de não entender muito desses codigos chiques vou tentar ajudar kkk
Olha essa Linha
[list=linenums]
[*]if (player.transform.position.x > transform.position.x)
[*] {
[*] transform.Rotate(0f, 180f, 0f);
[*] }
[*] else if (player.transform.position.x < transform.position.x)
[*] {
[*] transform.Rotate(0f, 180f, 0f);
[*] }
[/list]
Primeira coisa, acredito que não é necessario esse elseIf. Por que se o if verifica oque esta dentro (Se o personagem ta perto do inimigo) um else faria tudo que ta fora executar o contrario.
Ex:
Se tiver perto Olha pra ele
Senão não olha.
Começa por ai e tenta executar.
Ok, como ele ta fzr isso direto acredito que seu script ta precisando de uma pausa.
Como eu ja disse eu não entendo os codigos chiques e provavelmente existe um comando bobo que vai fzr oq eu vou falar.
Como eu resolveria :
Criaria uma variavel do tipo int, chamada stop.
Na função start ela receberia 0.
Quando o personagem chegar perto do inimigo e ele virar ela recebe 1.
[list=linenums]
[*]if (player.transform.position.x > transform.position.x)
[*] {
[*]if(stop == 0)
[*]{
[*] transform.Rotate(0f, 180f, 0f);
[*]stop =1;
[*]}
[*] }
[*] else if (player.transform.position.x < transform.position.x)
[*] {
[*]
[*]if(stop == 1)
[*]{
[*] transform.Rotate(0f, 180f, 0f);
[*]stop =0;
[*]}
[*] }
[/list]
Oque eu fiz :
Quando a variavel esta valendo 0, significa que o personagem pode virar e então se ele tiver no range do inimigo ele vai virar.
Mas ele só vai fzr isso uma vez pq após ele virar a variavel recebe 1 e ele não vira mais.
Quando ele sai do range ele desvira e a variavel recebe 0 (Impedindo que ele vire denovo) e claro, ele só vai ter permissão para desvirar quando a variavel receber 1 novamente.
Em fim, se souber uma maneira chique fique a vontade para usa-la.
O problema é que ele ta recebendo 180 toda hora e ai fica :
0 > 180 > 0 > 180, pq não tem um pause entende?
Tudo que vc precisa fzr é criar algo para que ele gire somente uma vez.
Espero que tenha ajudado .
Eu também não sei se existe um comando para fazer isso mas por enquanto esse vai servir kkkkkkkk
Hamassfall- Avançado
- PONTOS : 2067
REPUTAÇÃO : 7
Respeito as regras :
Tópicos semelhantes
» ajuda com script de inimigo para fazer com que ele só ataque quando ver o player
» [RESOLVIDO] Tempo Que Você está gravando, tem como fazer isso?
» [RESOLVIDO] O inimigo flipa mas não vai para o outro lado
» Como fazer um script para que se o inimigo ver você cancela a missão?
» Script quando mais você estiver perto de um mesh
» [RESOLVIDO] Tempo Que Você está gravando, tem como fazer isso?
» [RESOLVIDO] O inimigo flipa mas não vai para o outro lado
» Como fazer um script para que se o inimigo ver você cancela a missão?
» Script quando mais você estiver perto de um mesh
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos