b2World.CreateBody returns 对于 CocosSharp 和 Box2D 为空

b2World.CreateBody returns null with CocosSharp and Box2D

我正在玩 CocosSharp 和 Box2D。我正在尝试创建一个世界并为其添加一个地面体。这是我的代码:

var gravity = b2Vec2.Zero;
gravity.Set(0f, -9.8f);

world = new b2World(gravity);
world.SetAllowSleeping(false);
world.SetContinuousPhysics(true);

var groundBodyDef = new b2BodyDef();
groundBodyDef.position.Set(0, 0);

var groundBody = world.CreateBody(groundBodyDef);

问题出在最后一行。 world.CreateBody(groundBodyDef) return 为空。

我查看了 implementation for b2World.CreateBody,发现如果 IsLocked 为真,它只会 return 为 null。我的理解是当世界步履蹒跚时 IsLocked 为真。但是,我看到 运行 我的 IsLocked 代码实际上是错误的,但 CreateBody 仍然 return 为空。

我看过的所有示例都遵循 b2World 的相同基本设置。有什么我想念的吗?

我正在 Android 模拟器上对此进行测试,如果有影响的话。

编辑 5/27: 在进一步了解这个问题之后,我现在知道有一些我认为没有必要包含在我原来的问题中的重要信息。我错了。我使用 CocosSharp Visual Studio 模板来创建解决方案和项目。这就是整个事情在 Android 上不起作用的原因。我会在答案中解释。

事实证明,我在 Android 上进行的测试非常重要。 CocosSharp 的 VS 模板不会将 box2d.dll 的引用添加到 Android 项目。 Windows Phone 和 iOS 项目都有参考,我上面的代码在这两个平台上都按预期工作。

Android 项目有一个 Box2dTest.dll 引用,我假设它是允许我的代码构建和 运行 的。

我昨晚深夜发现 another question 表面上看起来不是同一个问题,但提供了有效的答案后,我终于找到了正确的方向。我需要将 CocosSharp.PCL.Shared Nuget 包安装到我的 Android 项目中。然而,那并不是路的尽头。我开始从中收到构建错误。

所以,我对这个问题的最终解决方案是将对 CocosSharp.PCL.Shared Nuget 包的引用添加到一个单独的测试项目中,将包文件夹复制到我当前解决方案的包文件夹中,然后添加一个程序集引用仅 box2d.dll。它在 Nuget 包中添加的其他东西让我更加伤心。

完成所有这些后,我的代码 运行 出现在 Android。

CocosSharp 到目前为止非常酷,但它的 Visual Studio 模板肯定还有改进的余地。