Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.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

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,这样做的问题是,移动的变换永远不会停止移动,即使它非常接近目标,我希望它停止移动 我还想使变换尽可能接近目标,现在它非常接近目标,但不是在目标上 最后,我想在对象到达目标并停止移动时生成目标的对象子对象。您可以在更新中引入一个检查,以测量距离目标变换的距离,如下所示: using System.Collections; using System.Collections.Generic; using UnityEngine; public class MoveNavi : MonoBehavio

这样做的问题是,移动的变换永远不会停止移动,即使它非常接近目标,我希望它停止移动

我还想使变换尽可能接近目标,现在它非常接近目标,但不是在目标上


最后,我想在对象到达目标并停止移动时生成目标的对象子对象。

您可以在更新中引入一个检查,以测量距离目标变换的距离,如下所示:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveNavi : MonoBehaviour
{
    public float speed;

    private GameObject rig_f_middle;

    // Start is called before the first frame update
    void Start()
    {
        rig_f_middle = GameObject.Find("rig_f_middle.02.R");
    }

    // Update is called once per frame
    void Update()
    {
        if(IKControl.startMovingNAVI == true)
        {
            Vector3 moveDir = (rig_f_middle.transform.position - transform.position).normalized;
            transform.position += moveDir * speed * Time.deltaTime;
        }
    }
}
void更新()
{
if(IKControl.startMovingNAVI==true)
{
var v=rig_f_middle.transform.position-transform.position;
if(v.幅值<公差值)
{
this.transform.parent=rig\u f\u middle.transform;
this.enabled=false;
返回;
}
Vector3 moveDir=v.标准化;
transform.position+=moveDir*速度*时间.deltaTime;
}
}

现在,我个人只需要额外检查
sqrMagnitude
,而不是
magnitude
,因为计算量更轻,尤其是在更新循环中,但这可能是一种您不需要或不关心的优化。不管是哪种方式,您只需将
yourTolerance值
适当地设置为公共的、可序列化的字段,或者您的选择。然后,当两个变换足够接近时,它将成为此变换的父对象,并关闭此组件,以便不再执行任何检查。

它正在工作。我还有一个问题。是否有更好的方法或变通方法来将移动的对象更改为更平滑的目标子对象?问题是,当变换是一个对象的子对象时,游戏开始,然后当他完成移动时,使用此脚本,我将变换更改为另一个对象的子对象,此更改看起来像从一个位置到另一个位置的变换跳跃,而不是作为一个对象到另一个对象的子对象的平滑过渡。也许你有什么想法?我会建立一个原始转换和目标转换,然后在每个转换的位置之间建立Lerp。i、 e.this.transform.position=Mathf.Lerp(原始transform.position,目标transform.position,lerpTime)。然后,当lerpTime>=1.0f时,将父对象从一个对象更改为下一个对象。但这实际上是另一个问题,可能有助于得到完整的答案。这是我的新问题
void Update ( )
{
    if ( IKControl.startMovingNAVI == true )
    {
        var v = rig_f_middle.transform.position - transform.position;
        if ( v.magnitude < yourToleranceValue )
        {
            this.transform.parent = rig_f_middle.transform;
            this.enabled = false;
            return;
        }
        Vector3 moveDir = v.normalized;
        transform.position += moveDir * speed * Time.deltaTime;
    }
}