【问题标题】:Test if the player's desired movement exceeds a magnitude?测试玩家想要的移动是否超过一个量级?
【发布时间】:2015-09-15 03:39:09
【问题描述】:

假设我在 Vector3 中有一个点,并且我的 FPSController(我使用的是 Unity 5 附带的标准控制器)从这个 Vector3 移动了 10 幅度。我不想让任何方向的移动超过 10 级。理想情况下,我会预测玩家按下哪个方向移动,测试该向量,如果它低于 10 级,那么它将允许移动继续进行。这样,如果你在 10 岁时按“后退”,您将无法移动,但如果按“前进”,则没问题。

我知道我在这里有点抽象。据我了解,FPSController.cs 脚本正在使用 CharacterController 组件。今晚我研究了 FPSController 代码一段时间,注意到它正在对本地位置进行各种计算,但幅度需要在两个世界坐标之间。

我已经知道如何计算幅度,我只需要知道如何测试预期方向。我有一种感觉,这比我想象的要容易?

【问题讨论】:

  • 我不明白您所说的“我不允许在任何方向上超过 10 级的移动”是什么意思。你是说你想将玩家从某个点限制在 10 个单位以内?或者你想限制他们的速度?
  • 我想从某个点限制他们 10 个单位。你被绑在一根绳子上,一旦拉到它的长度,你就不能再往前走了

标签: c# unity3d


【解决方案1】:

你想多了!与其考虑如何限制速度,不如考虑限制位置。查看Vector3 Vector3.ClampMagnitude(Vector3, float),它返回缩放到最大长度的向量。通过将玩家位置“转换”到目标,夹紧到最大长度,然后转换回世界坐标,您可以限制玩家的位置。

// target: the Vector3 you can't get too far from.
// distance: the float max distance from the target.
transform.position = Vector3.ClampMagnitude(transform.position - target, distance) + target;

【讨论】:

  • 好主意!但是如何防止角色控制器移动呢?在一个非常简单的自上而下的游戏中,如果用户向右按,它将首先检查那里是否有墙,如果没有,则允许移动发生。所以这个难题的最后一块是我如何告诉 fps 控制器不要超过最大长度?我尝试在更新区域的 fpscontroller.cs 脚本中注入一个 if 子句,但这显然会使 fps 陷入爬行状态,因为它每帧都在进行距离计算。我只想检查是否检测到新输入
  • @mythstified 令人惊讶的是,这会减慢你的游戏速度——这是一个很小的计算量。您所需要的只是在最后运行此更新,以将玩家钳制在边界范围内。您应该编辑您的问题以将代码添加为“我尝试过的”。编辑:顺便说一句,作为一般提示,当你想让你的游戏不滞后时,你要考虑在给定帧上可能发生的大多数,因此通过在玩家的时候不做某事来优化不移动并不是一个很好的优化,因为玩家通常在移动。
  • 那..实际上..有效...我会给你绿色支票!我仍然觉得很奇怪,就好像它首先允许移动然后将角色移回......但是......它有效
  • @mythstified 这就是一些物理引擎的工作原理(根源),所以至少要意识到你是个好伙伴!而且我建议您牢记,只要渲染时的状态与您想要的匹配,“帧之间”发生的任何事情都无关紧要。
  • 这是个好建议!我想钳位操作只是将向量相乘并定位变换是非常便宜的操作,我不需要担心帧之间的快速重新定位
猜你喜欢
  • 1970-01-01
  • 2017-08-22
  • 2023-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-26
相关资源
最近更新 更多