Page 1 sur 1

[MY] Limiter le mouvement

Publié : 27 Sep 2021 14:30
par ludo2vie
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;
        }
    }
}

Re: [MY] Limiter le mouvement

Publié : 27 Sep 2021 16:38
par boubouk50
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;
}

Re: [MY] Limiter le mouvement

Publié : 27 Sep 2021 16:56
par ludo2vie
Hello,
J'ai voulu tester, mais j'ai une erreur avec Mathf.Distance ...
Un oubli de ma part ??

Image

Re: [MY] Limiter le mouvement

Publié : 27 Sep 2021 17:07
par boubouk50
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)