在Unity中使用SetParent函数时,比例会以未记录的方式更改。
我试过使用WorldPositionStays,但这似乎绝对谋杀了规模。
如果没有WorldPositionStays,比例将按预期更改,因为新父对象具有与"全局比例"相同的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。
1条答案
按热度按时间bjp0bcyl1#
反转一个变换绝非易事。Unity在 transform 组件中总是以相同的顺序应用位置、缩放和旋转。但是如果你读取全局缩放和全局旋转,并且你想反转它们,你应该以相反的顺序应用反转缩放和反转旋转。
这就是为什么,如果你使用
Transform.SetParent(parent, true);
,而parent
同时有旋转和缩放,Unity无法反转它,并给出有趣的结果。顺便说一句,如果parent
有90度的倍数旋转,它通常会给出正确的结果。一种解决方法是在
parent
和child
对象之间插入一个空的GameObject
。我们将其命名为inBetween
。然后手动反转parent
缩放并将反转的缩放应用于inBetween
,反转parent
旋转并将反转的旋转应用于child
。请注意,这仅在parent
本身没有父对象(或者至少重置了它们的变换)时有效。