Tiro continuar em linha reta depois de chegar ao "alvo"
2 participantes
Página 1 de 1
Tiro continuar em linha reta depois de chegar ao "alvo"
Queria uma ajuda para fazer o inimigo atirar em uma posição passada do player, porem depois chegar nessa posição ele continue seguindo em linha reta.
meu script ate o momento faz o tiro segui ate uma posição passada do inimigo, porem quando chega nessa posição ele para e se destroy depois de um tempo (como se explodisse) -fiz desse jeito pq não consegui fazer ele seguir em linha reta-:
meu script ate o momento faz o tiro segui ate uma posição passada do inimigo, porem quando chega nessa posição ele para e se destroy depois de um tempo (como se explodisse) -fiz desse jeito pq não consegui fazer ele seguir em linha reta-:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class tiroDoisChefe : MonoBehaviour
{
public float speed;
public GameController controller;
private float[] targetPlayer;
public float targetX;
public float targetY;
public GameObject explosao;
public Animator animState;
public bool spawned = false;
private Vector2 player;
private Vector2 tiroPosition;
void Start(){
controller = FindObjectOfType<GameController>();
StartCoroutine(animationTiro());
}
void Update(){
player = new Vector2(targetX + 0.61f, targetY + 0.43783832f); // ajustar posição do sprite
tiroPosition = gameObject.transform.position;
if (spawned == true){
transform.position = Vector2.MoveTowards(transform.position, new Vector2(targetX + 0.61f, targetY + 0.43783832f), (speed) * Time.deltaTime);
if (player.Equals(tiroPosition)){
animState.SetInteger("transition", 2);
Destroy(gameObject, 1f);
}
}
}
void OnTriggerEnter2D(Collider2D colisor){
if (colisor.gameObject.CompareTag("player")){
controller.lifeLose -=1;
Destroy(gameObject);
}
}
IEnumerator animationTiro(){
animState.SetInteger("transition", 0); // animação de aparecer o tiro
yield return new WaitForSecondsRealtime(0.5f); //espera primeira animação acabar
animState.SetInteger("transition", 1); // começa animação de brilho do tiro
spawned = true; //confirma que foi feito a primeira animação
targetX = GameObject.FindGameObjectWithTag("player").GetComponent<Transform>().position.x;
targetY = GameObject.FindGameObjectWithTag("player").GetComponent<Transform>().position.y; // pega posição atual do player
yield return new WaitForSecondsRealtime(10f);
}
}
Shidote- Iniciante
- PONTOS : 1545
REPUTAÇÃO : 0
Respeito as regras :
Re: Tiro continuar em linha reta depois de chegar ao "alvo"
Ao invés de mover pra uma posição específica, você calcula a direção:
(player.posição - tiro.position).normalized;
o normalized vai fazer essa direção ter a magnitude 1, impedindo que a bala tenha velocidades diferentes dependendo da distância.
Depois basta mover usando a posição atual + direção, algo assim:
(player.posição - tiro.position).normalized;
o normalized vai fazer essa direção ter a magnitude 1, impedindo que a bala tenha velocidades diferentes dependendo da distância.
Depois basta mover usando a posição atual + direção, algo assim:
- Código:
using UnityEngine;
public class MoverDirecao : MonoBehaviour
{
public RectTransform player, bala;
private bool atirar;
Vector2 direcaoPlayer;
private void Start()
{
bala = GetComponent<RectTransform>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
atirar = true;
direcaoPlayer = (player.localPosition - bala.localPosition).normalized;
}
if (atirar)
{
bala.localPosition = Vector2.MoveTowards(bala.localPosition, (Vector2)bala.localPosition + direcaoPlayer, 50 * Time.deltaTime);
}
}
}
Fagner- Moderador
- PONTOS : 4442
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: Tiro continuar em linha reta depois de chegar ao "alvo"
Obrigado, consegui fazer, mas queria tirar uma duvida: no meu jogo os inimigos fica atirando automático, não é ativado por tecla então n tem como eu colocar esse calculo do vetor de direção dentro de um if no update, e se eu colocar no start so vai fazer uma vez no inicio, dai a única solução que consegui descobrir foi colocar esse calculo dentro de um Inumerator e colocar um WaitForSecond com um tempo que o objeto ja vai ser destruido antes no Inumerator pra ele n fazer esse calculo novamente, existe outro jeito de fazer isso sem precisar chamar um Inumerator?
o código ficou assim:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class tiroDoisChefe : MonoBehaviour
{
public float speed;
public GameController controller;
public Animator animState;
public bool spawned = false;
private RectTransform player;
private RectTransform tiroPosition;
private Vector2 direcaoPlayer;
void Start(){
controller = FindObjectOfType<GameController>();
StartCoroutine(animationTiro());
tiroPosition = GetComponent<RectTransform>();
}
void Update(){
if (spawned == true){
tiroPosition.localPosition = Vector2.MoveTowards(tiroPosition.localPosition, (Vector2)tiroPosition.localPosition + direcaoPlayer, (speed) * Time.deltaTime);
}
}
void OnTriggerEnter2D(Collider2D colisor){
if (colisor.gameObject.CompareTag("player")){
controller.lifeLose -=1;
Destroy(gameObject);
}
// destruir o objeto se ele chegar nos limites da fase
if ((colisor.gameObject.CompareTag("costa")) || (colisor.gameObject.CompareTag("cima")) || (colisor.gameObject.CompareTag("baixo")) || (colisor.gameObject.CompareTag("frente"))){
Destroy(gameObject, 1f);
}
}
IEnumerator animationTiro(){
animState.SetInteger("transition", 0); // animação de aparecer o tiro
yield return new WaitForSecondsRealtime(0.5f); //espera primeira animação acabar
animState.SetInteger("transition", 1); // começa animação de brilho do tiro
spawned = true; //confirma que foi feito a primeira animação
player = GameObject.FindGameObjectWithTag("player").GetComponent<RectTransform>(); // pegar a cordenada do objeto
direcaoPlayer = (player.localPosition - tiroPosition.localPosition).normalized; // pega vetor direção em relação do tipo-pra posição capturada do player
yield return new WaitForSecondsRealtime(10f); // espera 10s pra não atualizar a posição do player, para não ficar seguindo ele
}
}
Shidote- Iniciante
- PONTOS : 1545
REPUTAÇÃO : 0
Respeito as regras :
Tópicos semelhantes
» Sprite crescer em linha reta como um laser 2D
» Ajustar o alvo do inimigo
» MAGIA SEGUIR ALVO COM TAG APOS SER INSTANCIADA
» Problema de direção do alvo! [ GAME 2D ] ajuda por favor!
» Metralhadora automática(alvo inimigo mais próximo).
» Ajustar o alvo do inimigo
» MAGIA SEGUIR ALVO COM TAG APOS SER INSTANCIADA
» Problema de direção do alvo! [ GAME 2D ] ajuda por favor!
» Metralhadora automática(alvo inimigo mais próximo).
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos