Page 1 sur 1

[RÉSOLU] Faire face au joueur

Publié : 24 Déc 2019 16:30
par Bilu
Bonjour,

Je suis en train de créer un jeu où un missile suit un joueur jusqu'à le toucher => BOOM
Le missile Spawn et grâce au script "facesPlayer" il detecte le joueur et oriente sa direction vers ce dernier. Un autre script "EnemySpawner" permet de faire, comme son nom l'indique, spawn des missiles toutes les X secondes. Mais au moment de spawn, le missile n'est pas orienté vers le joueur, il est orienté vers le haut et s'oriente petit à petit vers le joueur seulement après.
J'aimerai qu'au moment de spawner, le missile soit directement orienté vers le joueur.
Pour le moment, pour éluder le problème, le missile au moment de spawner, est interdit de bouger pendant 2 secondes, le temps de s'orienter. Après ces deux secondes, il peut se mouvoir vers son objectif. Cette manipulation est invisible pour le joueur mais moi je le sais :)
Auriez-vous une solution pour qu'au moment de spawn, le missile soit déjà orienté vers le joueur ?

Script de "EnemySpawner":

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemySpawner : MonoBehaviour
{
    public GameObject missilePrefab;
    GameObject missileInstance;

    float missileRate = 5;
    float nextMissile =1;
    

    float spawnDistance = 40f;

    Transform player;
    
    
    // Update is called once per frame
    void Update()
    {
        if (player == null)
        {
            GameObject go = GameObject.Find("shipPlayer_1");

            if (go != null)
            {
                player = go.transform;

            }
        }
        


        nextMissile -= Time.deltaTime;

        if(nextMissile <=0)
        {
            nextMissile = missileRate;
            missileRate *= 0.9f;
            Vector3 offset = Random.onUnitSphere;
            offset.z = 0;

            offset = offset.normalized * spawnDistance;


            missileInstance = (GameObject)Instantiate(missilePrefab, player.position + offset, Quaternion.identity);
            missileInstance.name = "Missile_1";

        }

        

    }
    
        

        
}

Script de "facesPlayer":

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class facesPlayer : MonoBehaviour
{
    float rotationSpeed = 150f;
    public float distance;

    Transform player; 
    

    // Update is called once per frame
    void Update()
    {
        if (player == null)
        {
            GameObject go = GameObject.Find("shipPlayer_1");

            if (go != null)
            {
                player = go.transform;

            }
        }

        distance = Vector3.Distance(player.position, transform.position);
        
        //At this point, we've either found the player 
        // or the player doesn't exist right now


        if (player == null || distance < 2.5)
        {
            return; // Try again next frame.
        }

        //Here, we know for sure we've a player. Turn to face it.
        Vector3 dir = player.position - transform.position;
        dir.Normalize();

        float zAngle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg - 90;


        Quaternion desireRot = Quaternion.Euler(0, 0, zAngle);
        transform.rotation = Quaternion.RotateTowards(transform.rotation, desireRot, rotationSpeed * Time.deltaTime); 
    }

}
Script "moveForward" qui permet au missile de se déplacer:

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class moveForward : MonoBehaviour
{
    float maxSpeed = 15f;
    float delay = 2f;
    // Update is called once per frame
    void Update()
    {
        delay -= 1 * Time.deltaTime;
        if (delay <= 0)
        {
            delay = 0;
            Vector3 pos = transform.position;
            Vector3 velocity = new Vector3(0, maxSpeed * Time.deltaTime, 0);

            pos += transform.rotation * velocity;

            transform.position = pos;
        }
    }
}


Re: Faire face au joueur

Publié : 24 Déc 2019 16:37
par Max
Bonjour,

Ben sans trop approfondir ton code, pour moi "orienter un GameObject vers un autre", je pense de suite à la fonction Transform.LookAt. A voir si cela correspond à ce que tu cherches à faire.

Re: Faire face au joueur

Publié : 25 Déc 2019 00:11
par Bilu
Merci de ta réponse rapide Max

Le code que j'ai trouvé en ligne permet de faire ce que fait la fonction lookat (Si j'avais su lol) mais mon problème reste le même :/ . Au moment de Spawn, le missile n'est pas orienter vers le joueur.

Re: Faire face au joueur

Publié : 25 Déc 2019 09:56
par Alesk
C'est au moment du instantiate que tu dois faire l'orientation que tu désires.

Sinon, pour jouer avec les missiles, tu me demandes ;)
Te voilà déjà de quoi t'amuser un peu : viewtopic.php?f=24&t=8616

Re: Faire face au joueur

Publié : 25 Déc 2019 10:20
par Bilu
Merci Alesk :shock: !!!
Je vais y jeter un coup d'oeil.

Je sais que c'est dans instantiate mais comment communiquer l'orientation correctement ?

Re: Faire face au joueur

Publié : 25 Déc 2019 10:45
par Max
Bonjour,
Bilu a écrit :
25 Déc 2019 10:20
Je sais que c'est dans instantiate mais comment communiquer l'orientation correctement ?
pour rester simple, il suffit d'orienter ton objet après l'avoir instancié. Genre (en reprenant ton code):

Code : Tout sélectionner

missileInstance = (GameObject)Instantiate(missilePrefab, player.position + offset, Quaternion.identity);
missileInstance.transform.LookAt(player);

Re: Faire face au joueur

Publié : 25 Déc 2019 12:28
par Bilu
Hhaaaa je n'avais pas utilisé la fonction lookat de cette façon ... :oops:

Merci Max, je teste ça dès que je peux

Joyeux Noël à tous 😉

Re: Faire face au joueur

Publié : 26 Déc 2019 14:49
par Bilu
Bonjour,

Max, ça fonctionne mieux. Mais si on fait attention, le missile Spawn en regardant vers le haut puis pointe vers le joueur. Mais j'aimerais aller plus loin. J'aimerais qu'il regarde le joueur en spawnant :P .

Et si j'instancie un game object sans sprite donc invisible avant d'instancier un missile ?
Je donnerai l'orientation de l'objet invisible au missile de cette façon directement dans "Instantiate ..." Non ?
Je vous en parle car pas encore eu le temps de tester.

Re: Faire face au joueur

Publié : 26 Déc 2019 15:19
par Alesk
Avec le code que Max t'a donné, l'orientation devrait être la bonne dès le départ.
Le souci doit se trouver ailleurs.

Re: Faire face au joueur

Publié : 30 Déc 2019 18:37
par Bilu
Bonjour,

Autant pour moi cela fonctionne. Merci beaucoup :D