在 Unity 中使用 SetParent 函数时,比例会以未记录的方式发生变化。
我试过使用WorldPositionStays,但这似乎绝对谋杀了规模。
如果没有WorldPositionStays,规模会像预期的那样变化,因为新的父级具有与GlobalScale相同的LocalScale(0.1,0.5,0.6(。
我很困惑为什么 SetParent 没有弄清楚在重定父级时要设置的正确比例。
public class GhostInfo : MonoBehaviour
{
public GameObject NewParent;
public GameObject ParentThread;
public GameObject PartToAdd;
public GameObject AddThread;
public GameObject ParentToTarget()
{
ParentThread.GetComponent<Thread>().Occupied = AddThread;
AddThread.GetComponent<Thread>().Occupied = ParentThread;
Debug.LogError($"GLOBAL: {PartToAdd.transform.lossyScale}, LOCAL: {PartToAdd.transform.localScale}");//OUTPUT: GLOBAL: (1.0, 1.0, 1.0), LOCAL: (1.0, 1.0, 1.0)
PartToAdd.transform.SetParent(ParentThread.transform, true);
Debug.LogError($"GLOBAL: {PartToAdd.transform.lossyScale}, LOCAL: {PartToAdd.transform.localScale}");//OUTPUT: GLOBAL: (3.8, 3.8, 1.0), LOCAL: (34.4, 7.3, 1.7)
Destroy(gameObject);
return null;
}
}
public class GhostInfo : MonoBehaviour
{
public GameObject NewParent;
public GameObject ParentThread;
public GameObject PartToAdd;
public GameObject AddThread;
public GameObject ParentToTarget()
{
ParentThread.GetComponent<Thread>().Occupied = AddThread;
AddThread.GetComponent<Thread>().Occupied = ParentThread;
Debug.LogError($"GLOBAL: {PartToAdd.transform.lossyScale}, LOCAL: {PartToAdd.transform.localScale}");//OUTPUT: GLOBAL: (1.0, 1.0, 1.0), LOCAL: (1.0, 1.0, 1.0)
PartToAdd.transform.SetParent(ParentThread.transform, false);
Debug.LogError($"GLOBAL: {PartToAdd.transform.lossyScale}, LOCAL: {PartToAdd.transform.localScale}");//OUTPUT: GLOBAL: (0.1, 0.5, 0.6), LOCAL: (1.0, 1.0, 1.0)
Destroy(gameObject);
return null;
}
}
当使用SetParent(arg,true(时,我希望对象不惜一切代价保持其全局规模。这是一个不正确的假设吗?最重要的是,我只想将零件的全局比例保持为 1、1、1。
逆转转换绝非易事。 Unity 在变换组件中始终以相同的顺序应用位置、缩放和旋转。但是,如果您读取全局刻度和全局旋转,并且想要反转它们,则应以相反的顺序应用反向刻度和反向旋转。
这就是为什么,如果您使用Transform.SetParent(parent, true);
并且parent
同时具有旋转和缩放,Unity 将无法反转它并给出有趣的结果。顺便说一句,如果parent
的旋转是 90 度的倍数,它通常会给出正确的结果。
一种解决方法是在parent
和child
对象之间插入一个空GameObject
。我们称之为inBetween
.然后,手动反转parent
比例并将反转比例应用于inBetween
,反转parent
旋转并将反转应用于child
。 请注意,这仅在parent
本身没有父对象时才有效(或者至少重置了它们的转换(。