7 / 6 / 4 Регистрация: 06.02.2017 Сообщений: 73 |
|
1 |
|
Изменение размеров обьекта скриптом09.03.2017, 20:34. Показов 15788. Ответов 2
вообщем, только начал разбирать юнити и пытаться писать свои елементарные скрипты. и вот туплю на таком примере: есть меню, при наведении курсора на елемент меню(картинка) нужно увеличить размер. кому не сложно набросайте с коментариями, буду благодарен!
__________________
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
09.03.2017, 20:34 |
Ответы с готовыми решениями: Изменение цвета текста скриптом Изменение Цвета Кнопки Скриптом в Unity Изменение размеров UI через скрипт
2 |
Askfor 33 / 32 / 10 Регистрация: 07.08.2012 Сообщений: 148 |
||||
09.03.2017, 21:37 |
2 |
|||
Решениея сам еще новичок в этом но посмотрел бы сюда https://docs.unity3d.com/Scrip… Enter.html добавьте кнопке коллайдер 2D (увеличите его, на UI он маленький очень по умолчанию и не кликабельно получается) и киньте на кнопку этот скрипт
1 |
7 / 6 / 4 Регистрация: 06.02.2017 Сообщений: 73 |
|
09.03.2017, 21:46 [ТС] |
3 |
Благодарю!)
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
09.03.2017, 21:46 |
3 |
как изменить размер объекта?
как изменить размер объекта?
как изменить размер объекта? Пробовал так: transform.localScale.x-=3, но пишет : «Не удалось изменить возвращаемое значение для Unity.Engine.Transform.localScale, так как он не является переменной»
Подскажите как можно изменить размер по-другому?
- BANNERTM
- UNITрон
- Сообщения: 241
- Зарегистрирован: 26 фев 2012, 00:13
Re: как изменить размер объекта?
seaman 18 апр 2012, 18:49
В C# пробовали? Почему тогда не удивляетесь, что нельзя так: transform.position.z = 10; ? Чем это отличается от того, что Вы пробовали?
- seaman
- Адепт
- Сообщения: 8351
- Зарегистрирован: 24 янв 2011, 12:32
- Откуда: Самара
Re: как изменить размер объекта?
BANNERTM 18 апр 2012, 18:51
seaman писал(а):В C# пробовали? Почему тогда не удивляетесь, что нельзя так: transform.position.z = 10; ? Чем это отличается от того, что Вы пробовали?
Я в шарпе и пишу.
А возможно вообще размер из скрипта изменить?
- BANNERTM
- UNITрон
- Сообщения: 241
- Зарегистрирован: 26 фев 2012, 00:13
Re: как изменить размер объекта?
seaman 18 апр 2012, 19:36
Прочитайте еще раз мое сообщение.
Как Вы в шарпе меняете позицию — напишите.
А теперь спросите себя — с чего Вы вдруг забыли это и решили, что масштаб меняется иначе?
ЗЫ: В виду «сложности» вопроса — в «Почемучку».
- seaman
- Адепт
- Сообщения: 8351
- Зарегистрирован: 24 янв 2011, 12:32
- Откуда: Самара
Re: как изменить размер объекта?
eligma 18 апр 2012, 19:52
Я че то не понял Сиамен — скейл же только для чтение — он програмно не меняется — это ж все токо и ждут когда можно будет свойство скейл крутить?
Gleeko Multiplayer Gameplay——Знаете ли вы что протокол IPV6 в 1 000 000 раз превышает по возможностям протокол IPV4? А также протокол IPV6 официально был запущен в прошлом году 6.06 числа в 6 часов утра. Это событие отмечали во всем мире.
-
eligma - Старожил
- Сообщения: 778
- Зарегистрирован: 29 фев 2012, 03:35
-
- Сайт
Re: как изменить размер объекта?
Battle Angel Alita 18 апр 2012, 20:43
Спасибо ООП. До компоненты структуры нельзя достучатся, надо создавать прокси структуру.
transform.localScale -= new Vector3(3.0f, 0.0f, 0.0f);
Мозг рака
-
Battle Angel Alita - UNIверсал
- Сообщения: 476
- Зарегистрирован: 25 ноя 2009, 14:52
Re: как изменить размер объекта?
seaman 18 апр 2012, 21:06
Ну, лучше было бы, чтобы он сам догадался.
- seaman
- Адепт
- Сообщения: 8351
- Зарегистрирован: 24 янв 2011, 12:32
- Откуда: Самара
Re: как изменить размер объекта?
BANNERTM 18 апр 2012, 21:12
seaman писал(а):Ну, лучше было бы, чтобы он сам догадался.
Спасибо, земляк
- BANNERTM
- UNITрон
- Сообщения: 241
- Зарегистрирован: 26 фев 2012, 00:13
Re: как изменить размер объекта?
Battle Angel Alita 18 апр 2012, 21:19
>Ну, лучше было бы, чтобы он сам догадался.
У меня на догадывание ушло несколько дней и туева хуча нервов.
Мозг рака
-
Battle Angel Alita - UNIверсал
- Сообщения: 476
- Зарегистрирован: 25 ноя 2009, 14:52
Re: как изменить размер объекта?
seaman 18 апр 2012, 21:31
Ну я же подсказывал. Вы что никогда не меняли позицию объекта? На форуме про это с десяток раз обсуждалось.
- seaman
- Адепт
- Сообщения: 8351
- Зарегистрирован: 24 янв 2011, 12:32
- Откуда: Самара
Re: как изменить размер объекта?
Battle Angel Alita 18 апр 2012, 21:37
Проблема возникла с Bounds.
Без прокси объекта нельзя воспользоваться функцией SetMinMax. Чому — не представляю.
Мозг рака
-
Battle Angel Alita - UNIверсал
- Сообщения: 476
- Зарегистрирован: 25 ноя 2009, 14:52
Re: как изменить размер объекта?
BANNERTM 18 апр 2012, 21:44
Ладно, ладно, я разобрался — всем спасибо)
- BANNERTM
- UNITрон
- Сообщения: 241
- Зарегистрирован: 26 фев 2012, 00:13
Re: как изменить размер объекта?
seaman 18 апр 2012, 22:21
Без прокси объекта нельзя воспользоваться функцией SetMinMax.
Сорри, не понял. Где там можно его вставить?
Используется csharp
void SetMinMax (Vector3 min, Vector3 max)
Передаешь ему два вектора. В ответ ничего не получаешь.
- seaman
- Адепт
- Сообщения: 8351
- Зарегистрирован: 24 янв 2011, 12:32
- Откуда: Самара
Re: как изменить размер объекта?
Battle Angel Alita 18 апр 2012, 22:35
this.GetComponent<MeshFilter>().mesh.bounds.SetMinMax(Vector3.one * (-1.0f), Vector3.one);
Как-то так. Не ругается, но и ничего не делает.
Мозг рака
-
Battle Angel Alita - UNIверсал
- Сообщения: 476
- Зарегистрирован: 25 ноя 2009, 14:52
Re: как изменить размер объекта?
seaman 18 апр 2012, 23:28
Ну в общем понятно почему. Хотя это все же не очевидно. Это из-за того, что Bounds не класс, а структура. Структуры в C# передаются не по ссылке, а по значению. Т.е. GetComponent<MeshFilter>().mesh.bounds создает копию структуры Bounds на стеке и для нее вызывает SetMinMax. Ну а поскольку мы никуда эту копию не сохраняем, то наши изменения пропадают втуне.
Нужно:
Используется csharp
Bounds b = GetComponent<MeshFilter>().mesh.bounds;
b.SetMinMax(—Vector3.one, Vector3.one);
GetComponent<MeshFilter>().mesh.bounds = b;
- seaman
- Адепт
- Сообщения: 8351
- Зарегистрирован: 24 янв 2011, 12:32
- Откуда: Самара
Вернуться в Почемучка
Кто сейчас на конференции
Сейчас этот форум просматривают: Google [Bot] и гости: 10
Suggest a change
Success!
Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.
Close
Submission failed
For some reason your suggested change could not be submitted. Please <a>try again</a> in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.
Close
Your name
Your email
Suggestion*
Cancel
Switch to Manual
Description
The scale of the transform relative to the GameObjects parent.
The example below creates a sphere GameObject with a scale of (1,1,1). The application then changes the Transform.localScale from 1.0 down to 0.25 and back to 1.0 repeatedly.
using System.Collections; using System.Collections.Generic; using UnityEngine;public class Example : MonoBehaviour { private GameObject sphere; private Vector3 scaleChange, positionChange;
void Awake() { Camera.main.clearFlags = CameraClearFlags.SolidColor;
// Create a sphere at the origin. sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere); sphere.transform.position = new Vector3(0, 0, 0);
// Create a plane and move down by 0.5. GameObject plane = GameObject.CreatePrimitive(PrimitiveType.Plane); plane.transform.position = new Vector3(0, -0.5f, 0);
// Change the floor color to blue. // The blue material is present in Resources and not created in this script. Renderer rend = plane.GetComponent<Renderer>(); rend.material = Resources.Load<Material>("blue");
scaleChange = new Vector3(-0.01f, -0.01f, -0.01f); positionChange = new Vector3(0.0f, -0.005f, 0.0f); }
void Update() { sphere.transform.localScale += scaleChange; sphere.transform.position += positionChange;
// Move upwards when the sphere hits the floor or downwards // when the sphere scale extends 1.0f. if (sphere.transform.localScale.y < 0.1f || sphere.transform.localScale.y > 1.0f) { scaleChange = -scaleChange; positionChange = -positionChange; } } }
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 <= 0.0f) { // Если таймер пришел к нулю
go.transform.localScale = new Vector3(Random.Range(2.0f,10.0f), Random.Range(2.0f,10.0f), Random.Range(2.0f,10.0f)); // Меняем размер объекта
timer = 10.0f; // Снова ставим таймер на 10 секунд
} }
- Fortunato
-
1 декабря 2013, 19:38
- 0
- ↓
Вот, я так же проверял, но тут загвоздка в том, что размер меняется мгновенно, а не постепенно.
- OrionShah
-
1 декабря 2013, 19:40
- ↑
- ↓
В смысле постепенно? Ты спрашивал, как менять раз в 10 секунд.
- Fortunato
-
1 декабря 2013, 19:42
- ↑
- ↓
Да, но надо постепенно. В данном Вами примером, размер меняется раз в 10 секунд мгновенно, резко, а надо плавно, чтобы было видно и игрок случайно не попал внутрь.
- OrionShah
-
1 декабря 2013, 19:45
- ↑
- ↓
Всё что у меня получилось:
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 <= 0.0f) { // Если таймер пришел к нулю
scale = new Vector3(go.transform.localScale.x, go.transform.localScale.y, go.transform.localScale.z); // Проверяем текущий размер
newscale = new Vector3(Random.Range(2.0f,10.0f) , Random.Range(2.0f,10.0f), Random.Range(2.0f,10.0f)); // Задаем новый случайный размер
timer = 10.0f; // Снова ставим таймер на 10 секунд
}
}
}
Но эта часть не работает почему-то правильно:
go.transform.localScale = Vector3.Lerp(scale, newscale, Time.deltaTime); // Меняем размер объекта
Она должна менять размер плавно. Нужно погуглить, как её правильно написать.
- Fortunato
-
1 декабря 2013, 20:52
- +1
- ↓
Если найдешь решение, напиши, полезно было бы узнать где косяк.
- Fortunato
-
1 декабря 2013, 20:52
- ↑
- ↓
Все, получилось!
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 <= 0.0f)
{
newscale = new Vector3(Random.Range(2.0f, 10.0f), Random.Range(2.0f, 10.0f), Random.Range(2.0f, 10.0f)); // Задаем новый случайный размер
timer = 10.0f; // Снова ставим таймер на 10 секунд
}
}
}
косяк был в том, как я понял, что переменная размера отдельно записывалась, а надо было передавать нынешние размеры объекта, т.е.
go.transform.localScale = Vector3.Lerp(go.transform.localScale, newscale, Time.deltaTime);
- OrionShah
-
1 декабря 2013, 21:09
- ↑
- ↓
Точно. Переменная scale не обновлялась и по этому Vector3.Lerp застревал на одно месте между scale и newscale…
- Fortunato
-
1 декабря 2013, 21:13
- ↑
- ↓
Так, теперь проблема есть: игрок все равно проваривается, если стоит на таком кубе. Шаманил с физикой — не помогает, если игрок стоит просто — проваливается при изменении размеров.
- OrionShah
-
1 декабря 2013, 22:01
- ↑
- ↓
С коллайдером наверное что-то. Попробуй 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
- Fortunato
-
1 декабря 2013, 22:53
- ↑
- ↓
Закинь изменение скейла в корутину и жди завершения фрейма. Также может помочь галочка Convex на ригид боди
- AndrewNovak
-
5 декабря 2013, 03:32
- ↑
- ↓
У тебя объекты с коллайдерами маленькие. Нужно их увеличить или сделать как говорит Fortunato. Вчера сидел и игрался с динамическим изменением в 2D пространстве. Все работало.
- AndrewNovak
-
8 декабря 2013, 13:42
- ↑
- ↓
подскажите как сделать чтобы обьект плавно менял масштаб с 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 соответственно
- Grim
-
11 февраля 2014, 18:40
- ↑
- ↓
З.Ы. Забыл сказать, что её неплохо бы расширить ещё, но всё-равно никому это не поможет, так что
- Grim
-
11 февраля 2014, 19:05
- ↑
- ↓
ну вопервых я не попрощшайничаю так как тут уже выкладывался скрипт по теме. я просто прошу подсказать как мне сделать плавный переход ведь должна быть функция которая плавно поменяет значение, тем более мне надо тоже сотворить с перемещением обьекта
- Sanchez9241
-
11 февраля 2014, 22:40
- ↑
- ↓
- OrionShah
-
11 февраля 2014, 22:42
- ↑
- ↓
мне надо что бы обьект по истечении 21 секунды до 22 секунды плавно изменил масштаб(во втором варианте переместился) с 0 на 1и так и остался.
- Sanchez9241
-
11 февраля 2014, 22:48
- ↑
- ↓
Код там прокомментирован, все понятно же, меняйте как Вам надо и пробуйте.
- OrionShah
-
11 февраля 2014, 22:50
- ↑
- ↓
я как бы типа немного нуб:) Я сделал то что мне надо но через костыли и 2 переменныые типа старый скейл и новый скейл вообщем темболее планого перехода как при анимации не получилось
- Sanchez9241
-
11 февраля 2014, 22:55
- ↑
- ↓
Перечитайте комментарий, на который я Вам указал и подумайте еще раз. Там все просто и понятно, я же это понял, когда только столкнулся.
- OrionShah
-
11 февраля 2014, 22:57
- ↑
- ↓
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 секунду
помоги именно с этой функцией плиззз
просто напиши как надо
- Sanchez9241
-
11 февраля 2014, 23:02
- ↑
- ↓
То, что написал ты — генерация нового размера. Ты правильно сформулируй вопрос, не совсем понимаю что ты хочешь.
- OrionShah
-
11 февраля 2014, 23:03
- ↑
- ↓
есть гейм обджект куб у которого скейл 0. надо чтобы по истечении 21 секунды (в промежутке между 21 и 22 секундой)произошло плавное изменение скейла с 0 до 1ю как вот если б я проанимировал 1 кадр скейл 0 а через секунду кадр со скейлом 1 и при проигрованиии идет плавная смена масштаба.тоже самое мне надо с позицией обьекта.куб с положением 000за 1 секунду плавно переплывает в положение 10,0,0
помоги а то сил уже нет
- Sanchez9241
-
11 февраля 2014, 23:10
- ↑
- ↓
и такой вопрос есть куб.как сделать чтобы он был как кнопка и при клике на него мышкой он менял свой скейл на 0 а другой куб(тоже кнопка) приезжал слева например
- Sanchez9241
-
11 февраля 2014, 23:13
- ↑
- ↓
- OrionShah
-
11 февраля 2014, 23:21
- ↑
- ↓
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 <= 0)
{
nTimer -= 1.0f * Time.deltaTime;
go.transform.localScale = Vector3.Lerp(go.transform.localScale, newscale, Time.deltaTime);
go.transform.position = Vectro3.Lerp(go.transform.position, newpos, Time.deltaTime);
}
}
}
работоспособность не проверял, сам проверь
- OrionShah
-
11 февраля 2014, 23:21
- ↑
- ↓
а по проще никак??? просто неужели столько сложностей чтобы масштабировать и двигать обьект??? ладно может у меня подход неправильный?? вообщем общая задача такая: используется НГУИ для создания кнопок.при старте главной менюшки должно отсчитатся 21 секунда и с 21 до 22 секунды кнопка старт должна плавно появится(именно сменой масштаба с 0 до 1), потом при нажатии мышкой или клавиатурой на кнопку старт она должна изменится обратно(сменить масштаб с 1 на 0) и слева и справа должны приехать кнопки НГУИ ньюгейм и екзит соответственно. и кнопочка опции приехать снизу
вот как то так подскажи плиззз
- Sanchez9241
-
11 февраля 2014, 23:30
- ↑
- ↓
как я уже говорил, NGUI в помощь, через него что угодно можно сделать. И даже простая менюшка делается не в 2 строчки.
- OrionShah
-
11 февраля 2014, 23:32
- ↑
- ↓
ссмотри менюшку то я сделал нет проблем а вот с движением проблемы помоги а плз
- Sanchez9241
-
11 февраля 2014, 23:38
- ↑
- ↓
С NGUI я не работал особо, забросил пока что его. Читай мануалы, уроки, благо их в сети сейчас полно.
- OrionShah
-
11 февраля 2014, 23:54
- ↑
- ↓
- OrionShah
-
12 февраля 2014, 00:09
- ↑
- ↓
Только зарегистрированные и авторизованные пользователи могут отвечать на вопросы.
@tryvols
Front-End разработчик
Здравствуйте. Всю ночь роюсь в мануалах, уже устал от этого, если честно. Загвоздка вот в чем. Что бы всегда и при любых разрешениях экрана квадраты оставались квадратами, как и отступы между ними — все это пришлось высчитывать прогамно(ширину квадрата и отступы, которые зависят от ширины экрана), то есть скриптами. Но никак не могу найти функции что бы изменить размеры, да и почему-то расположение объекта высчитывается при помощи position с нижнего левого угла.
Заранее спасибо.
-
Вопрос заданболее трёх лет назад
-
2061 просмотр
Как я понял из последнего абзаца, речь идет о GUI. Ок.
Тогда менять привязку к углу экрана можно нажав на эту кнопку
А вообще смотрите RectTransform и пользуйтесь в скриптах им, там есть возможность задавать размер. Только рано вам его изучать, вы даже Transform пока не изучили, раз не смогли использовать scale, чтобы изменить размер вашего квадрата.
Почему квадраты у вас на разных разрешениях становятся не квадратными — я без понятия, не должны изменяться, ваш косяк скорее всего.
using UnityEngine;
using System.Collections;
public class Block_Script : MonoBehaviour {
private GameObject block;
private float paddingHeight = Screen.height / 100 * 20,
padding = Screen.width / 100 * 5,
width = Screen.width / 100 * 19;
private float paddingTop;
private float paddingLeft;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnGUI () {
paddingTop = paddingHeight + padding;
paddingLeft = padding;
for (int i = 0; i < 16; i++) {
if (i % 4 == 0) {
paddingTop += padding + width;
paddingLeft = padding;
}
if (GUI.Button (new Rect (paddingLeft, paddingTop, width, width), "")) {
print ("You clicked me!");
}
paddingLeft += padding + width;
}
}
}
Пригласить эксперта
-
Показать ещё
Загружается…
10 февр. 2023, в 04:49
50000 руб./за проект
10 февр. 2023, в 02:20
3000 руб./за проект
10 февр. 2023, в 01:33
1500 руб./за проект
Минуточку внимания
Transform используется для хранения GameObjectфундаментального объекта в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
Просматривать в Словарь положение, поворот, масштаб и родительское состояние и, таким образом, очень важный. К GameObject всегда будет присоединен компонент Transform — невозможно удалить Transform или создать GameObject без него.
Компонент преобразования
Компонент Transform определяет Положение, Поворот и Масштаб каждого объекта в классе sceneСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. в Словарь. У каждого GameObject есть Transform.
Свойства
Свойства: | Функции: |
---|---|
Position | Положение преобразования в координатах X, Y и Z. |
Rotation | Вращение Transform вокруг осей X, Y и Z, измеряемое в градусах. |
Scale | Масштаб преобразования по осям X, Y и Z. Значение «1» — исходный размер (размер, с которым был импортирован объект). |
Значения положения, поворота и масштаба преобразования измеряются относительно родительского элемента преобразования. Если у преобразования нет родителя, свойства измеряются в мировом пространстве.
Редактирование преобразований
Преобразования выполняются в 3D-пространстве по осям X, Y и Z или в 2D-пространстве только по осям X и Y. В Unity эти оси представлены красным, зеленым и синим цветами соответственно.
Преобразование можно редактировать в Вид сценыИнтерактивный вид создаваемого вами мира. Вы используете Scene View для выбора и размещения пейзажей, персонажей, камер, источников света и всех других типов игровых объектов. Дополнительная информация
См. в Словарь или изменив его свойства в ИнспекторОкно Unity, в котором отображается информация о текущем выбранном игровом объекте, активе или настройках проекта, что позволяет вам проверять и редактировать значения. Подробнее
См. в Словарь. В сцене вы можете изменять Transforms с помощью инструментов Move, Rotate и Scale. Эти инструменты расположены в верхнем левом углу редактора Unity.
Инструменты можно использовать для любого объекта сцены. При нажатии на объект вы увидите инструмент gizmoГрафическое наложение, связанное с GameObject в сцене и отображаемое в вид сцены. Встроенные инструменты сцены, такие как инструмент перемещения, представляют собой гизмо, и вы можете создавать собственные гизмо, используя текстуры или сценарии. Некоторые гизмо отрисовываются только при выборе игрового объекта, в то время как другие гизмо отрисовываются редактором независимо от того, какие игровые объекты выбраны. Подробнее
See in Словарь появляются внутри него. Внешний вид гизмо зависит от того, какой инструмент выбран.
Когда вы щелкнете и перетащите одну из трех осей гизмо, вы заметите, что ее цвет изменится на желтый. Когда вы перетаскиваете мышь, вы увидите, как объект перемещается, вращается или масштабируется вдоль выбранной оси. Когда вы отпустите кнопку мыши, ось останется выбранной.
В режиме преобразования также есть дополнительная опция, позволяющая привязать движение к определенной плоскости (т. е. разрешить перетаскивание по двум осям, сохраняя при этом третью без изменений). Три маленьких цветных квадрата вокруг центра гизмо перевода активируют блокировку для каждой плоскости; цвета соответствуют оси, которая будет заблокирована при щелчке по квадрату (например, синий блокирует ось Z).
Воспитание детей
Родительские обязанности — одна из самых важных концепций, которые необходимо понимать при использовании Unity. Когда GameObject является родителемобъектом, который содержит дочерние объекты в иерархии. Когда GameObject является Родителем другого GameObject, Дочерний GameObject будет перемещаться, вращаться и масштабироваться точно так же, как и его Родитель. Вы можете думать о воспитании детей как об отношениях между вашими руками и вашим телом; всякий раз, когда ваше тело двигается, ваши руки также двигаются вместе с ним. Подробнее
Посмотреть в Словарь другого игрового объекта, дочернего элемента GameObject будет двигаться, вращаться и масштабироваться точно так же, как и его Parent. Вы можете думать о воспитании детей как об отношениях между вашими руками и вашим телом; всякий раз, когда ваше тело двигается, ваши руки также двигаются вместе с ним. Дочерние объекты также могут иметь своих собственных дочерних элементов и так далее. Таким образом, ваши руки могут рассматриваться как «дети» ваших рук, и тогда каждая рука имеет несколько пальцев и т. д. Любой объект может иметь несколько потомков, но только одного родителя. Эти несколько уровней отношений родитель-потомок образуют иерархию преобразования. Объект на самом верху иерархии (то есть единственный объект в иерархии, не имеющий родителя) называется корневым.
Вы можете создать родительский элемент, перетащив любой игровой объект из Просмотра иерархии на другой. Это создаст отношения «родитель-потомок» между двумя игровыми объектами.
Обратите внимание, что значения преобразования в Инспекторе для любого дочернего игрового объекта отображаются относительно значений преобразования родительского объекта. Эти значения называются локальными координатами. Возвращаясь к аналогии с телом и руками, положение вашего тела может измениться, когда вы идете, но ваши руки все равно будут прикреплены в том же относительном положении. Для построения сцены обычно достаточно работать с локальными координатами дочерних объектов, но в игровом процессе часто бывает полезно найти их точное положение в мировом пространстве или глобальные координаты. API сценариев для компонента Transform имеет отдельные свойства для локального и глобального положения, поворота и масштаба, а также позволяет преобразовать любую точку между локальными и глобальными координатами.
Ограничения при неравномерном масштабировании
Неравномерное масштабирование — это когда Scale в Transform имеет разные значения для x, y и z; например (2, 4, 2). Напротив, равномерное масштабирование имеет одно и то же значение для x, y и z; например (3, 3, 3). Неравномерное масштабирование может быть полезно в некоторых конкретных случаях, но оно вносит несколько странностей, которые не возникают при равномерном масштабировании:-
- Некоторые компоненты не полностью поддерживают неравномерное масштабирование. Например, некоторые компоненты имеют круглый или сферический элемент, определяемый свойством radius, среди них Sphere Collider Компонент коллайдера в форме сферы, который обрабатывает столкновения для игровых объектов, таких как мячи или другие вещи, которые можно приблизительно представить как сферу для целей физики. Подробнее
См. в Словарь, Capsule ColliderКомпонент коллайдера в форме капсулы, который обрабатывает коллизии игровых объектов, таких как бочки и конечности персонажей. Подробнее
См. в Словарь, Light и Источник аудиоКомпонент, который воспроизводит аудиоклип в сцене для слушателя звука или через аудиомикшер. Подробнее
См. в Словарь. В подобных случаях круглая форма не станет эллиптической при неравномерном масштабировании, как можно было бы ожидать, а просто останется круглой. - Если дочерний объект имеет родительский объект с неравномерным масштабом и повернут относительно этого родительского объекта, он может выглядеть перекошенным или «срезанным». Есть компоненты, которые поддерживают простое неравномерное масштабирование, но не работают корректно при таком перекосе. Например, скошенный Box Colliderкомпонент коллайдера в форме куба, который обрабатывает коллизии игровых объектов, таких как игральные кости и кубики льда. Подробнее
См. в Словарь не будет соответствовать форме отображаемого meshОсновной графический примитив Unity. Меши составляют большую часть ваших 3D-миров. Unity поддерживает триангулированные или четырехугольные полигональные сетки. Поверхности Nurbs, Nurms, Subdiv должны быть преобразованы в полигоны. Подробнее
Точно смотрите в Словарь. - Из соображений производительности дочерний объект родительского объекта с неравномерным масштабом не будет автоматически обновляться при повороте. В результате может показаться, что форма дочернего элемента резко меняется, когда масштаб в конечном итоге обновляется, например, если дочерний объект отсоединяется от родительского.
Важность масштаба
Масштаб преобразования определяет разницу между размером сетки в приложении для моделирования и размером этой сетки в Unity. Размер сетки в Unity (и, следовательно, масштаб преобразования) очень важен, особенно во время моделирования физики. По умолчанию используется физический движокСистема, моделирующая аспекты физических систем, чтобы объекты могли правильно ускоряться и подвергаться воздействию столкновений, гравитации и другие силы. Подробнее
См. в Словарь предполагает, что одна единица в мировом пространстве соответствует одному метру. Если объект очень большой, может показаться, что он падает в «замедленной съемке»; симуляция на самом деле правильная, поскольку фактически вы наблюдаете, как очень большой объект падает с большого расстояния.
Есть три фактора, которые могут повлиять на масштаб вашего объекта:
- Размер сетки в приложении для 3D-моделирования.
- Настройка Коэффициент масштабирования сетки в Настройках импорта объекта.
- Значения Масштаб вашего компонента преобразования.
В идеале не следует настраивать Масштаб объекта в компоненте преобразования. Лучший вариант — создавать свои модели в реальном масштабе, чтобы вам не пришлось менять масштаб преобразования. Следующим лучшим вариантом является настройка масштаба импорта вашей сетки в Настройки импорта для вашей отдельной сетки. Определенные оптимизации выполняются в зависимости от размера импорта, и создание экземпляра объекта с настроенным значением масштаба может снизить производительность. Дополнительные сведения см. в разделе об оптимизации масштаба на странице с описанием компонентов Rigidbody.
Советы по работе с преобразованиями
- При родительском преобразовании полезно установить местоположение родительского элемента <0,0,0> перед добавлением дочернего элемента. Это означает, что локальные координаты дочернего элемента будут такими же, как и глобальные координаты, что упрощает определение правильного положения дочернего элемента.
- Если вы используете RigidbodiesКомпонент, позволяющий воздействовать на GameObject смоделированной гравитацией и другими силами. Подробнее
См. в Словарь моделирование физики, затем обязательно прочитайте о свойстве Scale на справочная страница компонента Rigidbody. - Вы можете изменить цвета осей преобразования (и других элементов пользовательского интерфейса) в настройках (Меню: Unity > Настройки, а затем выберите панель Цвета и клавиши). .
- Изменение масштаба влияет на положение дочерних преобразований. Например, масштабирование родителя до (0,0,0) приведет к размещению всех дочерних элементов в (0,0,0) относительно родителя.