2

我一直在 Unity 中开发第一人称游戏,遇到了一个我想添加的功能:爬梯。但是,到目前为止,我一直没有成功编写此代码(顺便说一句,我使用的是 javascript)。下面是一个脚本,我必须测试与梯子的碰撞,但它不起作用:

function OnCollisionEnter(collider:Collision){
    if(collider.gameObject.name=="ladder"){
        Debug.Log("hit ladder");
    }
}

从技术上讲,这应该在与梯子发生碰撞时显示调试消息“hit ladder”......但事实并非如此。

有谁知道为什么这不起作用,或者我该如何解决?谢谢。

4

4 回答 4

1

派对可能有点晚了,但我走了。

您总是可以制作一个基于触发器的梯子,当控制器向前移动时,它会向上移动。

我发布了一篇博文,解释(没有代码)我如何在旧的演示视频中实现简单的梯子,该视频也可以在帖子中看到。

http://www.lazr.pw/2014/02/unity-trigger-based-ladders.html

希望这可以帮助某人。

于 2014-02-13T14:54:23.940 回答
0

这里有两件事我可以告诉你。

  1. 按照 Steven Mills 的建议使用CharacterController.OnControllerColliderHit,但请注意传递给函数的参数实际上是ControllerColliderHit.
  2. 而不是检查对撞机的名称,而是比较Tag. GameObject您所要做的就是为每个GameObject您希望拥有此功能的标签分配相同的标签,比如说“梯子”。

这也是一个 C# 示例:

void OnControllerColliderHit(ControllerColliderHit hit) {
    if (hit.collider.CompareTag("Ladder")) {
        //Climbing
    }
}

我建议查看上面的链接以获取更多信息。这是因为您可能想要执行额外的检查,例如玩家在哪里与梯子发生碰撞。这是因为您可能不想从梯子的侧面爬梯子(当然,除非梯子绳索或类似的东西)。你还需要一种方法来告诉玩家已经完成了爬上/爬下梯子。当您的脚高于梯子顶部时,您可能不想继续爬梯子;)。希望这可以帮助!

于 2013-04-11T14:27:06.463 回答
0

由于此脚本正在寻找与梯子的碰撞,因此我假设脚本在角色内。如果脚本在您的梯子内,那么...问题出在 :P

在任何情况下,如果这在您的角色中,并且您可能正在使用 CharacterController 来移动他,则OnCollisionEnter不会触发。您需要使用OnControllerColliderHit(collider:Collision) { ... }并将碰撞检测放在其中。

于 2013-04-11T06:36:16.770 回答
0
  1. 使用 OnTriggerEnter(Collider) 代替(不要忘记将梯子设置为触发器!)
  2. 使用刚体(非运动学的)而不是角色控制器。文档说“只有当其中一个对撞机还附加了非运动刚体时才会发送碰撞事件。”
于 2016-06-14T12:58:21.080 回答