我有GameObject A,B,C。B是A的孩子.B和C是立方体,一边突出显示。
我想移动并旋转B和他的父A以将B的突出显示的一侧粘贴到C对象的突出显示的一侧。
怎么做?
答案 0 :(得分:1)
我假设您只想更改A的值,以便B位置相对于A保持不变。
简单的解决方案是创建一个C对象的虚拟对象(使其变换相对于C),将其设置为您想要A的正确位置和旋转(突出显示的边粘贴),然后在运行时,你总是可以通过将A的位置和旋转设置为与虚拟相同来将A移动到该位置。由于虚拟变换是相对于C的,无论你如何改变C的变换,虚拟将始终保持在正确的位置,并为A提供正确的值。
另一个解决方案是Math。但是,我认为使用复杂的计算功能将不会那么有效(无论是对于计算机还是对你的头脑大声笑)。使用虚拟对象会更好,因为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;
}