Unity 学习中遇到的问题

Unity 学习中遇到的问题

·

1 min read

问题:斜坡 tile 是 16x16 的,Tilemap Collider 把每一个像素都算进了碰撞箱,让斜坡变成了“阶梯”,怎么处理?

解答:可以用 Composite Collider 来合并碰撞体:

  1. 在 Tilemap Collider 中勾选 “Used By Composite”,表示允许用作合并

  2. 在 Composite Collider 中调整 "Geometry Type” 和 "Vertex Distance” 来控制合并后的碰撞体的形状和平滑度

    • Geometry Type:决定碰撞体的形状是由直线(Outlines)还是多边形(Polygons)组成

    • Vertex Distance:决定了合并后的碰撞体的平滑度,值越大,碰撞体越平滑


问题:我要使用 OverlapBoxAll 来判断碰撞,但我不确定设置的 size 的范围,有可视化的办法吗?

解答:两种办法:

  1. 使用 Gizmos.DrawWireCube,在指定位置画线框进行预览

  2. 添加一个 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

FixedUpdateUpdate 调用的频率不一样,在正常/默认情况下,Update 按 60Hz 运行,FixedUpdate 按 50Hz 运行。

所以可能出现这样的情况:第一帧 Update → 第二帧 UpdateFixedUpdate,如果 GetButtonDown 写在 FixedUpdate 中,那么在第二帧时按键状态已经被重置了,FixedUpdate 拿到的结果就是 false

所以实现按键后跳跃相关的操作,可以写成:

bool isJumping = false;

void Update() {
  if (Input.GetButtonDown("Jump")) {
    isJumping = true;
  }
}

void FixedUpdate() {
  if (isJumping) {
    // do something...
    isJumping = false;
  }
}