动态图层更改后,Unity平台失去了无摩擦的特性

时间:2019-03-28 07:48:12

标签: c# unity3d

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

以下是我检查过以查找错误的所有内容的列表:

  • 如果玩家精灵更改影响了玩家碰撞检测
  • 如果删除OnCollisionStay可以解决问题
  • 如果删除/更改平台效应器的圆弧/旋转偏移会解决问题
  • 如果平台或播放器的颜色变化影响了无摩擦性能

从我的测试以及关于这一问题的隔离测试中,我发现只有在碰撞中的任何一个对象的层值不是中性时才发生错误,因此蓝色或红色

TL; DR:

我希望平台在侧面无摩擦,所以我正在使用Platform Effector2D。每当我更改平台的层时,它都会失去其无摩擦的特性。

编辑,因此我进行了更多测试,发现无论颜色如何,任何对象(包括播放器)上的任何图层更改都会导致此“卡死”错误

0 个答案:

没有答案