Unity3d 与父对象一起移动游戏对象以面对另一个游戏对象

Unity3d 与父对象一起移动游戏对象以面对另一个游戏对象,unity3d,Unity3d,我有一个游戏对象A,B,C。B是A的孩子。B和C是立方体,一边突出显示 我想移动并旋转B和它的父对象A,将B的突出显示侧粘贴到C对象的突出显示侧 如何做到这一点?我假设您只想更改A的值,以便B位置相对于A保持不变 简单的解决方案是创建一个虚拟对象,该对象是C的子对象(因此其变换相对于C),将其设置为所需的正确位置和旋转(高亮显示的边粘贴的位置),然后在运行时,通过将其位置和旋转设置为与虚拟对象相同,始终可以将a移动到该位置。由于dummy的变换是相对于C的,所以无论您如何更改C的变换,dummy

我有一个游戏对象A,B,C。B是A的孩子。B和C是立方体,一边突出显示

我想移动并旋转B和它的父对象A,将B的突出显示侧粘贴到C对象的突出显示侧


如何做到这一点?

我假设您只想更改A的值,以便B位置相对于A保持不变

简单的解决方案是创建一个虚拟对象,该对象是C的子对象(因此其变换相对于C),将其设置为所需的正确位置和旋转(高亮显示的边粘贴的位置),然后在运行时,通过将其位置和旋转设置为与虚拟对象相同,始终可以将a移动到该位置。由于dummy的变换是相对于C的,所以无论您如何更改C的变换,dummy都将始终保持在正确的位置,并为A提供正确的值

另一个解决办法是通过数学。然而,我认为使用复杂的计算功能将没有那么有效(无论是对计算机还是你的大脑lol)。使用虚拟对象会更好,因为Unity为您计算,并且不涉及额外的计算。但也许是这样的:

public Transform a;
public Transform b;
public Transform c;

public Vector3 b_hl_dir; // highlight direction (e.g. right side would be {1,0,0} and back side would be {0,0,-1})
public Vector3 c_hl_dir;

public float width; // cube's width, assuming b and c has the same width.

public void RelocateA(){
    // #1. Calculate correct position for B
    Vector3 b_pos = c.position + c.rotation * c_hl_dir * width;
    Quaternion b_rot = Quaternion.LookRotation(c.position - b_pos, (Mathf.Abs(Vector3.Dot(c_hl_dir, Vector3.up)) < 1f) ? c.up : c.right) * Quaternion.FromToRotation(b_hl_dir, Vector3.forward);

    // #2. Relocate A according to B's correct position
    a.rotation = b_rot * Quaternion.Inverse(b.localRotation);
    a.position += b_pos - b.position;
}
公共转换a;
公共改革b;
公共改革c;
公共向量3 b_hl_dir;//突出显示方向(例如,右侧为{1,0,0},后侧为{0,0,-1})
公共向量3 c_hl_dir;
公共浮动宽度;//立方体的宽度,假设b和c具有相同的宽度。
公共行政区(a){
//#1.计算B的正确位置
向量3 b_pos=c.位置+c.旋转*c_hl_方向*宽度;
四元数b_rot=四元数。LookRotation(c.position-b_pos,(Mathf.Abs(Vector3.Dot(c_hl_dir,Vector3.up))<1f)?c.up:c.right)*四元数fromtrotation(b_hl dir,Vector3.forward);
//#2.根据B的正确位置重新定位A
a、 旋转=b_rot*四元数。逆(b.localRotation);
a、 位置+=b_位置-b位置;
}

你能给我们看看你自己试过的代码吗?