Unity2D: масштабируйте GameObject, не масштабируя его потомков - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть враг, в котором есть дети;у врага также есть анимация смерти.В рамках анимации смерти (с использованием аниматора) я масштабировал противника до соответствующего размера.Тем не менее, количество детей внутри врага также уменьшается, хотя у меня есть анимация для ребенка, где я его измерил, я также добавил опорные позиции для этого ребенка.Есть ли способ, которым я могу уменьшить врага, но при этом сохранить размер дочернего элемента, ps дочерний объект - текстовый объект пользовательского интерфейса.Спасибо!

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Возможно (надеюсь), есть лучшие решения, но вы могли бы использовать компонент на дочерних объектах, который всегда сохраняет исходную шкалу, инвертируя относительные изменения в родительской шкале

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

Не проверено, так как взломанна моем мобильном телефоне, но я надеюсь, что вы поняли идею;)

0 голосов
/ 25 сентября 2018

Самый простой способ решить вашу проблему, который я вижу, - это ввести еще один GameObject выше в иерархии.

Этот GameObject будет родителем вашего вражеского объекта и вашего Text объекта, которыйв настоящее время является ребенком противника.

Таким образом, вы можете масштабировать противника независимо от Text.

0 голосов
/ 19 сентября 2018

устанавливает масштаб ребенка в мировое пространство, а не в локальное пространство.

локальное пространство используется по умолчанию, но оно выходит за пределы масштаба родителя, поэтому, когда враг сжимается, текст тоже будет.

в качестве альтернативы вы можете установить оба объекта в качестве потомков пустого объекта, затем просто уменьшить масштаб врага, и текст должен остаться того же размера, так как он использует масштаб пустого родителя, который также не меняет размер.

см. Здесь:

 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 : давай проясним, проще всего было бы очистить объект перед сжатием родителя.это разделит весы.

...