[Résolu] Faire tourner objet avec le doigt avec un effet de "delay"

Toutes les questions sur le développement Mobile, y compris la partie script.
Leuprochon
Messages : 60
Inscription : 04 Déc 2017 19:12

[Résolu] Faire tourner objet avec le doigt avec un effet de "delay"

Message par Leuprochon » 21 Déc 2018 15:23

Bonjour à tous !

Alors excusez moi pour le titre du topic mais je ne savais pas comment décrire l'effet voulu en 1 mot ...

Donc l'idée est de faire tourner un objet avec le doigt (simple) mais que celui ci ne s'arrête pas immédiatement, qu'il soit entraîné par la force du mouvement et s'arrête petit à petit quelques secondes après, comme une roue que l'on fait tourner (histoire d'avoir un beau mouvement fluide).
J'ai grosso modo réussi à faire ce que je voulais à un détails près ! Sur PC ça marche très bien, sur android moins bien ! J'ai 2 soucis :

- J'aimerais qu'il faille cliquer sur mon objet pour pouvoir le faire tourner, et non cliquer n'importe ou sur mon écran
- Sur android il utilise la position de la ou je clique pour faire tourner mon objet. C'est à dire que si clique à X = 10 alors il va me faire une rotation de mon objet pour que Rotation Y = 10, et ensuite je pourrai faire tourner mon objet en faisant glisser mon doigt. Si j'appuie sur mon écran à X=100, alors il me fait une rotation très vite pour aller jusqu'à Rotation Y = 100 etc. Ce problème n'existe pas sur pc.

J'ai trouvé un petit code qui marche pas trop mal mais j'arrive pas à le combiner au miens !

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class RotatePortals: MonoBehaviour
{
	public Transform target;
	public float distance = 2.0f;
	public float xSpeed = 20.0f;
	public float ySpeed = 20.0f;
	public float yMinLimit = -90f;
	public float yMaxLimit = 90f;
	public float xMinLimit = -90f;
	public float xMaxLimit = 90f;
	public float distanceMin = 10f;
	public float distanceMax = 10f;
	public float smoothTime = 2f;
	float rotationYAxis = 0.0f;
	float rotationXAxis = 0.0f;
	float velocityX = 0.0f;
	float velocityY = 0.0f;

	private Vector3 _mouseReference; 
	private Vector3 _mouseOffset; 

	// Use this for initialization
	void Start()
	{
		Vector3 angles = transform.eulerAngles;
		rotationYAxis = angles.y;
		rotationXAxis = angles.x;
		// Make the rigid body not change rotation
		if (GetComponent<Rigidbody>())
		{
			GetComponent<Rigidbody>().freezeRotation = true;
		}
	}
	void LateUpdate()
	{

		if (target)
		{
			_mouseOffset = (Input.mousePosition - _mouseReference);

			if (Input.GetMouseButton(0))
			{
				velocityX += xSpeed * (_mouseOffset.x + _mouseOffset.y) * distance * 0.02f;
				velocityY += ySpeed * Input.GetAxis("Mouse Y") * 0.02f;
			}
			rotationYAxis += -velocityX;
			rotationXAxis -= -velocityY;
			rotationXAxis = ClampAngle(rotationXAxis, yMinLimit, yMaxLimit);
			rotationYAxis = ClampAngle(rotationYAxis, xMinLimit, xMaxLimit);
			Quaternion fromRotation = Quaternion.Euler(transform.rotation.eulerAngles.x, transform.rotation.eulerAngles.y, 0);
			Quaternion toRotation = Quaternion.Euler(rotationXAxis, rotationYAxis, 0);
			Quaternion rotation = toRotation;

			//distance = Mathf.Clamp(distance - Input.GetAxis("Mouse ScrollWheel") * 5, distanceMin, distanceMax);
			//RaycastHit hit;
			//if (Physics.Linecast(target.position, transform.position, out hit))
			//{
			//distance -= hit.distance;
			//}
			//Vector3 negDistance = new Vector3(0.0f, 0.0f, -distance);
			//Vector3 position = rotation * negDistance + target.position;

			transform.rotation = rotation;
			_mouseReference = Input.mousePosition;
			//transform.position = position;
			velocityX = Mathf.Lerp(velocityX, 0, Time.deltaTime * smoothTime);
			velocityY = Mathf.Lerp(velocityY, 0, Time.deltaTime * smoothTime);

		}
	}
	public static float ClampAngle(float angle, float min, float max)
	{
		if (angle < -360F)
			angle += 360F;
		if (angle > 360F)
			angle -= 360F;
		return Mathf.Clamp(angle, min, max);
	}

	void OnMouseDown() 
	{ 

		// store mouse position 
		_mouseReference = Input.mousePosition; 
	} 
}
Et voici le code qui fonctionne pas trop mal et pour lequel je n'ai pas ce soucis (il ne fait pas exactement ce que je veux pour ça que je ne l'utilise pas)

Code : Tout sélectionner

using UnityEngine; 
using System.Collections; 
[RequireComponent(typeof(MeshRenderer))]

public class test : MonoBehaviour {

	#region ROTATE 
	private float _sensitivity = 1f; 
	private Vector3 _mouseReference; 
	private Vector3 _mouseOffset; 
	private Vector3 _rotation = Vector3.zero; 
	private bool _isRotating;

	#endregion

	void Update() 
		{ 
		if(_isRotating) 
		{ 
			// offset 
			_mouseOffset = (Input.mousePosition - _mouseReference); 
			// apply rotation 
			_rotation.y = -(_mouseOffset.x + _mouseOffset.y) * _sensitivity; 
			// rotate 
			gameObject.transform.Rotate(_rotation); 
			// store new mouse position 
			_mouseReference = Input.mousePosition; 
		} 
	}
	void OnMouseDown() 
	{ 
		// rotating flag 
		_isRotating = true; 
		// store mouse position 
		_mouseReference = Input.mousePosition; 
	} 
	void OnMouseUp() 
	{ 
		// rotating flag 
		_isRotating = false; 
	} 
}
Si quelqu'un a une idée je suis preneur !!

Merci bien (:

Leuprochon

Leuprochon
Messages : 60
Inscription : 04 Déc 2017 19:12

Re: [Résolu] Faire tourner objet avec le doigt avec un effet de "delay"

Message par Leuprochon » 15 Jan 2019 12:08

Pour ceux que ça intéresse voici la réponse qu'on m'a donné et qui marche très bien :
Insert at line 43 in the first script something like so:

Code : Tout sélectionner

    if (Input.GetMouseButtonDown(0))  // only fires on the frame that the button goes DOWM
    {
      // captures the current reference so it is "zeroed out"
      _mouseReference = Input.mousePosition;
    }
Just be sure that happens BEFORE you calculate _mouseOffset.

Répondre

Revenir vers « Développement plateformes mobile Iphone et Android »