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

Изменение размеров обьекта скриптом Unity, Unity3D Решение и ответ на вопрос 1935036

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 через скрипт
Здравствуйте, нужна ваша помощь. Есть панель, нужно изменить размер панели через скрипт, а если…

Изменение размеров UI под разные экраны
Пишу игру под андройд
Пытаюсь сделать,чтобы Текст,кнопки,поля ввода подстраивались под размеры…

2

Askfor

33 / 32 / 10

Регистрация: 07.08.2012

Сообщений: 148

09.03.2017, 21:37

2

Лучший ответ Сообщение было отмечено skyfer как решение

Решение

я сам еще новичок в этом но посмотрел бы сюда https://docs.unity3d.com/Scrip… Enter.html

добавьте кнопке коллайдер 2D (увеличите его, на UI он маленький очень по умолчанию и не кликабельно получается) и киньте на кнопку этот скрипт

C#
1
2
3
4
5
6
7
8
9
10
11
12
public class TestScaleScript : MonoBehaviour
{
 
   void OnMouseOver()
    {
        gameObject.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
    }
    void OnMouseExit()
    {
        gameObject.transform.localScale = new Vector3(0.2f, 0.2f, 0.2f);
    }
}



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 ответов

avatar

Не проверил, но думаю должно работать:

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

avatar

Вот, я так же проверял, но тут загвоздка в том, что размер меняется мгновенно, а не постепенно.

  • OrionShah
  • 1 декабря 2013, 19:40

avatar

В смысле постепенно? Ты спрашивал, как менять раз в 10 секунд.

  • Fortunato
  • 1 декабря 2013, 19:42

avatar

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

  • OrionShah
  • 1 декабря 2013, 19:45

avatar

Всё что у меня получилось:
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

avatar

Если найдешь решение, напиши, полезно было бы узнать где косяк.

  • Fortunato
  • 1 декабря 2013, 20:52

avatar

Все, получилось!

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

avatar

Точно. Переменная scale не обновлялась и по этому Vector3.Lerp застревал на одно месте между scale и newscale…

  • Fortunato
  • 1 декабря 2013, 21:13

avatar

Так, теперь проблема есть: игрок все равно проваривается, если стоит на таком кубе. Шаманил с физикой — не помогает, если игрок стоит просто — проваливается при изменении размеров.

  • OrionShah
  • 1 декабря 2013, 22:01

avatar

С коллайдером наверное что-то. Попробуй 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

avatar

Закинь изменение скейла в корутину и жди завершения фрейма. Также может помочь галочка Convex на ригид боди

  • AndrewNovak
  • 5 декабря 2013, 03:32

avatar

У тебя объекты с коллайдерами маленькие. Нужно их увеличить или сделать как говорит Fortunato. Вчера сидел и игрался с динамическим изменением в 2D пространстве. Все работало.

  • AndrewNovak
  • 8 декабря 2013, 13:42

avatar

подскажите как сделать чтобы обьект плавно менял масштаб с 0 на 1 за 1 секунду скриптом а не анимацией плизз.и если можно то скрипт попроще

  • Sanchez9241
  • 11 февраля 2014, 07:57

  • -1

avatar

Попрошайничать не хорошо.
А по теме — помогут матрицы. Матрица масштабирования выглядит так:
[ sx 0 0 ]
[ 0 sy 0 ]
[ 0 0 sz ]
Где sx, sy и sz это scale x, scale y и scale z соответственно

  • Grim
  • 11 февраля 2014, 18:40

avatar

З.Ы. Забыл сказать, что её неплохо бы расширить ещё, но всё-равно никому это не поможет, так что :D

  • Grim
  • 11 февраля 2014, 19:05

avatar

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

  • Sanchez9241
  • 11 февраля 2014, 22:40

avatar

  • OrionShah
  • 11 февраля 2014, 22:42

avatar

мне надо что бы обьект по истечении 21 секунды до 22 секунды плавно изменил масштаб(во втором варианте переместился) с 0 на 1и так и остался.

  • Sanchez9241
  • 11 февраля 2014, 22:48

avatar

Код там прокомментирован, все понятно же, меняйте как Вам надо и пробуйте.

  • OrionShah
  • 11 февраля 2014, 22:50

avatar

я как бы типа немного нуб:) Я сделал то что мне надо но через костыли и 2 переменныые типа старый скейл и новый скейл вообщем темболее планого перехода как при анимации не получилось

  • Sanchez9241
  • 11 февраля 2014, 22:55

avatar

Перечитайте комментарий, на который я Вам указал и подумайте еще раз. Там все просто и понятно, я же это понял, когда только столкнулся.

  • OrionShah
  • 11 февраля 2014, 22:57

avatar

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

avatar

То, что написал ты — генерация нового размера. Ты правильно сформулируй вопрос, не совсем понимаю что ты хочешь.

  • OrionShah
  • 11 февраля 2014, 23:03

avatar

есть гейм обджект куб у которого скейл 0. надо чтобы по истечении 21 секунды (в промежутке между 21 и 22 секундой)произошло плавное изменение скейла с 0 до 1ю как вот если б я проанимировал 1 кадр скейл 0 а через секунду кадр со скейлом 1 и при проигрованиии идет плавная смена масштаба.тоже самое мне надо с позицией обьекта.куб с положением 000за 1 секунду плавно переплывает в положение 10,0,0
помоги а то сил уже нет

  • Sanchez9241
  • 11 февраля 2014, 23:10

avatar

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

  • Sanchez9241
  • 11 февраля 2014, 23:13

avatar

  • OrionShah
  • 11 февраля 2014, 23:21

avatar

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

avatar

а по проще никак??? просто неужели столько сложностей чтобы масштабировать и двигать обьект??? ладно может у меня подход неправильный?? вообщем общая задача такая: используется НГУИ для создания кнопок.при старте главной менюшки должно отсчитатся 21 секунда и с 21 до 22 секунды кнопка старт должна плавно появится(именно сменой масштаба с 0 до 1), потом при нажатии мышкой или клавиатурой на кнопку старт она должна изменится обратно(сменить масштаб с 1 на 0) и слева и справа должны приехать кнопки НГУИ ньюгейм и екзит соответственно. и кнопочка опции приехать снизу
вот как то так подскажи плиззз

  • Sanchez9241
  • 11 февраля 2014, 23:30

avatar

как я уже говорил, NGUI в помощь, через него что угодно можно сделать. И даже простая менюшка делается не в 2 строчки.

  • OrionShah
  • 11 февраля 2014, 23:32

avatar

ссмотри менюшку то я сделал нет проблем а вот с движением проблемы помоги а плз

  • Sanchez9241
  • 11 февраля 2014, 23:38

avatar

С NGUI я не работал особо, забросил пока что его. Читай мануалы, уроки, благо их в сети сейчас полно.

  • OrionShah
  • 11 февраля 2014, 23:54

avatar

  • OrionShah
  • 12 февраля 2014, 00:09

Только зарегистрированные и авторизованные пользователи могут отвечать на вопросы.

Николай

@tryvols

Front-End разработчик

Здравствуйте. Всю ночь роюсь в мануалах, уже устал от этого, если честно. Загвоздка вот в чем. Что бы всегда и при любых разрешениях экрана квадраты оставались квадратами, как и отступы между ними — все это пришлось высчитывать прогамно(ширину квадрата и отступы, которые зависят от ширины экрана), то есть скриптами. Но никак не могу найти функции что бы изменить размеры, да и почему-то расположение объекта высчитывается при помощи position с нижнего левого угла.

Заранее спасибо.


  • Вопрос задан

    более трёх лет назад

  • 2061 просмотр

Как я понял из последнего абзаца, речь идет о GUI. Ок.
Тогда менять привязку к углу экрана можно нажав на эту кнопку
ilRAnrm.png
А вообще смотрите 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 Словарь
появляются внутри него. Внешний вид гизмо зависит от того, какой инструмент выбран.

Transform gizmo

Transform gizmo

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

Преобразование, показывающее выбранную (желтую) ось X

Преобразование, показывающее выбранную (желтую) ось X

В режиме преобразования также есть дополнительная опция, позволяющая привязать движение к определенной плоскости (т. е. разрешить перетаскивание по двум осям, сохраняя при этом третью без изменений). Три маленьких цветных квадрата вокруг центра гизмо перевода активируют блокировку для каждой плоскости; цвета соответствуют оси, которая будет заблокирована при щелчке по квадрату (например, синий блокирует ось 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) относительно родителя.

Понравилась статья? Поделить с друзьями:
  • Unity как изменить размер terrain
  • Unity как изменить размер canvas
  • Unity как изменить прозрачность объекта
  • Unity как изменить префаб
  • Unity как изменить позицию объекта через скрипт