1

所以我试图创建一个系统来寻找可以攀爬的壁架。我有一个垂直视野来寻找这些壁架,到目前为止,我已经让它随着模拟摇杆的方向旋转,所以我可以找到一个壁架并移动到我的模拟指向的地方。(向上看,找到窗台,向上移动等)。我的问题是,当视野移动到我需要它移动的地方时,它保持固定在一个轴上并且不随玩家旋转。

到目前为止我所拥有的

在图片中,锥体朝向它应该在的位置,并按照我的意愿围绕玩家旋转,但正如您所见,锥体面向 X 轴并且不会从那里移动。我希望它与播放器一起旋转。

在下面的代码中,返回的 Vector 的 y 值使圆锥指向上方。我在 x 和 z 值中尝试了各种函数,但没有任何问题。

public Vector3 DirFromAngle(float angleInDegrees, bool angleIsGlobal)
{
    if(!angleIsGlobal)
    {
        angleInDegrees += (viewDir + 90);
    }

    Vector3 newValue = new Vector3(0, Mathf.Sin(angleInDegrees * Mathf.Deg2Rad), Mathf.Cos(angleInDegrees * Mathf.Deg2Rad));
    return newValue;
}

viewDir 值使圆锥体与我的模拟摇杆一起旋转,为了使圆锥体与我的播放器一起旋转,我认为需要使用 x 或 z 值或两者来完成某些事情,但对于我的生活,我可以'想不通。感谢您在此问题上提供的任何帮助。抱歉,如果我的解释不是很好。

在此处输入图像描述 在此处输入图像描述

void OnSceneGUI()
    {
        LedgePointSearch lps = (LedgePointSearch)target;
        Handles.color = Color.white;
        Handles.DrawWireArc(lps.transform.position, lps.transform.forward * 90, Vector3.up, 360, lps.viewRadius);
        Vector3 viewAngleA = lps.DirFromAngle(-lps.viewAngle / 2, false);
        Vector3 viewAngleB = lps.DirFromAngle(lps.viewAngle / 2, false);

        Handles.DrawLine(lps.transform.position, lps.transform.position + viewAngleA * lps.viewRadius);
        Handles.DrawLine(lps.transform.position, lps.transform.position + viewAngleB * lps.viewRadius);
    }

这是显示视野的编辑器脚本。

圆圈仅代表视野的半径,即它向外的距离。

https://www.dropbox.com/s/k9siha2aog9vj8o/fov.mp4?dl=0

在视频中,圆圈随着播放器旋转,而圆锥随着我的左侧模拟动作旋转。我希望锥体像圆一样,它像我的播放器一样旋转,但仍与我的模拟动作相匹配。

4

1 回答 1

0

解决此问题的一种方法是找到播放器的 Y 旋转并newValue在返回之前应用它。

public Vector3 DirFromAngle(float angleInDegrees, bool angleIsGlobal)
{
    if(!angleIsGlobal)
    {
        angleInDegrees += (viewDir + 90);
    }

    Vector3 newValue = new Vector3(0, Mathf.Sin(angleInDegrees * Mathf.Deg2Rad), Mathf.Cos(angleInDegrees * Mathf.Deg2Rad));

    // get Y rotation of player
    yRotationAngle = player.transform.rotation.eulerAngles.y;

    // convert to Quaternion using only the Y rotation
    Quaternion yRotation = Quaternion.Euler(0f, yRotationAngle + 90f, 0f);

    // Apply yRotation
    newValue = yRotation * newValue;

    return newValue;
}    
于 2019-05-14T18:38:33.457 回答