Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 垂直于物体移动的_C#_Unity3d_Rotation_Raycasting - Fatal编程技术网

C# 垂直于物体移动的

C# 垂直于物体移动的,c#,unity3d,rotation,raycasting,C#,Unity3d,Rotation,Raycasting,我试图在不同物体形成的路径之间移动。我使用Translate()应用恒定速度,并使用光线投射从右侧的对象以垂直向量旋转 虽然它会旋转,但它的旋转速度不够快,无法完全旋转并移出路径 有没有办法解决这个问题?或者用其他方法来实现它 任何帮助都将不胜感激 有助于可视化的图像: 我认为这不是一个好方法,但对我来说很有效。也许这能帮你 public float fixedDist = 2.0f; void WallDetect() { RaycastHit hit; if (!Physi

我试图在不同物体形成的路径之间移动。我使用Translate()应用恒定速度,并使用光线投射从右侧的对象以垂直向量旋转

虽然它会旋转,但它的旋转速度不够快,无法完全旋转并移出路径

有没有办法解决这个问题?或者用其他方法来实现它

任何帮助都将不胜感激

有助于可视化的图像:


我认为这不是一个好方法,但对我来说很有效。也许这能帮你

public float fixedDist = 2.0f;
void WallDetect() {
    RaycastHit hit;
    if (!Physics.Raycast(transform.position, transform.TransformPoint(Vector3.right) - transform.position, out hit))
        return;

    Vector3 perp = Vector3.Cross(hit.normal, Vector3.up);
    Vector3 targetDir = Vector3.Project(transform.forward, perp).normalized;
    Vector3 currentDir = transform.TransformPoint (Vector3.forward) - transform.position;

    RaycastHit hit2;
    if (Physics.Raycast (transform.position, -hit.normal, out hit2)) {
        Vector3 fixedPos = hit2.point + hit.normal * fixedDist;
        Vector3 predictPos = fixedPos + targetDir;

        transform.position = Vector3.MoveTowards (transform.position, predictPos, 0.01f);
        transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation (predictPos - transform.position), 0.05f);
    }
}

第一件事:您似乎没有使用HitInfo结构中的数据-信不信由你,它已经包含一个.normal Vector3成员,在光线投射期间计算(或者在请求时延迟计算,我不确定,但这没有什么区别),最好使用它,而不是自己滚动,更简单,更不容易出错(你手动找到的正常值看起来是正确的,但我没有试过)

第二件事:你的最后一行有一个四元数。Lerp,t=0.05,这意味着对于每一个新的旋转,你仍然要承受原始旋转的95%,这确实是非常缓慢的旋转。尝试在时间范围内的某个东西。deltaTime(相当于在一秒钟内接近)

第三件事:对于旋转,最好使用Slerp而不是Lerp,除非您真正关心性能,考虑到代码的其余部分,这似乎不是一个问题

第四件事:不要硬编码线性和旋转速度,尝试使用时间的倍数。deltaTime,这样它们就不会依赖于帧速率(就像现在一样)

第五件事:我有一种感觉,你不应该根据当前位置的法线设置目标旋转。你现在的做法是旋转滞后-你应该在未来从当前位置开始一步从某个位置进行光线投射,这样你就知道要进行什么旋转,所以在你进行该步骤时它是正确的当前,您将“目标未来旋转”设置为“立即纠正旋转”,这将滞后于一帧。或者,您可以将“平移”步骤移动到循环的顶部,变换将更新,其余部分应按此方式流动

最后,您的图像链接不起作用


我希望这能有所帮助

谢谢你的评论,但这个问题是4年前提出来的。
public float fixedDist = 2.0f;
void WallDetect() {
    RaycastHit hit;
    if (!Physics.Raycast(transform.position, transform.TransformPoint(Vector3.right) - transform.position, out hit))
        return;

    Vector3 perp = Vector3.Cross(hit.normal, Vector3.up);
    Vector3 targetDir = Vector3.Project(transform.forward, perp).normalized;
    Vector3 currentDir = transform.TransformPoint (Vector3.forward) - transform.position;

    RaycastHit hit2;
    if (Physics.Raycast (transform.position, -hit.normal, out hit2)) {
        Vector3 fixedPos = hit2.point + hit.normal * fixedDist;
        Vector3 predictPos = fixedPos + targetDir;

        transform.position = Vector3.MoveTowards (transform.position, predictPos, 0.01f);
        transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation (predictPos - transform.position), 0.05f);
    }
}