[RESOLU][MY-AL]Line Renderer affichage discontinu

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

[RESOLU][MY-AL]Line Renderer affichage discontinu

Message par EmileF » 10 Juin 2020 12:50

Bonjour,

J'ai un petit soucis que je n'arrive pas à régler.
Je suis en train de créer un jeu 2D genre Bubble Saga.
Pour viser, je trace à l'aide de LineRenderer, une ligne symbolisant le parcours de la bulle de tir.
Il s'avère que par moment, le ligne s'arrête au premier rebond et par moment la ligne continue.
Je voudrais que la ligne soit continue jusqu'aux bulles visées qu'il y est rebond ou pas en permanence.
Voila l'image de ce que j'obtiens trop souvent
Image
Et voilà l'image de ce que je voudrais en continue
Image
Voilà le script

Code : Tout sélectionner

public class Tir : MonoBehaviour
{
    public Bulle Bulle;
    private LineRenderer LineRenderer;
    private int reflections = 5;
    private Ray2D ray;
    List<Vector3> Cibles;
    bool move;
    int index;

    void Start()
    {
        LineRenderer = GetComponent<LineRenderer>();
        LineRenderer.material = Bulle.GetComponent<Renderer>().material;
    }

    void Update()
    {
        if (!move)
        {
            LineRenderer.enabled = true;
            Cibles = new List<Vector3>();
            Cibles.Add(Bulle.transform.position);
            Vector3 worldMousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            Vector2 direction = (Vector2)((worldMousePos - transform.position));
            direction.Normalize();

            Bulle.transform.position = transform.position + (Vector3)direction * 0.4f + new Vector3(0, 0, -0.1f);
            ray = new Ray2D(Bulle.transform.position, direction);

            LineRenderer.positionCount = 1;
            LineRenderer.SetPosition(0, Bulle.transform.position);
            float remainingLenght = 10;

            for (int i = 0; i < reflections; i++)
            {
                RaycastHit2D hit = Physics2D.Raycast(ray.origin, ray.direction, remainingLenght);
                if (hit)
                {
                    Vector2 point = hit.point;
                    if (hit.transform.tag == "Bord")
                    {
                        if (hit.transform.name == "BordD")
                            point += new Vector2(-0.2f, 0);
                        else if (hit.transform.name == "BordG")
                            point += new Vector2(0.2f, 0);
                        if (hit.transform.name == "BordH")
                            point += new Vector2(0, -0.2f);
                    }

                    LineRenderer.positionCount += 1;
                    LineRenderer.SetPosition(LineRenderer.positionCount - 1, point);
                    Cibles.Add((Vector3)point);// new Vector3(point.x, point.y, -0.1f));
                    remainingLenght -= Vector3.Distance(ray.origin, hit.point);
                    ray = new Ray2D(hit.point, Vector2.Reflect(ray.direction, hit.normal));
                    if (hit.transform.tag == "Bulle")
                        break;
                }
                else
                {
                    LineRenderer.positionCount += 1;
                    LineRenderer.SetPosition(LineRenderer.positionCount - 1, ray.origin + ray.direction * remainingLenght);
                }

            }
        }

    }
}

Et voilà le package du projet pour pouvoir approfondir le problème si besoin
https://drive.google.com/file/d/1zg1AlH ... sp=sharing
Si quelqu'un pouvait m'aider, ce serait super.
Ca n’empêche pas le jeu de tourner, mais si on tire alors que la ligne n'est pas complète, la bulle de tir s'arrête au bout de la ligne. Normal, je relève les points de rebond de la ligne pour déterminer le trajet de la bulle tirée.

Merci
Dernière édition par EmileF le 10 Juin 2020 13:51, édité 1 fois.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [MY-AL]Line Renderer affichage discontinu

Message par djulio74 » 10 Juin 2020 13:25

Je regarderai ça de plus près ce soir, la comme ça je ne vois pas ce qui bloque.
Une remarque, tu peux éviter les conditions des bord haut gauche et droite, juste en utilisant hit. Normal.
En gros si le tag est "bord", point += hit.normal * 0.2f sans avoir à se soucier de quel bord il s'agit.
Ça ne réglera pas le problème je sais, lol.

Édit : pourquoi quand tu redéfini le ray dans les réflection tu utilise hit.point au lieu du vector point que tu défini ( et qui représente le centre le la bille au point de contact)? Ça se pourrait que le soucis vienne de la, que le hit. Point soit trop sur le bord pile poil et que le nouveau ray hit ce même bord à chaque fois.
A voirt

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: [MY-AL]Line Renderer affichage discontinu

Message par EmileF » 10 Juin 2020 13:49

Merci Djulio,

Le conseil que tu m'as donné m'a permis de régler mon problème.
En effet, la valeur point qui me permet de tenir compte du rayon de la bulle, j'avais oublié d'appliquer son emploi pour le remainingLenght et le ray dans le script.

Code : Tout sélectionner

            for (int i = 0; i < reflections; i++)
            {
                RaycastHit2D hit = Physics2D.Raycast(ray.origin, ray.direction, remainingLenght);
                if (hit)
                {
                    Vector2 point = hit.point;
                    if (hit.transform.tag == "Bord")
                    {
                        point += hit.normal * 0.2f;
                    }

                    LineRenderer.positionCount += 1;
                    LineRenderer.SetPosition(LineRenderer.positionCount - 1, point);
                    Cibles.Add((Vector3)point);
                    remainingLenght -= Vector3.Distance(ray.origin, point);
                    ray = new Ray2D(point, Vector2.Reflect(ray.direction, hit.normal));
                    if (hit.transform.tag == "Bulle")
                        break;
                }
                else
                {
                    print("Pas de hit");
                    LineRenderer.positionCount += 1;
                    LineRenderer.SetPosition(LineRenderer.positionCount - 1, ray.origin + ray.direction * remainingLenght);
                }

            }
Ce n'était rien, mais j'y ai travaillé toute la matinée, en vain.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Répondre

Revenir vers « (C#) CSharp »