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

时间:2018-09-19 19:00:14

标签: c# unity3d animator

我有一个敌人,里面有孩子。敌人也有死亡动画。在死亡动画(使用动画师)中,我将敌人缩放到适当的大小。但是,即使我在调整了大小的孩子身上有一个动画,敌人中的孩子也正在按比例缩小,我还在这个孩子上添加了锚点位置。有没有办法我可以缩小敌人的规模,但又可以保持孩子的身高,子对象是UI文本对象。谢谢!

3 个答案:

答案 0 :(得分:1)

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

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;
    }
}

自从被我的手机黑客入侵以来未经过测试,但我希望你能理解;)

答案 1 :(得分:0)

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

GameObject将成为您的敌人对象的父对象,而您的Text对象将是当前敌人的孩子。

这样,您可以独立于Text缩放敌人。

答案 2 :(得分:-1)

将孩子的比例尺设置为世界空间而不是局部空间。

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

或者,您可以将两个对象都设置为空对象的子对象,然后按比例缩小敌人,并且文本应保持相同大小,因为它使用的是空父对象的比例,也不会更改大小。 / p>

查看此处:

 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);

edit :很简单,最简单的方法是在缩小父对象之前取消objext的权限。这样会分开秤。