C# Unity2D:缩放游戏对象而不缩放其子对象

C# Unity2D:缩放游戏对象而不缩放其子对象,c#,unity3d,animator,C#,Unity3d,Animator,我有一个有孩子的敌人;敌人也有一个死亡动画。在死亡动画中(使用动画师),我已将敌人缩放到适当的大小。然而,敌人中的孩子们也被缩小了,即使我在孩子们身上有一个动画,我也在这个孩子身上添加了锚定位置。有没有一种方法可以缩小敌人的规模,但同时保持子对象的大小,请注意,子对象是一个UI文本对象。谢谢大家! 将子对象的比例设置为世界空间而不是局部空间 局部空间是默认值,但它将超出父对象的比例,因此当敌人缩小时,文本也会缩小 或者,您可以将两个对象都设置为一个空对象的子对象,然后缩小您的敌人,文本应该保持相

我有一个有孩子的敌人;敌人也有一个死亡动画。在死亡动画中(使用动画师),我已将敌人缩放到适当的大小。然而,敌人中的孩子们也被缩小了,即使我在孩子们身上有一个动画,我也在这个孩子身上添加了锚定位置。有没有一种方法可以缩小敌人的规模,但同时保持子对象的大小,请注意,子对象是一个UI文本对象。谢谢大家!

将子对象的比例设置为世界空间而不是局部空间

局部空间是默认值,但它将超出父对象的比例,因此当敌人缩小时,文本也会缩小

或者,您可以将两个对象都设置为一个空对象的子对象,然后缩小您的敌人,文本应该保持相同的大小,因为它使用的是空父对象的比例,这也不会改变大小

请看这里:

 public static Vector3 GetWorldScale(Transform transform)
    {
        Vector3 worldScale = transform.localScale;
        Transform parent = transform.parent;

        while (parent != null)
        {
            worldScale = Vector3.Scale(worldScale,parent.localScale);
            parent = parent.parent;
        }

        return worldScale;
    }
不过,这只是一个解决方案,您的目的是使用此:

yourtransform.LocalScale=Transform.localToWorldMatrix
但它给了我一些问题。。。但上述方法效果良好

transform.scale=GetWorldScale(transform);
编辑:让我们明确一点,最简单的方法是在收缩父对象之前取消对对象的复制。这将分离比例。

可能(希望)有更好的解决方案,但您可以在子对象上使用一个组件,始终保持原始比例反转父比例中的相对变化

public class FreezeScale : MonoBehaviour
{
    private Vector3 originalScale;
    private Vector3 parentOriginalScale;

    private void Awake()
    {
        // afaik RectTransform inherits from Transform 
        // so this should also work for UI objects.

        originalScale = transform.localScale;

        parentOriginalScale = transform.parent.localScale;
    }

    private void LateUpdate()
    {
        var currentParentScale = Transform.parent.localScale;

        // Get the relative difference to the original scale
        var diffX = currentParentScale.x / parentOriginalScale.x;
        var diffY = currentParentScale.y / parentOriginalScale.y;
        var diffZ = currentParentScale.z / parentOriginalScale.z;

        // This inverts the scale differences
        var diffVector = new Vector3 (1/diffX, 1/diffY, 1/diffZ);

        // Apply the inverted differences to the original scale
        transform.localScale = originalScale * diffVector;
    }
}


自从我的手机被黑客入侵后就没有测试过,但我希望你能明白;)

我所看到的解决问题的最简单方法是在层次结构的更高层引入另一个
GameObject

这个
游戏对象
将是你的敌人对象和你的
文本
对象的父对象,当前它是敌人的子对象


通过这种方式,您可以独立于
文本

缩放敌人,您所说的
是什么意思?将孩子的缩放比例设置为世界空间而不是本地空间。
?据我所知,子对象将始终与其父对象一起缩放。如果缩放父对象,子对象将缩放。。。但它会成倍增加。。。假设将父级比例设置为.8、.8、.8,并且将对象比例设置为.8、.8、.8,则对象现在将缩放为父级的.8,即我认为的.64,因此当收缩父级时,对象将收缩。