问题:斜坡 tile 是 16x16 的,Tilemap Collider 把每一个像素都算进了碰撞箱,让斜坡变成了“阶梯”,怎么处理?
解答:可以用 Composite Collider 来合并碰撞体:
在 Tilemap Collider 中勾选 “Used By Composite”,表示允许用作合并
在 Composite Collider 中调整 "Geometry Type” 和 "Vertex Distance” 来控制合并后的碰撞体的形状和平滑度
Geometry Type:决定碰撞体的形状是由直线(Outlines)还是多边形(Polygons)组成
Vertex Distance:决定了合并后的碰撞体的平滑度,值越大,碰撞体越平滑
问题:我要使用 OverlapBoxAll
来判断碰撞,但我不确定设置的 size 的范围,有可视化的办法吗?
解答:两种办法:
使用
Gizmos.DrawWireCube
,在指定位置画线框进行预览添加一个 Box Collider 在需要的位置,将 offset、size 记录下来,填进
OverlapBoxAll
中
问题:Hierarchy 中通过右键创建的对象,本质上是不是 GameObject 外带一个 Component?
解答:是的,Unity 会自动完成这个过程,创建出空的 GameObject,然后带上固定的 Transform 和一些组件。
问题:一个对象上有多个相同类型组件时,能用 GetComponent 吗?
解答:GetComponent
函数可以获取当前游戏对象上的指定类型的组件,但如果存在多个相同类型的,GetComponent
会返回找到的第一个。
如果要查所有,应该使用 GetComponents
。
问题:BoxCast 和 BoxCastAll 的区别是什么呢?
解答:他们都会模拟一个盒型区域,让他沿着某个方向移动一段距离,BoxCast
会返回碰撞到的第一个对象,而 BoxCastAll
会返回碰撞到的所有对象。
BoxCast
更适用于找出第一个将要碰撞的物体(如子弹飞行的路径),而 BoxCastAll
更适用于找出所有将要碰撞的物体(如一辆车通过的路径)。
问题:在 FixedUpdate 中使用 Input.GetButtonDown 检查玩家输入,但他好像会吞操作?
解答:GetButtonDown
的结果状态不是持续的,状态每一帧都会重置,比如说在第一帧按下了空格没放手,这时返回的是 true
,到了第二帧再次调用,状态重置了,返回的是 false
。
FixedUpdate
和 Update
调用的频率不一样,在正常/默认情况下,Update
按 60Hz 运行,FixedUpdate
按 50Hz 运行。
所以可能出现这样的情况:第一帧 Update
→ 第二帧 Update
→ FixedUpdate
,如果 GetButtonDown
写在 FixedUpdate
中,那么在第二帧时按键状态已经被重置了,FixedUpdate
拿到的结果就是 false
。
所以实现按键后跳跃相关的操作,可以写成:
bool isJumping = false;
void Update() {
if (Input.GetButtonDown("Jump")) {
isJumping = true;
}
}
void FixedUpdate() {
if (isJumping) {
// do something...
isJumping = false;
}
}