[MY] Limiter le mouvement

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
ludo2vie
Messages : 13
Inscription : 15 Juin 2021 05:43

[MY] Limiter le mouvement

Message par ludo2vie » 27 Sep 2021 14:30

Bonjour à tous,
J'utilise un script qui me permet de déplacer ma caméra autour d'un objet prédéfini lors du click droit.
ça fonctionne très bien, mais j'aimerais apporter une modifications, et j'avoue ne pas savoir comment faire.

J'aimerais limiter le mouvement de zoom (géré par l'avance et recul de la molette de la souris).
En gros, pouvoir délimiter une zone qui empêcherais soit d'avancer, soit de reculer.
J'ai pensé à créer des Collider, mais je ne sais pas si il n'y a pas plus simple.

Merci d'avance de vos retours.

Voici mon script :

Code : Tout sélectionner

public class MouseOrbit : MonoBehaviour
{
    public Transform target;
    public float maxOffsetDistance = 2000f;
    public float orbitSpeed = 15f;
    public float panSpeed = .5f;
    public float zoomSpeed = 10f;
    private Vector3 targetOffset = Vector3.zero;
    private Vector3 targetPosition;

    void Start()
    {
        if (target != null) transform.LookAt(target);
    }

    void Update()
    {
        targetPosition = target.position + targetOffset;


        if (target != null)
        {
            targetPosition = target.position + targetOffset;

            // Right Mouse to Orbit
            if (Input.GetMouseButton(1))
            {
                transform.RotateAround(targetPosition, Vector3.up, Input.GetAxis("Mouse X") * orbitSpeed);
                float pitchAngle = Vector3.Angle(Vector3.up, transform.forward);
                float pitchDelta = -Input.GetAxis("Mouse Y") * orbitSpeed;
                float newAngle = Mathf.Clamp(pitchAngle + pitchDelta, 0f, 180f);
                pitchDelta = newAngle - pitchAngle;
                transform.RotateAround(targetPosition, transform.right, pitchDelta);
            }
            //Scroollwheel for zoom
            transform.position += transform.forward * Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
        }
    }
}

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5643
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: [MY] Limiter le mouvement

Message par boubouk50 » 27 Sep 2021 16:38

Tu pourrais simplement définir une distance min et max pour borner ton déplacement forward de caméra.
Je l'ai fait à main levée, mais ça devrait être pas loin de la solution.

Code : Tout sélectionner

// Déterminer si la molette a été activée (pour éviter des calculs inutiles si == 0)
if (Mathf.Abs (Input.GetAxis("Mouse ScrollWheel")) > 0.001f)
{
	// Calculer le vecteur directionnel de déplacement
	Vector3 zoomVector = transform.forward * Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
	
	// Calculer la future distance issue de la translation par ce vecteur
	float distance = Mathf.Distance (transform.position+zoomVector, targetPosition);
	if (distance < minDistance)
	{
		// Calculer le vecteur restant jusqu'à la distance mini (signe positif)
		zoomVector = transform.forward * (minDistance - distance);
	}
	else if  (distance > maxDistance)
	{
		// Calculer le vecteur restant jusqu'à la distance maxi (signe négatif)
		zoomVector = transform.forward * (maxDistance - distance);
	}
	
	// Appliquer le déplacement selon le vecteur calculé
	transform.Translate (zoomVector, Space.World);
	// ou transform.position += zoomVector;
}
"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

ludo2vie
Messages : 13
Inscription : 15 Juin 2021 05:43

Re: [MY] Limiter le mouvement

Message par ludo2vie » 27 Sep 2021 16:56

Hello,
J'ai voulu tester, mais j'ai une erreur avec Mathf.Distance ...
Un oubli de ma part ??

Image

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5643
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: [MY] Limiter le mouvement

Message par boubouk50 » 27 Sep 2021 17:07

Je ne vois pas l'image (Proxy de ma boite) mais je sens que je n'ai pas utilisé la bonne classe...
Distance est disponible depuis Vector3 pas Mathf:
Vector3.Distance (Vector3 a, Vector3 b)
"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

Répondre

Revenir vers « Scripting »