记录一些遇到的问题,并试着理解它。
仅个人理解,欢迎批评指正。
目录:
【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. 调试模式
再运行一次,这次要多看点东西。
把调试选项的“Visible Collision Shapes(可见的碰撞形状)”打钩。

再次运行场景。

哦,多了某些东西。这是CollisionShape2D节点描绘的碰撞范围。Rigidbody2D一直在起作用!
两个Rigidbody2D都在起作用,那么真相只有一个:其中一个Sprite没有运动。
使用调试,可以直观了解到:
上面的Sprite:它作为Rigidbody2D的子节点,会跟着运动。
下面的Sprite:它作为Rigidbody2D的父节点,独立于Rigidbody2D的运动,保持不动。
2. 编辑窗口
先了解一个小功能
在编辑窗口,有一个小工具: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的节点不同于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”属性。
网友评论