[RÉSOLU] Faire face au joueur

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Répondre
Bilu
Messages : 91
Inscription : 20 Nov 2019 09:24

[RÉSOLU] Faire face au joueur

Message par Bilu » 24 Déc 2019 16:30

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;
        }
    }
}

Dernière édition par Bilu le 30 Déc 2019 18:38, édité 1 fois.

Avatar de l’utilisateur
Max
Messages : 8763
Inscription : 30 Juil 2011 13:57
Contact :

Re: Faire face au joueur

Message par Max » 24 Déc 2019 16:37

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.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Bilu
Messages : 91
Inscription : 20 Nov 2019 09:24

Re: Faire face au joueur

Message par Bilu » 25 Déc 2019 00:11

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.

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Faire face au joueur

Message par Alesk » 25 Déc 2019 09:56

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

Bilu
Messages : 91
Inscription : 20 Nov 2019 09:24

Re: Faire face au joueur

Message par Bilu » 25 Déc 2019 10:20

Merci Alesk :shock: !!!
Je vais y jeter un coup d'oeil.

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

Avatar de l’utilisateur
Max
Messages : 8763
Inscription : 30 Juil 2011 13:57
Contact :

Re: Faire face au joueur

Message par Max » 25 Déc 2019 10:45

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);
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Bilu
Messages : 91
Inscription : 20 Nov 2019 09:24

Re: Faire face au joueur

Message par Bilu » 25 Déc 2019 12:28

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 😉

Bilu
Messages : 91
Inscription : 20 Nov 2019 09:24

Re: Faire face au joueur

Message par Bilu » 26 Déc 2019 14:49

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.

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Faire face au joueur

Message par Alesk » 26 Déc 2019 15:19

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.

Bilu
Messages : 91
Inscription : 20 Nov 2019 09:24

Re: Faire face au joueur

Message par Bilu » 30 Déc 2019 18:37

Bonjour,

Autant pour moi cela fonctionne. Merci beaucoup :D

Répondre

Revenir vers « Scripting »