【发布时间】: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 接近并接近手时,当它变成一个孩子时会出现某种跳跃/故障。
如果需要,我会添加已完成的脚本。
【问题讨论】: