Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.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 - Fatal编程技术网

C# 如何使地面物体统一跟随飞行物体?

C# 如何使地面物体统一跟随飞行物体?,c#,unity3d,C#,Unity3d,我试图让地面上的物体跟随飞行物体,例如一架无人驾驶飞机引导一个人(现在我只使用形状——一个立方体和一个胶囊)。我的立方体像我所希望的那样跟随胶囊,但我希望立方体只在地面跟随胶囊,而不是随着胶囊沿y轴上升。现在,它到处跟着太空舱,我希望太空舱在地面上跟着立方体,而太空舱在前面 我在谷歌和Youtube上做了一些研究,但没有看到任何结果。请让我知道我如何才能做到这一点 这是附加到多维数据集(地面对象)的代码脚本 如果地面是平面的,则可以将y分量设置为0(或地面y向量的任何值) 如果地面拓扑发生变化,

我试图让地面上的物体跟随飞行物体,例如一架无人驾驶飞机引导一个人(现在我只使用形状——一个立方体和一个胶囊)。我的立方体像我所希望的那样跟随胶囊,但我希望立方体只在地面跟随胶囊,而不是随着胶囊沿y轴上升。现在,它到处跟着太空舱,我希望太空舱在地面上跟着立方体,而太空舱在前面

我在谷歌和Youtube上做了一些研究,但没有看到任何结果。请让我知道我如何才能做到这一点

这是附加到多维数据集(地面对象)的代码脚本


如果地面是平面的,则可以将y分量设置为0(或地面y向量的任何值)

如果地面拓扑发生变化,您可以从胶囊中进行光线投射以获得生命点(vector3)。可以将“生命点y”组件用于高度。之后,需要设置立方体旋转,使其与地面对齐。你也可以用raycast来做,网上有很多这样的例子


我希望这能帮你找到正确的方向。

假设在
Y=0上有一个平坦的地面

或者确保你的物体贴在地面上,这样设置

private const float EPSILONSQR = EPSILON * EPSILON;

void Update()
{
    var difference = mTarget.position - transform.position;
    mLookDirection = difference.normalized;
    if(difference.sqrmagnitude > EPSILONSQR)
    {
        // In general be aware that Translate by default moves in the
        // objects own local space coordinates so you probably would rather
        // want to use Space.World
        transform.Translate(mLookDirection * Time.deltaTime * mSpeed, Space.World); 

        var pos = transform.position;
        // reset the Y back to the ground
        pos.y = 0; 
        transform.position = pos;
    }
}
或者简单地将方向映射到XZ平面上(忽略Y中的任何差异),如


这是一个三角问题。你有一个直角三角形,人在一个顶点,无人机在第二个顶点,直角是无人机在地面上的位置。所以地面位置是x=无人机x,y=无人机y,z=0。只需将z位置设置为零。@jdweng为什么
z
?在Unity中,
Z
是向前的,
Y
是向上的…因为我在大学里学习线性代数和力学课程。“X”是什么方向?你有一个三维世界,Unity正试图在二维屏幕上显示。
private const float EPSILONSQR = EPSILON * EPSILON;

void Update()
{
    var difference = mTarget.position - transform.position;
    mLookDirection = difference.normalized;
    if(difference.sqrmagnitude > EPSILONSQR)
    {
        // In general be aware that Translate by default moves in the
        // objects own local space coordinates so you probably would rather
        // want to use Space.World
        transform.Translate(mLookDirection * Time.deltaTime * mSpeed, Space.World); 

        var pos = transform.position;
        // reset the Y back to the ground
        pos.y = 0; 
        transform.position = pos;
    }
}
private const float EPSILONSQR = EPSILON * EPSILON;

void Update()
{
    var difference = mTarget.position - transform.position;
    mLookDirection = difference.normalized;
    // simply ignore the difference in Y
    // up to you if you want to normalize the vector before or after doing that
    mLookDirection.y = 0;

    if(difference.sqrmagnitude > EPSILONSQR)
    {
        transform.Translate(mLookDirection * Time.deltaTime * mSpeed, Space.World);
    }
}