【发布时间】:2021-05-21 16:04:50
【问题描述】:
我正在尝试构建一个随机生成地图的 2D 正交游戏。地图中的许多图块都是玩家角色可以与之交互的可收集资源。为了实现这一点,使用了代理/组件方法,给这些实体一个物理体(将 isDynamic 设置为 false 以避免不必要的计算)以检测碰撞(即当玩家到达资源并尝试收集它时) . SpriteKit 似乎很快无法在实际目标设备上处理更大的内存大小的 150x150 地图。
这种方法是否存在根本缺陷?在这种情况下,Unity 是更好的选择吗?
【问题讨论】:
-
当您使用“view.showsFPS = true”、“view.showsNodeCount = true”和“view.showsDrawCount = true”时,您通常会看到哪些值?
-
1 FPS 和大约 60k 节点。移除实体后,FPS 计数恢复到稳定的 60 FPS。
-
你定义了所有物理体的collisionBitMask和contactTestBitMask吗?如果您没有定义任何内容,则默认情况下会检查所有主体,这将非常昂贵。要关闭节点的碰撞/接触检测,请将两者都设置为 0。在您的情况下,资源碰撞/接触位掩码只是播放器,因为这是您要测试的唯一节点。
-
非常感谢您抽出宝贵时间回复,约翰。我确实添加了两个面具。直接来自演示机器人示例项目。它创建一个物理接触委托,您可以在其中告诉每个实体哪些其他实体应该触发通知。我想到了另一种可能性:即根本不使用物理学。创建随机瓦片地图并存储哪些坐标具有相关瓦片。然后将它们与玩家的进行比较。不确定它的效率会有多高,并且会在地图上生成许多非玩家控制的实体(动物、敌人)。
-
如果物理在您的游戏中没有意义,这听起来很合理。您可以使用
sprite1.frame.intersects(sprite2.frame)来检查一个精灵与另一个精灵的重叠,将其视为碰撞检测。
标签: swift sprite-kit