如何在 Unity 中将父游戏对象定位到它的子游戏对象

问题描述 投票:0回答:2

我正在使用我发现的一些动画和根运动来创建一个 Enemy AI。我有一个父游戏对象,它有几个子游戏对象,包括敌人的 3D 模型。我已将我的动画师附加到这个 Enemy 3D 模型中,现在,例如,当行走动画被触发时,由于它使用根运动,子元素走向玩家,这是视觉上应该发生的事情,然而,父元素gameObject 根本不受影响,这让其他脚本感到困惑并且无法正常工作。

这只会改变孩子的变换,我的问题来了——我如何旋转和定位父对象,在子对象之上。因此,当子游戏对象移动或旋转时,它的父对象也会发生同样的情况。

我想到了一个解决方案,将 3D 模型作为父模型并将所有子游戏对象移动到该 3D 模型中,这可能会解决问题(希望不创建另一个),但我真的很好奇是否有答案我的问题。

c# unity3d
2个回答
0
投票

这与这个线程非常相关。

恕我直言,最好的方法可能是根本不在这里使用育儿,但可能会引入像 from

这样的 meta lay
 - Parent
   |- Child

前往

 - Controller
   |- Parent
   |- Child 

然后在控制器上(它根本不会移动)只需做

Parent.transform.position = Child.transform.position;
Parent.transform.rotation = Child.transform.rotation;

根本不需要关心层级嵌套。


如果这不是一个选项,尽管您仍然可以使用链接的(几乎)副本,除非您还想复制该位置。

在第一种 hacky 方式中,您只需相应地做

// will maintain current absolute world space transforms
Child.transform.SetParent(null);
// copy the values to the parent while the child is detached
Parent.transform.rotation = Child.transform.rotation;
Parent.transform.position = Child.transform.position;
// parent back
Child.transform.SetParent(Parent.transform);
// + if required might need to carry over siblingIndex as well

在不修改层次结构的情况下,第二种(首选)方式你可以相应地做

// simply copy over the absolute transforms -> This will move the child along
Parent.transform.position = Child.transform.position;
Parent.transform.rotation = Child.transform.rotation;
// then reset the childs local offset since supposedly the parent objects transforms match with the childs one now anyway
Child.transform.localRotation = Quaternion.idendity;
Child.transform.localPosition = Vector3.zero;

-1
投票

我尝试在评论中写这篇文章,因为我不确定它是否有帮助,但那里没有足够的空间。因此,根据您的评论,我将创建一个 C# 脚本,该脚本采用

Transform
(孩子的)并在
Update
LateUpdate
方法上设置父
Transform
类似于一个孩子。

public class ChangeTransform : MonoBehaviour{
  public Transform childTransform;

  void LateUpdate(){
     transform = childTransform;
   }
}

将此脚本附加到父级,然后将子级

gameObject
拖到暴露的
childTransform
。我没有测试这段代码。如果您看到故障,请从
LateUpdate
更改为
Update

© www.soinside.com 2019 - 2024. All rights reserved.