【问题标题】:SpriteKit: many assets with physicsBody on sceneSpriteKit:场景中有许多带有physicsBody的资产
【发布时间】: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


【解决方案1】:

这可能是一个解决方案:

  1. 为每种类型的物理体创建一个池,例如用于树木物理体、石头等的池。
  2. 会暂时为空,对数组中的每个元素在游戏开始时检查玩家是否有靠近的物体,遍历60k数组会更快,然后后台计算所有物理矩并保持60k物理记忆中的尸体。要检查靠近的物体,您无需计算正确的距离(执行 pow(x, 2) + pow(y, 2) 不是一个简单的操作),如果您将物体标记为靠近就足够了abs(player.x - obj.x)

2.1 如果为真。然后你从池中取出一个物理体并将其分配给这个节点或创建一个新的物理体池为空。

2.2 如果为假。然后将此节点的物理体保存到池中并将其从节点中删除

  1. 它不是一个完美的解决方案,我不确定它是否会给你带来很多利润,但它会减少场景中的物理体数量,通过迭代一个大数组来支付这样的移动(这应该不会花很多时间),并进行基本的操作,如 + 和 abs。

  2. 这是你的选择,当你应该这样检查时,这可以是一个计时器,或者更新,或者每次,你的玩家移动一个恒定的距离(比如每 100 点),它可以是一个实验部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 2018-03-09
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多