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

Posted

技术标签:

【中文标题】Unity2D:缩放游戏对象而不缩放其子对象【英文标题】:Unity2D: Scale a GameObject without Scaling its Children 【发布时间】:2019-02-24 00:37:07 【问题描述】:

我有一个有孩子的敌人;敌人也有死亡动画。在死亡动画中(使用动画师),我将敌人缩放到合适的大小。然而,敌人中的孩子们也被缩小了,即使我在我调整大小的孩子身上有一个动画,我还在这个孩子身上添加了锚点位置。有没有办法可以缩小敌人的规模,同时保持孩子的大小,ps。 child 是一个 UI 文本对象。谢谢!

【问题讨论】:

【参考方案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;
    


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

【讨论】:

【参考方案2】:

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

这个GameObject 将是您的敌人对象的父对象,而您的Text 对象目前是敌人的子对象。

这样你就可以独立于Text来缩放敌人。

【讨论】:

【参考方案3】:

将孩子的比例设置为世界空间而不是本地空间。

本地空间是默认设置,但它会超出父级的比例,因此当敌人缩小时,文本也会缩小。

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

看这里:

 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:让我们明确一点,最简单的做法是在缩小父对象之前取消对象文本。这将分开秤。

【讨论】:

set the child's scale to world space not local space. 是什么意思?据我所知,孩子总是会与其父母一起缩放。 如果您缩放父级,子级将缩放...但它的倍数...假设您将父级比例设置为 .8、.8、.8,并且您将对象比例设置为.8,.8,.8,对象现在被缩放到父母 0.8 的 0.8,我认为是 0.64,所以当你缩小父母时它会缩小。

以上是关于Unity2D:缩放游戏对象而不缩放其子对象的主要内容,如果未能解决你的问题,请参考以下文章

同时缩放两个游戏对象[重复]

如何用捏缩放游戏对象?

ios,带有一些对象的滚动屏幕而不缩放

如何将运动物理函数缩放到每秒帧数(在游戏引擎中)?

调整和缩放 SKSpriteNode

2-7 单位和坐标系