Как изменить размер объекта в unity через скрипт
Перейти к содержимому

Как изменить размер объекта в unity через скрипт

  • автор:

Трансформации

Компонент Transform (трансформация) используется для хранения значений позиции, вращения, размеров и состояния наследования GameObject’а, потому он очень важен. К GameObject’у всегда добавлен компонент Transform — его невозможно удалить или создать GameObject без него.

Редактирование трансформаций

Компоненты Transform управляются в 3D пространстве по осям X, Y, и Z, или в 2D пространстве просто по X и Y. В Unity эти оси представлены красным, зелёным и синим цветами соответственно.

Tramsform c цветными осями

Transform может быть изменён в окне Scene или путём изменения параметров в инспекторе. В сцене вы можете изменять Transform используя инструменты Translate, Rotate и Scale (двигать, вращать и масштабировать). Эти инструменты расположены в верхнем левом углу редактора Unity.

Инструменты View, Translate, Rotate и Scale

Эти инструменты можно применить к любому объекту в сцене. Когда вы кликнете на объект, вы увидите, что у объекта появится гизмо инструмента. Вид гизмо зависит от выбранного инструмента.

Гизмо Transfromа

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

Transfrom с выделенной (жёлтой) осью X

Для режима перемещения есть дополнительная опция — перемещение объекта в отдельной плоскости (другими словами, позволяет перемещать объект в двух осях сразу, не затрагивая третью). Три маленьких цветных квадрата вокруг центра гизмо перемещения активируют фиксацию для каждой из плоскостей; цвета соответствуют оси, которая будет зафиксирована, если нажать на квадрате (например, синий квадрат фиксирует ось Z).

Наследование

Наследование — один из самых важных концептов, который следует понимать при использовании Unity. Когда GameObject является родительским для другого объекта, дочерний GameObject будет двигаться, вращаться и менять размер в той же степени, что и родительский объект. Вы можете представлять наследование как связь между вашими руками и вашим телом; когда ваше тело движется, то ваши руки также двигаются вместе с ним. Дочерние объекты могут иметь и свои дочерние объекты и так далее. Таким образом, ваши ладони могут считаться “детьми” ваших рук, а у каждой ладони есть несколько пальцев и т.д. Любой объект может иметь несколько “детей”, но только одного родителя. Эти многоуровневые связи родители-дети формируют иерархию трансформаций. Объект на самом верху иерархии (т.е. единственный объект, у которого нет родителя) известен как root (корень).

Вы можете создать родительский объект перетягиванием любого GameObject’а в окне Hierarchy на другой объект. Это создаст связь родительский-дочерний между двумя игровыми объектами.

Пример родительской иерархии. Объекты с раскрывающимися стрелками слева от их имён являются родительскими.

Учтите, что значения Transform в инспекторе для любого дочернего объекта показаны относительно значений Transform родительского объекта. Эти значения известны как локальные координаты . Возвращаясь к аналогии тела и рук, положение вашего тела может изменяться по мере ходьбы, но ваши руки будут присоединены в одном и том же месте относительно тела. Для построения сцены обычно достаточно работать с локальными координатами для дочерних объектов, но во время игрового процесса зачастую полезно найти их точное положение в мировом пространстве или их мировые координаты . API скриптинга для компонента Transform имеет отдельные настройки для локальных и мировых координат.

Проблемы производительности и ограничения неравномерного (Non-Uniform) масштабирования

Неравномерное масштабирование (Non-uniform Scaling) — это когда параметр Scale в Transform имеет разные значения для x, y, и z; например (2, 4, 2). И наоборот, при равномерном масштабировании, x, y и z имеют одинаковые значения; например (3, 3, 3). Неравномерное масштабирование может быть полезно в некоторых особых случаях, но вам лучше стараться этого избегать, поскольку это замедляет рендеринг графики. Также могут появиться некоторые странности, которых не бывает при равномерном масштабировании:-

  • Некоторые компоненты не имеют полной поддержки неравномерного масштабирования. Например у некоторых компонентов есть круглый или сферический элемент с заданным параметром radius . Среди таких компонентов есть Sphere Collider , Capsule Collider , Light и Audio Source . В подобных случаях круглая форма не станет эллиптической под влиянием неравномерного масштабирования, а просто останется круглой.
  • Если у дочернего объекта есть неравномерно отмасштабированный родитель, и он (дочерний объект) повёрнут относительно родителя, он может стать перекошенным или “сдвинутым”. Есть компоненты, которые поддерживают простое неравномерное масштабирование, но некорректно работают такими перекосами. Например, перекошенный Box Collider не будет точно совпадать с формой меша.
  • По причинам производительности, масштаб дочернего объекта неравномерно отмасштабированного родителя не будет автоматически обновлён при вращении. В результате, форма дочернего объекта может резко измениться, после того как масштаб уже обновился, например, после отделения дочернего объекта от родителя.

Важность масштаба

Масштаб Transform’а определяет разницу между размером меша в приложении для моделирования и размером этого же меша в Unity. Размер меша в Unity (он же — масштаб Transform’a) очень важен, особенно во время физических симуляций. По умолчанию, физический движок предполагает, что одна единица меры в мировом пространстве соответствует одному метру. Если объект очень большой, может получиться, что он будет падать “в замедленном времени”; симуляция на самом деле правильная, т.к. по сути, вы смотрите с большого расстояния на то, как падает очень большой объект.

Есть 3 фактора которые могут повлиять на масштаб вашего объекта:

  • Размер вашего меша в вашем приложении для 3D моделирования.
  • Коэффициент Mesh Scale Factor устанавливаемый в настройках импорта объекта ( Import Settings ).
  • Значение параметра Scale компонента Transfrom.

В идеале, вам не надо настраивать параметр Scale вашего объекта в компоненте Transform. Лучшим вариантом является создание моделей реалистичного размера, таким образом, чтобы вам не пришлось менять масштаб. Следующим лучшим вариантом является настройка масштаба в настройках Import Settings импортированного меша, для конкретного меша. Некоторые оптимизации производятся на основе размера при импорте, и создание экземпляра объекта с изменённым значением масштаба может снизить производительность. Для дополнительной информации, прочитайте раздел об оптимизации масштаба на странице справки по компоненту Rigidbody.

Подсказки по работе с компонентами Transform

  • При родительстве Transform’а, будет полезным установить координаты родителя на , прежде чем добавлять дочерний объект. Это значит, что местные координаты для дочернего объекта будут равны мировым координатам и таким образом будет проще убедиться, что дочерний объект находится в нужной позиции.
  • Particle Systems (системы частиц) не подвержены влиянию параметра Scale у компонента Transfrom. Чтобы масштабировать систему частиц, вам надо изменить параметры в разделах системы частиц Emitter, Animator и Renderer.
  • Если вы используете Rigidbodies для симуляции физики, то убедитесь, что прочитали раздел про параметр Scale на странице Rigidbody.
  • Вы можете поменять цвета осей Transform’а (и других элементов интерфейса) в настройках ( Menu: Unity > Preferences и затем выбрать панель Colors & keys ).
  • Changing the Scale affects the position of child transforms. For example scaling the parent to (0,0,0) will position all children at (0,0,0) relative to the parent.

Unity: как изменить размер объекта согласно ContentSizeFilter?

Привет всем!
Есть ui-текст. Размер текста меняется. За текстом расположена картинка, которая должна меняться по размеру текста. Так вот, если картинка является дочерней к тексту, то ее размер меняется через ContentSizeFilter, но тогда она перекрывает текст. Если картинку не делать дочерней к тексту, то она не перекрывает текст, но ContentSizeFilter тогда её не масштабирует.

У меня была мысль в методе 1) сделать картинку дочерней к тексту 2)как-то заставить контент сайз обновить размеры контента 3) убрать картинку из дочерних объектов текста. Так вот, с пунктом 2 проблема, не нашёл метода в ContentSizeFilter который обновлялся бы размеры дочерних объектов. Такой метод существует? Есть ещё варианты решения проблемы?

#1
15:21, 30 авг 2017

Задать картинки (как дочерний элемент текста) в Anchors у RectTransform как min = [0;0] и max = [1;1] ?

#2
15:40, 30 авг 2017

Пробовал, у меня так и сделано + картинка растягивается во весь размер родителя если она дочерняя к тексту. Тут нужно ещё позицию и width и height задавать.

#3
16:20, 30 авг 2017

Правка
к картинке ContentSizeFitter и VerticalLayoutGroup и флажки Сontrol Сhild Size

#4
0:48, 31 авг 2017

shda
Спасибо, помогло.

Прошло более 3 лет

  • padavan123
  • Пользователь

#5
10:59, 12 июня 2021

Второй пункт делается через корутину, с небольшой задержкой:

using TMPro; public TextMeshPro Text_Mesh; void Start () < // Добавить ContentSizeFitter Text_Mesh.gameObject.AddComponent().horizontalFit = UnityEngine.UI.ContentSizeFitter.FitMode.PreferredSize; Text_Mesh.gameObject.GetComponent().verticalFit = UnityEngine.UI.ContentSizeFitter.FitMode.PreferredSize; StartCoroutine (ChangedSize ()); > IEnumerator ChangedSize() < yield return new WaitForSeconds (0.0001f); print (Text_Mesh.GetComponent().sizeDelta); >

Как изменить размер объекта, при переносе в другую сцену?

Есть меню кастомизации персонажа, как вы уже наверное поняли, нужно чтобы все изменения кастомизации сохранились, перенести этот же объект непосредственно в сцену с самой игрой, для этого используется самая простая функция DontDestroyOnLoad, скрипт точно такой же как тут: docs.unity3d.com/ScriptReference/Object.DontDestro.

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

P.S: Еще я добавил персонажу камеру в меню кастомизации и отключил ее, опять же, что нужно вписать в скрипт, чтобы при переносе объекта в следующую сцену, она включилась?

  • Вопрос задан более трёх лет назад
  • 2473 просмотра

Комментировать
Решения вопроса 1

MrMureno

Denis Gaydak @MrMureno Куратор тега Unity
VR for all

Самый очевидно простой вариант — соблюсти одинаковый scale в обоих сценах (и в будущем проблем так меньше будет)
А если через скрипт, то «подгонять» скеил ручками.
https://docs.unity3d.com/ScriptReference/Transform.

void Example()

вообще я так понял вы ищете что-то вроде
https://docs.unity3d.com/ScriptReference/MonoBehav.
чтобы определить что вы попали в другую сцену?!

А про камеру — ссылку на неё сохранить(на gameobject) и просто SetActive(bool f);

public class ExampleClass : MonoBehaviour < //назначить в редакторе или в Awake() методе найти главную камеру //сам факт получить ссылку на камеру public GameObject cameraGO; void OnLevelWasLoaded(int level) < if (level == 13)//номер уровня или проверку по имени сделать > >

И немного занудства. По хорошему вся эта кастомизация объекта должна сохраняться и описываться какой-нибудь структурой.
В духе -> Список Деталей, а у каждой детали, Размер,Цвет и Прочность.
Чтобы не через неразрушаемый объект переносить, а сохранив и передав , описывающую такую структуру, можно было восстановить кастомизированный вид.
Появиться возможность как минимум сохранить два , три ,четыре вида кастомизации.

(я так понял вы вроде тридэшник и надеюсь понятно в общих чертах рассказал)
Ну а после уже и патерны-шматерны можете примастыривать.

Изменить размер объекта динамически

Author24 — интернет-сервис помощи студентам

Размер объекта в куче
При разработке обычных desktop-приложений в VS есть расширение SOS. В юнити я его использовать так.

Как получить размер объекта
Доброго времени суток вопрос: как можно получить размер объекта? к примеру есть 3d-объект -.

Изменить размер юнита
Можно ли как-то изменить размер юнита в unity? Мне для 2d игр удобно работать не с метрами, а с.

Как изменить центр объекта?
Уменя есть скрипт которой вращает обэкт ! проблема в том что оно вращает там где центр обэкта ! а.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *