Je suis en train d'apprendre l'unité et j'ai été coincé pendant un moment sur un projet que je fais.
J'ai un modèle de Mars qui reçoit un couple à faire pivoter et a deux lunes en orbite. Je veux pouvoir déplacer la caméra autour d'elle à l'aide des touches fléchées, mais je ne peux pas sembler le comprendre. P>
Code actuel (tout dans un script unique appelé Gamemanager): P>
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameManagerScript : MonoBehaviour
{
// Start is called before the first frame update
public GameObject mars;//planet
public GameObject phobos;//moon1
public GameObject deimos;//moon2
public GameObject refpoint;//empty game object I placed inside mars
//All object are referenced using the inspector
void Start()
{
Camera.main.transform.position = new Vector3(0,0,-200);
Camera.main.transform.LookAt(mars.transform.position);
Rigidbody rb = mars.GetComponent<Rigidbody>();
rb.angularVelocity = new Vector3(0,20,0);
}
// Update is called once per frame
void Update()
{
if(Input.GetKey("up")){
Camera.main.transform.transform.RotateAround(refpoint.transform.position, Vector3.right, 50* Time.deltaTime);
}
else if(Input.GetKey("down")){
Camera.main.transform.transform.RotateAround(refpoint.transform.position, Vector3.right, -50* Time.deltaTime);
}else if(Input.GetKey("right")){
Camera.main.transform.transform.RotateAround(refpoint.transform.position, Vector3.up, -50* Time.deltaTime);
}else if(Input.GetKey("left")){
Camera.main.transform.transform.RotateAround(refpoint.transform.position, Vector3.up, 50* Time.deltaTime);
}
phobos.transform.RotateAround(mars.transform.position, phobos.transform.up, 60*Time.deltaTime);
deimos.transform.RotateAround(mars.transform.position, deimos.transform.up, 50*Time.deltaTime);
}
}
4 Réponses :
Peut-être que ce serait mieux si vous avez défini une autre fonction pour obtenir un nouveau vecteur pour la rotation, comme celui-ci: et dans votre fonction de mise à jour, vous pouvez l'appeler comme ceci: P> void Update(){
Camera.main.transform.RotateAround(refpoint.transform.position, CalculateRotationVector(), 50* Time.deltaTime);
}
Regardez cela. P>
https://docs.unity3d.com/scriptreference/transform.rotateartaround.html p>
Avec cela, vous pouvez faire pivoter autour d'un point donné. Si vous combinez cela avec une entrée clé et une vitesse constante multipliée par temps.delatime code> cela pourrait fonctionner p>
Bien que le lien puisse répondre à la question maintenant, l'utilité de cette question dépend fortement de la durée de validité du lien. Si vous devez prendre des informations sur le lien pour répondre à la question et inclure cela dans la réponse elle-même, cela améliorerait considérablement la qualité à long terme de la réponse.
Ceci est un lien vers l'API officiel de l'unité, c'est toujours valable ... Donc, je n'ai donc pas votre bowvote du tout. Je poste ici parce qu'ils ont des exemples de code, c'est le premier endroit où vous devriez vérifier si vous recherchez une inspiration ...
Je n'ai pas abouti auparavant, mais je regarde à nouveau cette réponse décrit ce qui est déjà dans la question. Cela ne fait rien pour expliquer pourquoi cela pourrait ne pas fonctionner pour l'astucher ou la façon de commencer à résoudre le problème.
Vous ne voulez pas toujours faire pivoter autour de l'axe droit global. Vous pouvez utiliser un produit croisé entre global Cette logique nécessite d'empêcher la caméra d'aller directement au-dessus ou au-dessous de la planète. Serrez la rotation verticale basée sur l'angle entre le haut / bas global et la direction de la référence à la caméra et une "angle minimum" de la caméra peut provenir de l'axe haut / bas. P> aussi, Au total, cela pourrait ressembler à ceci: p> down code> et la direction du point de référence sur la caméra pour trouver un axe approprié. Caméra.Main Code> Appels FindGameObjectSwithTag Code> en interne, il est donc Recommandé pour mettre en cache les résultats. P>
Je crois que RotaTeartound Voici une erreur. Avec les autres solutions suggérées, vous seriez rapidement perdus dans la rotation, la caméra finissant à l'envers ou même latéralement.
public class GameManagerScript : MonoBehaviour
{
// Start is called before the first frame update
public GameObject mars;//planet
public GameObject phobos;//moon1
public GameObject deimos;//moon2
public GameObject refpoint;//empty game object I placed inside mars
//All object are referenced using the inspector
public float cameraAngularVelocity = 60f;
public float cameraDistance = 200;
public float cameraAngleY = 0;
public float cameraAngleX = 0;
private Camera mainCam;
void Start()
{
mainCam = Camera.main;
}
void Update()
{
float angleDelta = cameraAngularVelocity * Time.deltaTime;
//Standard Input management
if (Input.GetKey("up"))
{
cameraAngleX += angleDelta;
}
if (Input.GetKey("down"))
{
cameraAngleX -= angleDelta;
}
if (Input.GetKey("right"))
{
cameraAngleY -= angleDelta;
}
if (Input.GetKey("left"))
{
cameraAngleY += angleDelta;
}
//Alternative using axis
cameraAngleX += Input.GetAxis("Vertical") * angleDelta;
cameraAngleY += Input.GetAxis("Horizontal") * angleDelta;
//Protections
cameraAngleX = Mathf.Clamp(cameraAngleX, -90f, 90f);
cameraAngleY = Mathf.Repeat(cameraAngleY, 360f);
Quaternion cameraRotation =
Quaternion.AngleAxis(cameraAngleY, Vector3.up)
* Quaternion.AngleAxis(cameraAngleX, Vector3.right);
Vector3 cameraPosition =
refpoint.transform.position
+ cameraRotation * Vector3.back * cameraDistance;
mainCam.transform.position = cameraPosition;
mainCam.transform.rotation = cameraRotation;
phobos.transform.RotateAround(mars.transform.position, phobos.transform.up, 60 * Time.deltaTime);
deimos.transform.RotateAround(mars.transform.position, deimos.transform.up, 50 * Time.deltaTime);
}
}
Dupliqué possible de orbite autour d'un jeu d'une unité
@Bugfinder pas vraiment.
Je ne sais pas si c'est le problème, mais ne devrait pas
caméra.main.transform.transform.rotateartound code> Becaméra.main.transform.rotaTeartound code>@Flexicoder donne toujours le même problème après avoir retiré la transformation supplémentaire
@Mohamadmoustafa avez-vous trouvé une solution à cela?