C# 如何让玩家在物体前后统一移动

C# 如何让玩家在物体前后统一移动,c#,unity3d,unity3d-2dtools,depth-buffer,C#,Unity3d,Unity3d 2dtools,Depth Buffer,我正在用Unity 3D制作一个2D风格的游戏。相机只从左到右跟随玩家,但我希望我的环境有一种深度感。这不是一个自上而下的游戏,它更像是一个2d马里奥平台游戏。我希望玩家能够在物体前面移动,例如,当他们按下时,一棵树会在物体后面,如果他们按下向上移动,则会进一步回到环境中,这样树现在就在物体前面 这是我到目前为止的动作脚本 using UnityEngine; using System.Collections; public class Move : MonoBehaviour {

我正在用Unity 3D制作一个2D风格的游戏。相机只从左到右跟随玩家,但我希望我的环境有一种深度感。这不是一个自上而下的游戏,它更像是一个2d马里奥平台游戏。我希望玩家能够在物体前面移动,例如,当他们按下时,一棵树会在物体后面,如果他们按下向上移动,则会进一步回到环境中,这样树现在就在物体前面

这是我到目前为止的动作脚本

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); 
        }
    }
}
使用UnityEngine;
使用系统集合;
公共阶级运动:单一行为{
动画师;
//用于初始化
无效开始(){
anim=GetComponent();
}
//每帧调用一次更新
无效更新(){
运动();
}
空位移动(){
anim.SetFloat(“速度”,Mathf.Abs(Input.GetAxisRaw(“水平”));
如果(Input.GetAxisRaw(“水平”)>0){
transform.Translate(Vector2.right*4f*Time.deltaTime);
transform.eulerAngles=新向量2(0,0);
}
if(Input.GetAxisRaw(“水平”)<0){
transform.Translate(Vector2.right*4f*Time.deltaTime);
transform.eulerAngles=新向量2(0,180);
}
if(Input.GetAxisRaw(“垂直”)>0){
transform.Translate(Vector2.up*4f*Time.deltaTime);
transform.eulerAngles=新向量2(0,0);
}

如果(Input.GetAxisRaw(“Vertical”)听起来您需要更改精灵的排序顺序,以便当播放器位于树的上方时,播放器精灵在树的后面进行排序。请尝试将类似的内容添加到播放器和所有树上组件的update()中

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

如果您在导入精灵时将其枢轴设置为与地面接触的位置,则此方法效果最佳。

一种解决方案是简单地更改播放器位置的Z轴值。我的理解是,如果相机指向+Z方向,则Z值较低的精灵将位于其他精灵的前面

通过更改玩家的Z值,将更改绘制顺序,从而使其显示在某些元素的后面或前面。为了实现这一点,您的关卡应该与位于Z轴上不同值的环境一起构建

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

解决方案实际上取决于你的水平

可以说,如果所有内容都在同一条通道上,那么修改sprite渲染器排序顺序可以为您提供解决方案。 查看精灵渲染器文档:

现在的挑战来了,如果所有的东西都在不同的层上。我所说的层是指您提供的sprite渲染器的排序层。这会产生一些有趣的结果,因为仅仅修改排序顺序是不够的,您还必须更改层。如果需要,您将在项目设置中将层更改为它上面的层我没弄错。如果所有的东西都在同一层,那么改变排序顺序就足够了

不要忘记考虑碰撞检测的潜在问题,因为改变游戏对象的车道将意味着你可能不得不改变它的物理层,所以对撞机不会击中前面的层上的任何东西。


希望这能引导您走向正确的方向。

大家好,欢迎来到SO。请务必详细解释您正在处理的预期和当前情况,因为很难理解您所面临的问题。