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

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

Как получить размер объекта
Доброго времени суток вопрос: как можно получить размер объекта? к примеру есть 3d-объект -.
Изменить размер юнита
Можно ли как-то изменить размер юнита в unity? Мне для 2d игр удобно работать не с метрами, а с.
Как изменить центр объекта?
Уменя есть скрипт которой вращает обэкт ! проблема в том что оно вращает там где центр обэкта ! а.
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); >
Динамическое изменение размеров объекта в Unity3D (решено)
Скрипт вешается на сам куб, раз в 10 секунд(например) меняется его размер на новый, случайный( new Vector3(Random.Range(2,10),Random.Range(2,10),Random.Range(2,10)) ).
Как динамически менять размеры? Желательно, пример кода.
36 ответов
Не проверил, но думаю должно работать:
using UnityEngine; using System.Collections; public GameObject go; // Объект, размер которого будем менять (задается в инспекторе) private float timer = 10.0f; // Ставим таймер на 10 секунд void Update () < timer -= 1.0f * Time.deltaTime; // Отнимаем от таймера 1 в секунду if (timer >
Вот, я так же проверял, но тут загвоздка в том, что размер меняется мгновенно, а не постепенно.
В смысле постепенно? Ты спрашивал, как менять раз в 10 секунд.
Да, но надо постепенно. В данном Вами примером, размер меняется раз в 10 секунд мгновенно, резко, а надо плавно, чтобы было видно и игрок случайно не попал внутрь.
Всё что у меня получилось:
randomscale.cs
using UnityEngine; using System.Collections; public class randomscale : MonoBehaviour < public GameObject go; // Объект, размер которого будем менять (задается в инспекторе) private float timer = 10.0f; // Ставим таймер на 10 секунд private Vector3 scale; // Переменная для текущего размера private Vector3 newscale; // Переменная для нового размера void Start () < scale = new Vector3(go.transform.localScale.x, go.transform.localScale.y, go.transform.localScale.z); // Проверяем текущий размер newscale = scale; >void Update () < timer -= 1.0f * Time.deltaTime; // Отнимаем от таймера 1 в секунду go.transform.localScale = Vector3.Lerp(scale, newscale, Time.deltaTime); // Меняем размер объекта if (timer > >
Но эта часть не работает почему-то правильно:
go.transform.localScale = Vector3.Lerp(scale, newscale, Time.deltaTime); // Меняем размер объекта
Она должна менять размер плавно. Нужно погуглить, как её правильно написать.
- Fortunato
- 1 декабря 2013, 20:52
- +1
Если найдешь решение, напиши, полезно было бы узнать где косяк.
using UnityEngine; using System.Collections; public class changeCube : MonoBehaviour < public GameObject go; // Объект, размер которого будем менять (задается в инспекторе) private float timer = 10.0f; // Ставим таймер на 10 секунд private Vector3 scale; // Переменная для текущего размера private Vector3 newscale; // Переменная для нового размера void Start() < scale = new Vector3(go.transform.localScale.x, go.transform.localScale.y, go.transform.localScale.z); // Проверяем текущий размер newscale = scale; >void Update() < timer -= 1.0f * Time.deltaTime; // Отнимаем от таймера 1 в секунду go.transform.localScale = Vector3.Lerp(go.transform.localScale, newscale, Time.deltaTime); if (timer > >
косяк был в том, как я понял, что переменная размера отдельно записывалась, а надо было передавать нынешние размеры объекта, т.е.
go.transform.localScale = Vector3.Lerp(go.transform.localScale, newscale, Time.deltaTime);
Точно. Переменная scale не обновлялась и по этому Vector3.Lerp застревал на одно месте между scale и newscale…
Так, теперь проблема есть: игрок все равно проваривается, если стоит на таком кубе. Шаманил с физикой — не помогает, если игрок стоит просто — проваливается при изменении размеров.
С коллайдером наверное что-то. Попробуй mesh collider вместо box collider.
И ещё попробуй это поменять эти параметры:
Edit -> Project Settings -> Physics -> Min Penetration For Penalty.
Чем это значение меньше, тем точнее коллизии.
Edit -> Project Settings -> Physics -> Solver Iteration Count
Чем это значение выше, тем точнее расчёт коллизий.
Мне это помогло однажды: gamesetup.ru/qa/12.html#comment2992
Закинь изменение скейла в корутину и жди завершения фрейма. Также может помочь галочка Convex на ригид боди
А если более простым языком?)
У тебя объекты с коллайдерами маленькие. Нужно их увеличить или сделать как говорит Fortunato. Вчера сидел и игрался с динамическим изменением в 2D пространстве. Все работало.
подскажите как сделать чтобы обьект плавно менял масштаб с 0 на 1 за 1 секунду скриптом а не анимацией плизз.и если можно то скрипт попроще
- Sanchez9241
- 11 февраля 2014, 07:57
- -1
Попрошайничать не хорошо.
А по теме — помогут матрицы. Матрица масштабирования выглядит так:
[ sx 0 0 ]
[ 0 sy 0 ]
[ 0 0 sz ]
Где sx, sy и sz это scale x, scale y и scale z соответственно
З.Ы. Забыл сказать, что её неплохо бы расширить ещё, но всё-равно никому это не поможет, так что 😀
ну вопервых я не попрощшайничаю так как тут уже выкладывался скрипт по теме. я просто прошу подсказать как мне сделать плавный переход ведь должна быть функция которая плавно поменяет значение, тем более мне надо тоже сотворить с перемещением обьекта
Вот решение же, вроде заметно в теме
мне надо что бы обьект по истечении 21 секунды до 22 секунды плавно изменил масштаб(во втором варианте переместился) с 0 на 1и так и остался.
Код там прокомментирован, все понятно же, меняйте как Вам надо и пробуйте.
я как бы типа немного нуб:) Я сделал то что мне надо но через костыли и 2 переменныые типа старый скейл и новый скейл вообщем темболее планого перехода как при анимации не получилось
Перечитайте комментарий, на который я Вам указал и подумайте еще раз. Там все просто и понятно, я же это понял, когда только столкнулся.
go.transform.localScale = new Vector3(Random.Range(2.0f,10.0f), Random.Range(2.0f,10.0f), Random.Range(2.0f,10.0f)
всё так как в твоём скрипте только эту строчку надо поменять на чтото типо go.transform.localScale = и функция чтобы плавно изменить маштаб от 0 до 1 за 1 секунду
помоги именно с этой функцией плиззз
просто напиши как надо
То, что написал ты — генерация нового размера. Ты правильно сформулируй вопрос, не совсем понимаю что ты хочешь.
есть гейм обджект куб у которого скейл 0. надо чтобы по истечении 21 секунды (в промежутке между 21 и 22 секундой)произошло плавное изменение скейла с 0 до 1ю как вот если б я проанимировал 1 кадр скейл 0 а через секунду кадр со скейлом 1 и при проигрованиии идет плавная смена масштаба.тоже самое мне надо с позицией обьекта.куб с положением 000за 1 секунду плавно переплывает в положение 10,0,0
помоги а то сил уже нет
и такой вопрос есть куб.как сделать чтобы он был как кнопка и при клике на него мышкой он менял свой скейл на 0 а другой куб(тоже кнопка) приезжал слева например
NGUI в помощь
using UnityEngine; using System.Collections; public class changeCube : MonoBehaviour < public GameObject go; // Объект с которым работаем private float timer = 21.0f; // Ставим таймер на 21 секунду private float iTimer = 1.0f; // таймер для изменения private Vector3 scale; // Переменная для текущего размера private Vector3 newscale; // Переменная для нового размера private Vector3 pos; //начальная позиция private Vector3 newpos; //конечная позиция void Start() < scale = new Vector3(0f, 0f, 0f); // newscale = new Vector3(1f, 1f, 1f); newpos = new Vector3(10f,0f,0f); go.transform.localScale = scale; >void Update() < timer -= 1.0f * Time.deltaTime; // Отнимаем от таймера 1 в секунду if(timer > >
работоспособность не проверял, сам проверь
а по проще никак. просто неужели столько сложностей чтобы масштабировать и двигать обьект. ладно может у меня подход неправильный?? вообщем общая задача такая: используется НГУИ для создания кнопок.при старте главной менюшки должно отсчитатся 21 секунда и с 21 до 22 секунды кнопка старт должна плавно появится(именно сменой масштаба с 0 до 1), потом при нажатии мышкой или клавиатурой на кнопку старт она должна изменится обратно(сменить масштаб с 1 на 0) и слева и справа должны приехать кнопки НГУИ ньюгейм и екзит соответственно. и кнопочка опции приехать снизу
вот как то так подскажи плиззз
как я уже говорил, NGUI в помощь, через него что угодно можно сделать. И даже простая менюшка делается не в 2 строчки.
ссмотри менюшку то я сделал нет проблем а вот с движением проблемы помоги а плз
С NGUI я не работал особо, забросил пока что его. Читай мануалы, уроки, благо их в сети сейчас полно.
3 — Игровые объекты (Game Objects) Unity
— создаём новую сцену, попутно изучив все пункты меню, предназначенные для работы со сценой: создать (File -> New Scene), открыть (File -> Open Scene), сохранить (File -> Save), сохранить как… (File -> Save as…)
— учимся удалять объекты со сцены с помощью клавиши Delete
— изучаем использование комбинации клавиш Ctrl + Z для отмены выполненных действий
— знакомимся с понятием «игровой объект» (Game Object) и учимся добавлять их на сцену с помощью пункта меню GameObject -> 3D object -> …
— учимся переименовывать объекты
— учимся различать координатные оси X (красного цвета), Y (зеленого – это вертикальная ось в Unity), Z (синего)
— на примере 3D-примитива Cube учимся перемещать объекты на сцене (инструмент Move tool),
— знакомимся с горячими клавишами для быстрого выбора инструментов управления игровыми объектами: Q (Hand tool), W (Move tool), E (Rotate tool), R (Scale tool), T, Y
— учимся перемещать объекты по сцене по отдельным координатным осям X, Y, Z и в пределах координатных плоскостей (X, Z), (X, Y), (Y, Z)
— учимся поворачивать (Rotate tool, клавиша E) игровой объект вокруг соответствующих координатных осей,
— используем комбинацию клавиш Ctrl + Z для отмены выполненных действий. Особенность Unity в том, что запоминаются все мельчайшие действия, включая выделения объектов и пр. без изменения их характеристик. Поэтому иногда нажимать Ctrl + Z приходится долго.
— знакомимся с командой Redo и соответствующей комбинацией клавиш Ctrl + Y для возврата отмененных действий.
— находим команды Undo (Ctrl + Z) и Redo (Ctrl + Y) в пункте Edit главного меню редактора Unity, учимся находить и запоминать комбинации клавиш.
— учимся масштабировать (изменять размеры) игровых объектов (Scale tool, горячая клавиша R) пропорционально (по всем осям одновременно, без изменения формы объекта) и по отдельным осям, изменяя форму (пропорции) исходного объекта.
— знакомимся с инструментом Rect tool, который в основном используется для работы с 2D-объектами, но работает также и в 3D, позволяя изменить размер объекта в одном направлении, а также переместить его в пространстве сцены.
— знакомимся с инструментом Move, Rotate, Scale tool, в котором одновременно совмещены все три перечисленные инструмента в одном. Этот инструмент появился в более новых версиях Unity.
— вырабатываем привычку идентифицировать (именовать) создаваемые на сцене объекты либо в окне Inspector, либо Hierarchy.
— учимся сохранять сцену в нужной папке, ориентируясь на наличие знака * рядом с её названием в окне Hierarchy либо в заголовке окна редактора Unity.
— учимся ориентироваться в папках в окне Project, находить там и открывать сохранённые сцены.
Цикл уроков создан при поддержке компании Melsoft games.


Наши проекты

Творческое программирование для всех! (игры и анимация на Scratch)
Бесплатные уроки для детей и взрослых
- Контакты
- Ольга Елисеева — Автор учебников, наставник, тренер, консультант
- О проекте АЭЛИТ
- Публичная оферта
- Политика конфиденциальности
- Пользовательское соглашение
- Публичная лицензия на электронные версии книг