Unity Lossy Scaling实现

时间:2017-11-21 15:57:03

标签: c# unity3d rotation scaling

我目前正在使用Unity和transform.rotation。问题是我有2个旋转对象作为父子。这使得孩子很奇怪地从一个盒子变成了一个盒子。 Gooing我发现transform.lossyScale应该解决我的问题,但我不知道如何实现它。

TL:DR如何实现transform.lossyscale以防止父子扩展问题。

当前代码

float currentR = transform.eulerAngles.x;

    if(currentR < 30){
        transform.Rotate (rotation * Time.deltaTime * 3);
}

1 个答案:

答案 0 :(得分:0)

理想情况下,如果您不希望孩子按照父母的比例进行调整,请不要将其作为父母的孩子:P 然而。如果你必须,你可以让一个孩子扭转父母的规模(所以它将具有与父母相反的规模)

比让你的新孩子成为那个孩子的孩子:)

你可以使用这个通用脚本,把它放在它的子上它不应该在运行时轮换任何问题,即使它有一个缩放的父级:) (它将使用代码完成我上面描述的事情)

public class IgnoreParentScale : MonoBehaviour {

Transform scaleInversionParent;

void Awake () {
    scaleInversionParent = new GameObject ("ScaleInversionParent").transform;
    scaleInversionParent.SetParent (transform.parent);
    scaleInversionParent.localPosition = Vector3.zero;
    scaleInversionParent.eulerAngles = Vector3.zero;//Zero out anything but the scale
    UpdateScaleInversion ();
    transform.SetParent (scaleInversionParent, true);
}
void LateUpdate () {
    UpdateScaleInversion (); //Only if you are changing the scale at run time.
}
void UpdateScaleInversion () {
    Vector3 invertedScale = scaleInversionParent.parent.localScale;
    invertedScale = new Vector3 (1f / invertedScale.x, 1f / invertedScale.y, 1f / invertedScale.z);
    scaleInversionParent.localScale = invertedScale;//This scale will invert the parents scale
}
}

<强>可替换地:

您可以使用此脚本创建一个继承原始父级的位置和旋转的新父级,但忽略它的缩放。

    public class IgnoreParentScale : MonoBehaviour {

    Transform originalParent;
    Transform newParent;

    void Awake () {
        newParent = new GameObject ("").transform;
        originalParent = transform.parent;

        UpdateNewParent ();
        transform.SetParent (newParent);
    }
    public void LateUpdate () {
        UpdateNewParent ();
    }
    void UpdateNewParent () {
        newParent.transform.position = originalParent.transform.position;
        newParent.transform.rotation = originalParent.transform.rotation;
    }
}