Unity-对象在Z层中的顺序


11

抱歉,标题不是我的问题,我真的不知道如何形容。

我有一张用于我的城市地板的图像,以及一张玩家要走过的所有墙壁或树木的图像(大小相同)。我的结果看起来还不错:

问题在于,如果玩家走到墙前,他就消失了,因为墙的图层顺序高于玩家的顺序:

在此处输入图片说明

有没有解决这个问题的简单方法,还是我必须手动添加所有这些对象并将它们连接到某些脚本?

Answers:


17

要达到此效果:

创建两个排序层GroundObjects

让道路,草地和路径精灵使用“地面”图层。

让您的角色,墙壁和房屋精灵使用“对象”层。

“对象”层上的精灵将要使其“精灵模式”枢轴点为左下,右下或右下。您可以通过在“项目”选项卡中选择一个“精灵”来选择它,然后在“检查器”选项卡中选择枢轴点以调整精灵的导入设置

精灵导入设置

对于地面精灵,您不必担心更改其顺序。

但是,对于对象,可以更改其Sprite Renderer的排序顺序,也可以更改其transform.position.z值。我建议更改转换,因为在移动角色时可能更易于查看和调整浮点数,而在某些情况下更改排序顺序可能看起来不太精确,具体取决于对象的尺寸和大小在现场。

无论哪种情况,都将需要一些代码。

public class SpritePositionSetter : MonoBehaviour {

    void Awake () {
        SetPosition();
    }

    void Update () {
        SetPosition();
    }

    void SetPosition () {
        // If you want to change the transform, use this
        Vector3 newPosition = transform.position;
        newPosition.z = transform.position.y;
        transform.position = newPosition;

        // Or if you want to change the SpriteRenderer's sorting order, use this
        GetComponent<SpriteRenderer>().sortingOrder = (int)transform.position.y;
    }

}

无论采用哪种方式,您基本上都是在告诉精灵其Z索引与其Y位置匹配。

如果将此脚本附加到静态对象(例如墙),则需要取消勾选Inspector中的组件,以使它的Update方法不会在每一帧都被调用。它的Awake方法将调用SetPosition一次,这就是您所需要的。

但是对于您的角色,请保持选中该组件的位置,以便Update将调用SetPosition每个帧,这将在您四处移动时更改角色的Z顺序。并且在移动时,只要“对象”层上的每个子图形都使用“底部”枢轴点,则在移动时更改Z索引将确保您的角色适当地出现在其他对象的前面或后面。

根据您的相机设置,您可能需要将新的Z位置乘以 -1如果情况看起来倒退则。

如果要在编辑场景时调整Z索引,请签出ExecuteInEditMode


我非常确定,如果未选中该组件,则Start()不会运行。Awake()在不活动的组件上运行,但start不运行。
Uri Popov

刚刚检查过;你是对的。我已经更新了示例以Awake代替使用。谢谢
克里斯·麦克法兰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.