2017-10-11 6 views
1

La première chose que vous remarquerez est le titre compliqué et déroutant. Alors laissez-moi vous expliquer cela. J'essaie de faire un jeu 2D dans un espace 3D en utilisant Unity. Et j'utilise un personnage 3D en tant que joueur. Cela ressemble à ce que:Faire un objet 3D ressembler à un point dans un espace 2D

Pic1

Comme vous pouvez le voir l'arrière-plan (Une carte Google) est en deux dimensions. Alors que le joueur est un objet 3D étendu sur le sol (il semble juste qu'il est debout).

Cela fonctionne très bien jusqu'à présent. Mais je veux que le personnage 3D ressemble à un point sur la carte d'arrière-plan.

Par exemple:

Hes looking towards

Et deux autres exemples:

enter image description here

enter image description here

Le cercle noir représente la position engagée. Donc, je n'ai absolument aucune idée si theres un moyen de le faire, ou même si c'est possible de le faire.

J'ai essayé le code suivant, mais qui ne tourne mon personnage sur un autre axe:

Vector3 targetDir = tapped.position - transform.position; 

    float step = speed * Time.deltaTime; 

    Vector3 newDir = Vector3.RotateTowards(transform.forward, targetDir, step, 0.0F); 

    transform.rotation = Quaternion.LookRotation(newDir); 

est-il même un moyen d'y parvenir? Im actuellement hors des idées ... Je serais très heureux pour toute aide que je peux obtenir!

+0

Juste 0 y de la direction de la cible. – George

+0

@DreamsOfElectricSheep Merci pour votre réponse rapide! Mais ça ne marche pas. Le joueur "Laisse" sur le sol tout le temps pour créer l'illusion qu'il marcherait dessus. Quand je mets y à zéro, il se trouve soudainement vraiment au sol O.o – genaray

+0

Je pense que si vous changez y et z il devrait montrer cet effet. Si votre direction de cible est (1,0,1) faites-lui face (1,1,0) à la place. – yes

Répondre

1

Cela devrait faire l'affaire. Faites de votre modèle un enfant d'un vide non réorienté, le parement est comme dans votre première image, et mettez le script ci-dessous dessus. Je ne savais pas comment vous voyez le point à regarder, c'est ce que j'ai essayé dans l'unité. J'espère que cela aide.

using UnityEngine; 

public class LookAtTarget : MonoBehaviour { 

    //assign in inspector 
    public Collider floor; 

    //make sure you Camera is taged as MainCamera, or make it public and assign in inspector 
    Camera mainCamera; 

    RaycastHit rayHit; 

    //not needed when assigned in the inspector  
    void Start() { 
     mainCamera = Camera.main; 
    } 

    void Update() { 

     if(Input.GetMouseButtonUp(0)) { 

      if(floor.Raycast(mainCamera.ScreenPointToRay(Input.mousePosition), out rayHit, Mathf.Infinity)) { 
       //its actually the inverse of the lookDirection, but thats is because the rotation around z later. 
       Vector3 lookDirection = transform.position - rayHit.point; 

       float angle = Vector3.Angle(lookDirection, transform.forward); 

       transform.rotation = Quaternion.AngleAxis(Vector3.Dot(Vector3.right, lookDirection) > 0 ? angle : angle * -1, Vector3.forward); 

      } 

     } 

    } 
} 
+0

Merci pour votre réponse rapide! Je viens de le tester. Mais d'une manière ou d'une autre, le personnage reste sur la carte au lieu d'être paralellé maintenant. Il tourne aussi autour de l'axe z. Il devrait être parallèle à la carte et tourne autour de l'axe des x pour lui faire regarder au point. Et je viens d'obtenir le point en écoutant les entrées tactiles et raycasting :) – genaray