2017-02-23 4 views
1

Je fais un jeu en utilisant Unity 3D dans le style de 2D. La caméra ne fait que suivre le joueur de gauche à droite mais je veux que mon environnement ait une sensation de profondeur. Ce n'est pas un jeu de haut en bas, c'est plutôt un jeu de plateforme 2d mario. Je veux que le joueur puisse se déplacer devant des objets, de sorte qu'un arbre par exemple soit derrière eux quand ils appuient dessus et s'ils se pressent pour retourner plus loin dans l'environnement pour que l'arbre soit maintenant devant eux .Comment permettre au joueur de se déplacer à l'avant et derrière des objets dans l'unité

Ceci est mon script de mouvement jusqu'à présent.

using UnityEngine; 
using System.Collections; 

public class Move : MonoBehaviour { 

    Animator anim; 

    // Use this for initialization 
    void Start() { 
     anim = GetComponent<Animator>(); 
    } 

    // Update is called once per frame 
    void Update() { 
     Movement(); 
    } 
    void Movement(){ 

     anim.SetFloat("Speed", Mathf.Abs (Input.GetAxisRaw ("Horizontal"))); 

     if (Input.GetAxisRaw ("Horizontal") > 0) { 
      transform.Translate(Vector2.right* 4f*Time.deltaTime); 
      transform.eulerAngles = new Vector2(0, 0); 
     } 
     if (Input.GetAxisRaw ("Horizontal") < 0) { 
      transform.Translate (Vector2.right * 4f * Time.deltaTime); 
      transform.eulerAngles = new Vector2 (0, 180); 
     } 

     if(Input.GetAxisRaw("Vertical") >0){ 
      transform.Translate (Vector2.up * 4f * Time.deltaTime); 
      transform.eulerAngles = new Vector2(0, 0); 
    } 

     if(Input.GetAxisRaw("Vertical") <0){ 
      transform.Translate (Vector2.down * 4f * Time.deltaTime); 
      transform.eulerAngles = new Vector2(0, 0); 
     } 
    } 
} 
+0

Bonjour et bienvenue à SO. Veuillez vous assurer d'expliquer en détail la situation attendue et actuelle avec laquelle vous traitez, telle qu'elle est; Il est difficile de comprendre le problème que vous avez. –

Répondre

1

La solution dépend vraiment de la façon dont vous faites votre niveau.

Si tout est sur la même voie, pour ainsi dire, alors la modification de l'ordre de tri des moteurs de sprite pourrait vous fournir la solution. Vérifiez la documentation du moteur de rendu de sprite:

Maintenant, le défi est de savoir si tout est sur des calques séparés. Par couches, je veux dire la couche de tri que vous fournissez au moteur de rendu sprite. Cela peut donner des résultats intéressants, car la simple modification de l'ordre de tri ne suffira pas, vous devrez également changer de calque. Vous changerez le calque au dessus de celui-ci dans vos paramètres de projet, si je ne me trompe pas. Si tout est sur la même couche, alors changer l'ordre de tri serait plus que suffisant. N'oubliez pas de prendre en compte les problèmes potentiels avec la détection de collision, car changer la voie de l'objet de jeu signifie que vous devrez peut-être changer de couche physique pour que les collisionneurs ne touchent rien sur la couche. devant. https://docs.unity3d.com/Manual/LayerBasedCollision.html

Espérons que cela vous mène dans la bonne direction.

1

On dirait que vous avez besoin de changer l'ordre de tri pour vos sprites de sorte que lorsque le joueur est au-dessus d'un arbre, le genre de lutin joueur derrière. Essayez d'ajouter quelque chose comme ça à la mise à jour() d'un composant de votre lecteur et de tous vos arbres.

var sprite = GetComponent<SpriteRenderer>(); 
sprite.sortingOrder = Mathf.RoundToInt(transform.position.y * -10f); 

Cette méthode fonctionne mieux si vous définissez le pivot des sprites à l'endroit où ils touchent le sol lorsque vous les importez.

+0

Ou vous pouvez définir la commande dans l'éditeur – Thalthanas

0

Une solution consiste simplement à changer la valeur de l'axe Z de la position de votre lecteur. Ma compréhension est que, avec une caméra pointant dans la direction + Z, les sprites avec une valeur Z plus basse seront positionnés devant les autres.

En changeant la valeur Z de votre lecteur, vous changez l'ordre dans lequel ils sont dessinés, ce qui les fait apparaître derrière ou devant certains éléments. Pour que cela fonctionne, votre niveau doit être construit avec l'environnement positionné à différentes valeurs dans l'axe Z, bien sûr.

if (Input.GetKeyDown (KeyCode.UpArrow)) { 
     transform.Translate (new Vector3 (0, 0, 1)); 
} 
if (Input.GetKeyDown (KeyCode.DownArrow)) { 
     transform.Translate (new Vector3 (0, 0, -1)); 
}