我正在使用我发现的一些动画和根运动来创建一个 Enemy AI。我有一个父游戏对象,它有几个子游戏对象,包括敌人的 3D 模型。我已将我的动画师附加到这个 Enemy 3D 模型中,现在,例如,当行走动画被触发时,由于它使用根运动,子元素走向玩家,这是视觉上应该发生的事情,然而,父元素gameObject 根本不受影响,这让其他脚本感到困惑并且无法正常工作。
这只会改变孩子的变换,我的问题来了——我如何旋转和定位父对象,在子对象之上。因此,当子游戏对象移动或旋转时,它的父对象也会发生同样的情况。
我想到了一个解决方案,将 3D 模型作为父模型并将所有子游戏对象移动到该 3D 模型中,这可能会解决问题(希望不创建另一个),但我真的很好奇是否有答案我的问题。
这与这个线程非常相关。
恕我直言,最好的方法可能是根本不在这里使用育儿,但可能会引入像 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;
我尝试在评论中写这篇文章,因为我不确定它是否有帮助,但那里没有足够的空间。因此,根据您的评论,我将创建一个 C# 脚本,该脚本采用
Transform
(孩子的)并在 Update
或 LateUpdate
方法上设置父 Transform
类似于一个孩子。
public class ChangeTransform : MonoBehaviour{
public Transform childTransform;
void LateUpdate(){
transform = childTransform;
}
}
将此脚本附加到父级,然后将子级
gameObject
拖到暴露的childTransform
。我没有测试这段代码。如果您看到故障,请从LateUpdate
更改为Update