【发布时间】:2016-04-16 01:28:19
【问题描述】:
我正在尝试为 2D 游戏统一更改排序层的顺序,但以下脚本不适用于我:
using UnityEngine;
using System.Collections;
public class LevelManager : MonoBehaviour {
public GameObject player;
public SpriteRenderer deadGuy;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (player.transform.position.y < deadGuy.transform.position.y)
{
deadGuy.sortingOrder = 0;
} else
{
deadGuy.sortingOrder = 2;
}
}
}
在运行游戏之前,对象已在检查器窗口统一中链接。
编辑
现在这是我的代码:
using UnityEngine;
using System.Collections;
public class LevelManager : MonoBehaviour {
public GameObject player;
public GameObject deadGuy;
public bool belowTheY;
// Use this for initialization
void Start () {
deadGuy.GetComponent<SpriteRenderer>().sortingOrder = 2;
}
// Update is called once per frame
void Update () {
if (player.transform.localPosition.y < deadGuy.transform.localPosition.y)
{
belowTheY = true;
deadGuy.GetComponent<SpriteRenderer>().sortingOrder = 0;
} else
{
belowTheY = false;
deadGuy.GetComponent<SpriteRenderer>().sortingOrder = 2;
}
}
}
如果用户低于 deadGuy 的 Y 位置,bekowTheY 将被激活,因此我知道 if 语句正在正确执行。但是排序层没有被改变
【问题讨论】:
-
什么不起作用?该属性在编辑器中是否发生更改,但图像未按您想要的顺序显示?您如何评论 Update 函数中的代码,将
deadGuy.sortingOrder = 2;放在 Update 函数中。在Editor中选择SpriteRenderer,检查sortingOrder是否改变了属性...... -
查看 deadGuy 对象,我可以看到它根本没有改变其排序层。它只是停留在 2(在检查器窗口中设置的属性)
-
当我说把它放在更新函数中时,我的意思是
Start函数。还有一件事。删除更新中的所有代码并将deadGuy.sortingOrder = 4;放入 Start 函数中。我想看看你的代码是否有效。告诉我编辑器中的值。 -
我意识到 if (player.transform.position.y ().sortingOrder = 4;在 start 函数中,他确实得到了 4 的排序层。但是,如果我用 deadGuy.GetComponent
().sortingOrder = 0; 更新代码中的行和 deadGuy.GetComponent ().sortingOrder = 2; 分别,它仍然不起作用。如果我设置一个布尔值,我可以在 if 语句中看到触发 -
deadGuy已经是SpriteRenderer。请解释你为什么要做deadGuy.GetComponent<SpriteRenderer>()?您提到更改为 4 工作,所以这不是问题您的个人资料在此行player.transform.position.y < deadGuy.transform.position.y使用 Debug.Log 并确保这是您想要的。