【问题标题】:How To Allow Player To Move In Front And Behind Objects In UnityUnity中如何让玩家在物体前后移动
【发布时间】:2017-02-23 15:11:39
【问题描述】:

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

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

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

【问题讨论】:

  • 您好,欢迎来到 SO。请务必按原样详细解释您正在处理的预期和当前情况;很难理解您遇到的问题。

标签: c# unity3d unity3d-2dtools depth-buffer


【解决方案1】:

解决方案实际上取决于你如何完成你的关卡。

如果一切都在同一条车道上,可以这么说,那么修改精灵渲染器的排序顺序可以为您提供解决方案。 检查精灵渲染器文档: https://docs.unity3d.com/Manual/class-SpriteRenderer.html

现在挑战来了,如果一切都在不同的层上。层是指您提供精灵渲染器的排序层。这可能会产生一些有趣的结果,因为仅仅修改排序顺序是不够的,您还必须更改图层。如果我没记错的话,您将在项目设置中将图层更改为上面的图层。但是,如果所有内容都在同一层上,那么更改排序顺序就足够了。

不要忘记考虑碰撞检测的潜在问题,因为改变游戏对象的车道意味着你可能必须改变它的物理层,所以碰撞器不会撞到层上的任何东西正面。 https://docs.unity3d.com/Manual/LayerBasedCollision.html

希望这会引导您朝着正确的方向前进。

【讨论】:

    【解决方案2】:

    听起来您需要更改精灵的排序顺序,以便当玩家在树上方时,玩家精灵在树后面排序。尝试在播放器和所有树上的组件的 update() 中添加类似的内容。

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

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

    【讨论】:

      【解决方案3】:

      一种解决方案是简单地更改播放器位置的 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));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-04
        • 1970-01-01
        相关资源
        最近更新 更多