TL; DR在底部!
所以我用简单的机制创建了一个基本的益智游戏。两种核心机制是:
此颜色更改通过精灵和图层更改生效。我使用图层来存储所有gameObjects的当前颜色,以利用Layer Collision Matrix(对象只能与相同颜色的对象发生碰撞,即,如果玩家是蓝色,则他/她将无法与红色平台发生碰撞)。所有平台(垂直和水平)都具有Platform Effector 2D组件,以利用“无摩擦面”属性。
只要播放器为中性色,无摩擦面即可完美工作。玩家获得颜色后,他/她接触的任何平台都将失去其无摩擦的一面,并出现经典的“粘边”错误,如果您在平台方向上持续按住箭头键,您将停留在那儿而不会掉落。我不知道为什么会发生这种情况,并且我尝试/检查了我能想到的所有内容,试图将其修复为无济于事。任何帮助都非常感谢,谢谢!
这是我为播放器更新颜色/精灵的代码: (第8层,第9层,第10层分别是“中性”,“蓝色”和“红色”,我也使用了OnCollisionStay,因为玩家可以按下按钮来放置当前颜色,并且如果玩家在平台上放置颜色时应该选择该颜色)无需重新碰撞就可以重新起来)
void OnCollisionEnter2D(Collision2D collision) {
float positionY = transform.position.y;
float collisionPosY = collision.GetContact(0).point.y;
int layer = collision.gameObject.layer;
// Color Update
if (collision.gameObject.layer == 9) {
GetComponent<SpriteRenderer>().sprite = blue;
gameObject.layer = 9;
} else if (collision.gameObject.layer == 10) {
GetComponent<SpriteRenderer>().sprite = red;
gameObject.layer = 10;
}
}
void OnCollisionStay2D(Collision2D collision) {
// Continuous Color Update
if (collision.gameObject.layer == 9) {
GetComponent<SpriteRenderer>().sprite = blue;
} else if (collision.gameObject.layer == 10) {
GetComponent<SpriteRenderer>().sprite = red;
}
}
这是平台的代码:
void OnCollisionEnter2D(Collision2D collider) {
// only change color if neutral
if (gameObject.layer == 8) {
if (collider.gameObject.layer == 9) {
GetComponent<SpriteRenderer>().sprite = blue;
gameObject.layer = 9;
} else if (collider.gameObject.layer == 10) {
GetComponent<SpriteRenderer>().sprite = red;
gameObject.layer = 10;
}
}
}
以下是我检查过以查找错误的所有内容的列表:
从我的测试以及关于这一问题的隔离测试中,我发现只有在碰撞中的任何一个对象的层值不是中性时才发生错误,因此蓝色或红色
TL; DR:
我希望平台在侧面无摩擦,所以我正在使用Platform Effector2D。每当我更改平台的层时,它都会失去其无摩擦的特性。
编辑,因此我进行了更多测试,发现无论颜色如何,任何对象(包括播放器)上的任何图层更改都会导致此“卡死”错误