0
votes

Caméra rotative autour de la sphère dans Unity / C # à l'aide des touches fléchées

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);

    }
}


5 commentaires

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 Be caméra.main.transform.rotaTeartound


@Flexicoder donne toujours le même problème après avoir retiré la transformation supplémentaire


@Mohamadmoustafa avez-vous trouvé une solution à cela?


4 Réponses :


1
votes

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: xxx pré>

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);
}


0 commentaires

-2
votes

Regardez cela.

https://docs.unity3d.com/scriptreference/transform.rotateartaround.html

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 cela pourrait fonctionner


3 commentaires

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.



0
votes

Vous ne voulez pas toujours faire pivoter autour de l'axe droit global. Vous pouvez utiliser un produit croisé entre global down et la direction du point de référence sur la caméra pour trouver un axe approprié.

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.

aussi, Caméra.Main Appels FindGameObjectSwithTag en interne, il est donc Recommandé pour mettre en cache les résultats.

Au total, cela pourrait ressembler à ceci: xxx


0 commentaires

0
votes

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);
    }
}


0 commentaires