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;
}
}
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;
}
}
Merci bien (:
Leuprochon