小案例

作者: 西瓜预制体 | 来源:发表于2018-12-02 11:18 被阅读105次

    记录一些遇到的问题,并试着理解它。
    仅个人理解,欢迎批评指正。

    目录:
    【01】哪个Godot会做自由落体运动?--2018.12.02



    【01】哪个Godot会做自由落体运动?

    版本:3.0.6

    更详细的分析请看:
    Godot3游戏引擎入门之二:第一个简单的游戏场景

    图中的两个Godot使用了三个相同的节点,只是顺序(层级结构)不一样。Rigidbody2D、CollisionShape2D负责控制物理运动,而CollisionShape2D必须作为Rigidbody2D的子节点。这样的话,只剩下Sprite和Rigidbody2D的顺序问题。


    运行一次,会发现:上面的Godot会做自由落体运动,下面的Godot保持不动。
    这个结果与我预料的不一样:我预料的是下面的Godot会下落,因为就像Unity那样,作为子物体的Rigidibody会持续影响Sprite。但是事实不是这样,Godot与Unity是不一样的。

    为什么?或者说,为什么跟我预料的不一样?
    可以从两个地方搞明白:

    1. 调试模式
    2. 编辑窗口

    1. 调试模式

    再运行一次,这次要多看点东西。
    把调试选项的“Visible Collision Shapes(可见的碰撞形状)”打钩。

    02.png

    再次运行场景。

    03.png

    哦,多了某些东西。这是CollisionShape2D节点描绘的碰撞范围。Rigidbody2D一直在起作用!
    两个Rigidbody2D都在起作用,那么真相只有一个:其中一个Sprite没有运动。

    使用调试,可以直观了解到:
    上面的Sprite:它作为Rigidbody2D的子节点,会跟着运动。
    下面的Sprite:它作为Rigidbody2D的父节点,独立于Rigidbody2D的运动,保持不动。


    2. 编辑窗口

    先了解一个小功能

    在编辑窗口,有一个小工具:Makes sure the object's children are not selectable.(确保对象的子对象不可选择。)

    Makes sure the object's children are not selectable.

    两个Godot都激活了这个作用。它可以方便地整体移动一个已经制作好了的节点。换句话说就是:

    • 在2D工作区,鼠标只会选择根节点;
    • 鼠标拖动根节点时,确保子节点随根节点移动。

    现在,先取消这个工具的激活状态。

    现在尝试拖动Godot,也就是代表Godot的Sprite。

    噢!

    噢!怎么把CollisionShape2D给拖出来了?
    这是因为CollisionShape2D覆盖住了Sprite,鼠标只能选择CollisionShape2D。

    这里有一个层次问题。在场景树中,上面的节点先渲染,下面的节点后渲染,所以下面的节点覆盖上面的节点。

    这次拖出来的是Sprite 上面的先渲染,下面的后渲染

    用鼠标拖动模拟Rigidbody2D的运动

    好了!已经了解了Godot中一个实用的小功能,那么用这个来搞明白上面的问题吧:为什么上面的Godot会做自由落体运动,下面的Godot保持不动。

    首先Node2D和Node2D2都取消“Makes sure the object's children are not selectable.”
    然后分别在两个Godot的“Rigidbody2D”选择“Makes sure the object's children are not selectable.”

    然后分别试着拖动两个Godot的Rigidbody2D,这样可以模拟Rigidbody2D的运动。

    上面的Godot被拖动了! 噢!下面的Godot似乎出了些问题。

    这样可以明白了,Godot的节点不同于Unity的GameObject与Component,后者Rigidbody2D作为组件影响GameObject,而前者则是节点父子关系产生影响。

    到这里操作结束了。
    用“Makes sure the object's children are not selectable”对两个Godot的Rigidbody2D做了固定,这样就可以用鼠标拖动来模拟Rigidbody2D提供的物理运动,这样就直观看到了哪里出了问题。

    总结:

    • 第一个Godot:把Rigidbody2D看做根节点,那么Sprite是它的子节点。
      “爸爸去哪儿?我也去!”所以Sprite跑了。
    • 第二个Godot:把Sprite看做根节点,那么Rigidbody2D是它的子节点。
      “儿子去哪儿?慢点啊!”所以Sprite没跑。


    【02】“Modulate”和“Self Modeulate”的区别。



    【03】“Light Mask”是什么。


    【04】复制粘贴的节点共享属性?

    目前已知复制粘贴的节点共享“CollisionShape2D”属性。


    【05】节点共享脚本?


    【06】

    相关文章

      网友评论

          本文标题:小案例

          本文链接:https://www.haomeiwen.com/subject/xugqcqtx.html