【问题标题】:How can I move slowly smooth object to be child of another object?如何将缓慢平滑的对象移动为另一个对象的子对象?
【发布时间】:2021-01-13 13:44:15
【问题描述】:
if(crate.gameObject.GetComponent<UnlockCrate>().HasOpened())
                    {
                        primaryTarget = navi;

                        var rig_f_middle = GameObject.Find("rig_f_middle.02.R");
                        navi.transform.parent = rig_f_middle.transform;
                        navi.transform.localPosition = new Vector3(0, 0, 0);
                        navi.transform.rotation = rig_f_middle.transform.parent.rotation;
                        navi.transform.localScale = new Vector3(0.0005999999f, 0.0006000001f, 0.0006f);
                        primaryTarget = null;                       
                    }

这只是改变了导航位置,但我希望它直接缓慢地平滑移动,成为 rig_f_middle 的子节点。

在屏幕截图中,NAVI 几乎位于层次结构的顶部,是另一个对象的子对象,它应该缓慢平滑地移动到底部选定的 rig_f_middle.02.R(在我的代码中它是 rig_f_middle)。

这样,NAVI 将移动到玩家手中,而玩家将握住 NAVI。

这是我尝试过的:

if(crate.gameObject.GetComponent<UnlockCrate>().HasOpened())
                    {
                        primaryTarget = navi;

                        var rig_f_middle = GameObject.Find("rig_f_middle.02.R");
                        StartCoroutine(MoveNavi(navi.transform, rig_f_middle.transform, navi.transform.position, rig_f_middle.transform.position, 0.1f));                        
                        navi.transform.localScale = new Vector3(0.0005999999f, 0.0006000001f, 0.0006f);

                    }

然后在协程中:

IEnumerator MoveNavi(Transform navi, Transform rig_f_middle, Vector3 a, Vector3 b, float speed)
    {
        float step = (speed / (a - b).magnitude) * Time.fixedDeltaTime;
        float t = 0;
        while (t <= 1.0f)
        {
            t += step;
            navi.position = Vector3.Lerp(a, b, t);

            if(Vector3.Distance(a, b) < 0.05f)
            {
                navi.parent = rig_f_middle.transform;
                navi.localPosition = new Vector3(0, 0, 0);
                navi.localRotation = rig_f_middle.parent.localRotation;
            }

            yield return new WaitForFixedUpdate();
        }
        navi.position = b;
    }

对象 NAVI 移动正常,然后当距离小于 0.05f 时,它会使其成为子对象,但几乎没有问题:

  • NAVI 成为子节点后它的位置和旋转从未设置为 0,0,0 我试过这个:

    navi.localPosition = new Vector3(0, 0, 0); navi.localRotation = rig_f_middle.parent.localRotation;

  • 当 NAVI 接近并接近手时,当它变成一个孩子时会出现某种跳跃/故障。

如果需要,我会添加已完成的脚本。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    一旦成为对象的子对象,它将与父对象一起移动。你不能逐渐变成一个孩子。不过,你可以先不选择child,然后平滑地移动到预期的parent的位置,一旦距离小于0.05什么的,就可以child了。

    您可以使用 Vector3.MoveTowards 平滑移动。 https://docs.unity3d.com/ScriptReference/Vector3.MoveTowards.html

    您可以使用 Vector3.Distance 检查距离。 https://docs.unity3d.com/ScriptReference/Vector3.Distance.html

    【讨论】:

    • 我用我尝试的方法更新了我的问题,我使用 Coroutine 和 Lerp 而不是 MoveTowards,由于某种原因我没有成功使用 MoveTowards。并添加了我现在遇到的两个问题。
    • 您可能不想将对象的局部旋转设置为父对象的局部旋转。如果将对象的局部旋转设置为 Quaternion.identity,那么它将为 0,使其与父对象的旋转相同。至于跳跃/故障,这可能是因为 0.05f 单位可能太远了。但是,由于您使用的是 Lerp,这很容易解决。无需检查距离,只需检查 t >= 1.0f 是否已完成。
    猜你喜欢
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多