Page 1 sur 1

[Résolu]Décaler une image

Publié : 17 Juin 2023 09:04
par stigma
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); }
    }
}

Re: Décaler une image

Publié : 19 Juin 2023 08:34
par boubouk50
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;

Re: Décaler une image

Publié : 19 Juin 2023 10:14
par stigma
Comme j'ai dit, je ne connais pas grand chose au C#. Comment déclarer cette variable delta ?

Re: Décaler une image

Publié : 19 Juin 2023 10:56
par boubouk50

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.

Re: Décaler une image

Publié : 19 Juin 2023 11:13
par stigma
boubouk mon sauveur :coeur: :coeur: :coeur:

Image

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

Publié : 19 Juin 2023 11:29
par boubouk50
Image

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

Publié : 20 Juin 2023 09:03
par stigma
Le vrai, je le connais déjà :super: