Unity SetParent 以意想不到的方式缩放



在 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 度的倍数,它通常会给出正确的结果。

一种解决方法是在parentchild对象之间插入一个空GameObject。我们称之为inBetween.然后,手动反转parent比例并将反转比例应用于inBetween,反转parent旋转并将反转应用于child。 请注意,这仅在parent本身没有父对象时才有效(或者至少重置了它们的转换(。

最新更新