Je suis Vinchont et je viens de m'inscrire.
Donc je suis développeur java et web à la base, et je me suis mis à Unity il y a quelques mois maintenant. J'ai deux projets en cours actuellement: un rail shooter dont le moteur est bien avancé mais les besoins en production sont trop grands pour moi seul, et un petit jeu de reflexion à mi chemin entre un "point&click" et un "escape the room" commencé au début de la semaine et qui m'occupe là maintenant tout de suite.
Donc le joueur assis à son bureau détaille et interagit avec des objets variés en les manipulant. cf le sreen suivant:
les interactions sont contextuelles, si le joueur clique sur l'objet, il manipulera l'objet, s'il clique ailleurs, il bougera la tête.
Le problème vient du script de manipulation de la caméra et de l'objet. J'ai repiqué un script que j'ai modifié comme suit:
Code : Tout sélectionner
public class MyMouseOrbit : MonoBehaviour {
// Différence du déplacement de la souris entre deux update
static float deltaX = 0F;
static float deltaY = 0F;
// Multiplicateur
static float sensitivityX = 8F;
static float sensitivityY = 8F;
// Flottants pour stocker les coordonnées de rotation en X et Y à réinjecter après traitement
//valeur de rotation de l'axe Y
static float mHdg = 0F;
//valeur de rotation de l'axe X
static float mPitch = 0F;
// flag pour définir le type de mouvement à effectuer
static bool moveObject = false;
// Variable qui récupèrera l'instance l'objet en cours d'utilisation
GameObject currentObject = null;
void Start()
{
// owt?
}
void Update()
{
// Vérification faite au clic sur l'écran
// sert à définir quel objet a été cliqué
// pour savoir quel comportement adopter
if(Input.GetMouseButtonDown(0)){
currentObject = WhatIsClicked();
Debug.Log (currentObject.tag);
// Partie qui pose problème
if( currentObject != null && currentObject.tag == "object"){
moveObject = true;
mPitch = currentObject.transform.eulerAngles.x;
mHdg = currentObject.transform.eulerAngles.y;
} else {
moveObject = false;
mPitch = gameObject.transform.eulerAngles.x;
mHdg = gameObject.transform.eulerAngles.y;
}
// Fin de la partie qui pose problème
}
// Garder le comportement tant que le bouton
// reste enfoncé
if (Input.GetMouseButton(0))
{
deltaX = Input.GetAxis("Mouse X") * sensitivityX;
deltaY = Input.GetAxis("Mouse Y") * sensitivityY;
// Le code n'est pas factorisé parce que je ne sais pas
// encore quels autres comportements viendront se greffer
if(moveObject){
// ATTENTION: les signes moins sont inversés ici parce que
// l'objet et la caméra ne tournent pas de la meme manière
ChangeHeading(-deltaX, currentObject);
ChangePitch(deltaY, currentObject);
} else {
// ATTENTION: les signes moins sont inversés ici parce que
// l'objet et la caméra ne tournent pas de la meme manière
ChangeHeading(deltaX, gameObject);
ChangePitch(-deltaY, gameObject);
}
}
// Action à lancer au relachement du bouton de la souris
if(Input.GetMouseButtonUp(0)){
// Rien à faire pour l'instant
}
}
GameObject WhatIsClicked(){
Ray ray = Camera.main.ScreenPointToRay( Input.mousePosition );
RaycastHit hit;
// On test sur quel objet 3D on clic
if( Physics.Raycast( ray, out hit, 100 ) ){
GameObject localObject = hit.transform.gameObject;
return localObject;
}
return null;
}
// Modification de l'axe X
void ChangePitch(float aVal, GameObject localObject)
{
mPitch += aVal;
WrapAngle(ref mPitch);
localObject.transform.eulerAngles = new Vector3(mPitch, mHdg, 0);
}
// Modification de l'axe Y
void ChangeHeading(float aVal, GameObject localObject)
{
mHdg += aVal;
WrapAngle(ref mHdg);
localObject.transform.eulerAngles = new Vector3(mPitch, mHdg, 0);
}
public static void WrapAngle(ref float angle)
{
if(moveObject){
// Reinitialise la valuer a chaque tour complet
if(angle < -0F)
angle += 360F;
if(angle > 360F)
angle -= 360F;
} else {
// Butee dans le mouvement du GameObject
if(angle < -90F)
angle = -90F;
if(angle > 90F)
angle = 90F;
}
}
}
J'ai recherché sur ce forum et ailleurs avant de poster ici et tout ce que j'ai trouvé, c'est "n'utilisez pas eulerAngles pour lire les coordonnées de rotation, c'est réservé à l'écriture, vous obtiendrez des trucs aberrants si vous le faites", ce que je confirme. Mais j'ai du mal à voir une alternative, même pas une petite conversion de Quaternion vers Euler.
J'ai bien cherché à utiliser les données transform.rotation, ce sont des flottants, et il faut les cos/sin, et les mouvements de rotation sont moins beaux/réguliers (parce que sinusoidaux).
Quelqu'un a-t-il un conseil?
Grazie mille d'avance.
signé Vinchont. Je vous kiss.