[Résolu]Décaler une image

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
stigma
Messages : 1414
Inscription : 17 Nov 2012 18:29
Localisation : Perdu dans les mondes de Myst
Contact :

[Résolu]Décaler une image

Message par stigma » 17 Juin 2023 09:04

Pas facile de mettre un titre court et explicite.
J'ai trouvé un script pour une boussole avec des icones de quêtes. ça marche plutôt bien. Le tuto montrait comment mettre des images sur la boussole qui indiquent où trouver les objets.
Lien du tuto en question : https://youtu.be/MRAVwaGrmrk
J'ai un peu modifié pour mettre les noms des endroits sur la carte, mais je veux juste afficher ces images de noms en dessous de la barre principale.
Image

Voici le code. Je ne suis pas trop doué en C#. Je suppose qu'il faut agir sur la ligne

Code : Tout sélectionner

marker.image.rectTransform.anchoredPosition = GetPosOnCompass(marker);

Code : Tout sélectionner

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

public class Compass : MonoBehaviour
{
    public GameObject iconPrefab;
    List<QuestMarker> questMarkers = new List<QuestMarker>();

    public RawImage compassImage;
    public Transform FirstPersonController;

    public float maxDistance = 2000f;

    float compassUnit;

    public QuestMarker lac;
    public QuestMarker refuge;
    public QuestMarker plage;
    public QuestMarker marais;
    public QuestMarker caverne;

    private void Start()
    {
        compassUnit = compassImage.rectTransform.rect.width / 360f;

        AddQuestMarker(lac);
        AddQuestMarker(refuge);
        AddQuestMarker(plage);
        AddQuestMarker(marais);
        AddQuestMarker(caverne);

    }

    private void Update()
    {
        compassImage.uvRect = new Rect(FirstPersonController.localEulerAngles.y / 360f, 0f, 1f, 1f);
  

        foreach (QuestMarker marker in questMarkers)
        {
            marker.image.rectTransform.anchoredPosition = GetPosOnCompass(marker);

            float dst = Vector2.Distance(new Vector2(FirstPersonController.transform.position.x, FirstPersonController.transform.position.z), marker.position);
            float scale = 0f;

            if (dst < maxDistance)
                scale = 1f - (dst / maxDistance);

            marker.image.rectTransform.localScale = Vector3.one * scale;

        }

    }

    public void AddQuestMarker (QuestMarker marker)
    {
        GameObject newMarker = Instantiate(iconPrefab, compassImage.transform);
        marker.image = newMarker.GetComponent<Image>();
        marker.image.sprite = marker.icon;

        questMarkers.Add(marker);

    }

    Vector2 GetPosOnCompass (QuestMarker marker)
    {
        Vector2 playerPos = new Vector2(FirstPersonController.transform.position.x, FirstPersonController.transform.position.z);
        Vector2 playerFwd = new Vector2(FirstPersonController.transform.forward.x, FirstPersonController.transform.forward.z);

        float angle = Vector2.SignedAngle(marker.position - playerPos, playerFwd);

        return new Vector2(compassUnit * angle, 0f);
    }

}
   
Pour ceux que ça intéresse, voici le code supplémentaire de la barre

Code : Tout sélectionner

using UnityEngine;
using UnityEngine.UI;

public class QuestMarker : MonoBehaviour
{
    public Sprite icon;
    public Image image;

    public Vector2 position
    {
        get { return new Vector2(transform.position.x, transform.position.z); }
    }
}
Dernière édition par stigma le 19 Juin 2023 11:13, édité 2 fois.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6225
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Décaler une image

Message par boubouk50 » 19 Juin 2023 08:34

Tu peux simplement créer une hiérarchie pour le décaler.
Un nœud principal qui s'occupera de positionner l'objet (comme c'est le cas) et un nœud enfant qui contiendra le texte et qui sera décalé de la valeur que tu souhaites vers le bas.
Sinon, il te faut ajouter un delta en pixel en y lors de l'affectation de la position :

Code : Tout sélectionner

// delta est Vector2 (ou 3) avec une valeur de décalage en pixel en Y (probablement négative)
marker.image.rectTransform.anchoredPosition = GetPosOnCompass(marker) + delta;
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
stigma
Messages : 1414
Inscription : 17 Nov 2012 18:29
Localisation : Perdu dans les mondes de Myst
Contact :

Re: Décaler une image

Message par stigma » 19 Juin 2023 10:14

Comme j'ai dit, je ne connais pas grand chose au C#. Comment déclarer cette variable delta ?

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6225
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Décaler une image

Message par boubouk50 » 19 Juin 2023 10:56

Code : Tout sélectionner

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

public class Compass : MonoBehaviour
{
    public GameObject iconPrefab;
    List<QuestMarker> questMarkers = new List<QuestMarker>();
    // Depuis l'inspecteur, change cette variable au runtime pour définir la position
    public Vector2 delta;

    public RawImage compassImage;
    public Transform FirstPersonController;

    public float maxDistance = 2000f;

    float compassUnit;

    public QuestMarker lac;
    public QuestMarker refuge;
    public QuestMarker plage;
    public QuestMarker marais;
    public QuestMarker caverne;

    private void Start()
    {
        compassUnit = compassImage.rectTransform.rect.width / 360f;

        AddQuestMarker(lac);
        AddQuestMarker(refuge);
        AddQuestMarker(plage);
        AddQuestMarker(marais);
        AddQuestMarker(caverne);

    }

    private void Update()
    {
        compassImage.uvRect = new Rect(FirstPersonController.localEulerAngles.y / 360f, 0f, 1f, 1f);
  

        foreach (QuestMarker marker in questMarkers)
        {
            marker.image.rectTransform.anchoredPosition = GetPosOnCompass(marker) + delta;

            float dst = Vector2.Distance(new Vector2(FirstPersonController.transform.position.x, FirstPersonController.transform.position.z), marker.position);
            float scale = 0f;

            if (dst < maxDistance)
                scale = 1f - (dst / maxDistance);

            marker.image.rectTransform.localScale = Vector3.one * scale;

        }

    }

    public void AddQuestMarker (QuestMarker marker)
    {
        GameObject newMarker = Instantiate(iconPrefab, compassImage.transform);
        marker.image = newMarker.GetComponent<Image>();
        marker.image.sprite = marker.icon;

        questMarkers.Add(marker);

    }

    Vector2 GetPosOnCompass (QuestMarker marker)
    {
        Vector2 playerPos = new Vector2(FirstPersonController.transform.position.x, FirstPersonController.transform.position.z);
        Vector2 playerFwd = new Vector2(FirstPersonController.transform.forward.x, FirstPersonController.transform.forward.z);

        float angle = Vector2.SignedAngle(marker.position - playerPos, playerFwd);

        return new Vector2(compassUnit * angle, 0f);
    }

}
   
En mode Play, va sur le component Compass, et modifie la valeur Y de delta depuis l'inspector. Une fois la bonne position trouvée, copie la valeur. Coupe le mode Play et colle cette valeur dans le component Compass. La valeur en mode Play n'étant pas conservée.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
stigma
Messages : 1414
Inscription : 17 Nov 2012 18:29
Localisation : Perdu dans les mondes de Myst
Contact :

Re: Décaler une image

Message par stigma » 19 Juin 2023 11:13

boubouk mon sauveur :coeur: :coeur: :coeur:

Image

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6225
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [Résolu]Décaler une image

Message par boubouk50 » 19 Juin 2023 11:29

Image
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
stigma
Messages : 1414
Inscription : 17 Nov 2012 18:29
Localisation : Perdu dans les mondes de Myst
Contact :

Re: [Résolu]Décaler une image

Message par stigma » 20 Juin 2023 09:03

Le vrai, je le connais déjà :super:

Répondre

Revenir vers « Scripting »