【问题标题】:Raycast from one object to side of the other object光线从一个物体投射到另一个物体的一侧
【发布时间】:2018-11-05 10:31:12
【问题描述】:

我有一个 AI(红色圆圈),它应该向我的玩家(蓝色圆圈)射击。

目前我使用的是普通的 Raycast:

Ray ray = new Ray(transform.position, transform.forward);

这给了我紫色线。

现在,当有角时(如图像上所示),它不会击中玩家,但如果它向侧面多射一点,它就可以。

我已经通过向该光线投射添加角度来解决此问题,但这对我不起作用,因为如果玩家靠近或远离 ai,角度是不同的。

我需要的是:

ai 会从自身向玩家的侧面(左右)发射光线投射,但我不知道该怎么做。

【问题讨论】:

  • 即使你在播放器的每一侧都进行了一次重铸,例如,如果射手看到两堵墙之间的目标,你仍然会遇到问题......
  • 我正在做的游戏非常简单,在整个地图中没有任何地方可以看到玩家在两堵墙之间。如果我能找到一个解决方案,只击中左/右侧的玩家,这对我的游戏来说就足够了。
  • 好的,我试着在下面的回答中给你一个提示,它有帮助吗?

标签: c# unity3d


【解决方案1】:

你的播放器肯定有某种半径,不是吗? 仅使用玩家和射击 AI 之间的距离、玩家的半径和一些漂亮的三角函数,您应该能够生成两条射线来测试射击 AI 是否看到玩家的“右侧”以及他的“左侧” ”。

Vector3 direction = player.transform.position - shootingAI.transform.position;
float distance = direction.magnitude;
float playerRadius = player.radius;// this is a variable you need to set
float angleToRotate = Mathf.Atan(radius/distance); // trigonometry: tan(angle)=oppositeSideLength/adjacentSideLength

Vector3 rayDirection1 = Quaternion.Euler(0f, -angleToRotate, 0f) * direction;
Vector3 rayDirection2 = Quaternion.Euler(0f, angleToRotate, 0f) * direction;

使用这两条射线作为方向,您应该测试“右侧”和“左侧”

【讨论】:

    【解决方案2】:

    你可以找到好的答案HERE

    或者也许使用Sphere Raycast 并使用Contact Point 并在此时拍摄。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      • 2020-01-21
      • 1970-01-01
      相关资源
      最近更新 更多