Меню

Как настроить pivot в unity

Позиционирование игровых объектов

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

Перемещение, вращение и масштабирование

Используйте инструменты трансформаций в панели инструментов для перемещения, вращения и масштабирования отдельных объектов. Каждый инструмент имеет соответствующее гизмо, которое появляется вокруг выделенного игрового объекта в окне Scene. Вы можете использовать мышь и манипулировать любой осью гизмо для изменения компонента Transform игрового объекта, или Вы можете ввести значения непосредственно в числовые поля компонента в инспекторе. Каждый из трех режимов может быть выбран горячими клавишами — W для перемещения, E для вращения и R для масштабирования.

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

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

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

Обратите внимание, что в режиме 2D, ось Z не может быть изменена в сцене с помощью гизмо. Тем не менее, бывает полезно использовать ось Z в некоторых методах скриптов для других целей; в таких случаях вы все еще можете установить ось Z в инспекторе.

Для получения дополнительной информации о трансформировании игровых объектов, см. страницу компонента Transform.

Переключатели отображения гизмо

Переключатели отображения гизмо( Gizmo Display Toggles ) используются для определения положения любого из них.

Переключатели отображения гизмо

  • Center установит гизмо в центре отображаемых границ объекта.
  • Pivot установит гизмо в позицию пивота Mesh’а.
  • Local установит гизмо для вращения объекта в локальных осях.
  • Global установит ориентацию гизмо по мировым осям.

Привязка к сетке

При перетаскивании любой оси гизмо инструмента перемещения, Вы можете зажать клавишу Control ( Command в Mac) для изменения значения с использованием привязки, определенной в Snap Settings .

Вы можете изменить шаг, который используется для привязки, выбрав в меню Edit->Snap Settings…

Настройки привязки к сетке в окна Scene.

Привязка к поверхности

При перетаскивании, с использованием центра инструмента перемещения, вы можете зажать Shift и Control ( Command в Mac) для привязки объекта к пересечению с любым коллайдером . Это позволяет очень быстро и точно расставлять объекты.

Вращение взгляда

При использовании инструмента вращения, вы можете зажать клавиши Shift и Control ( Command в Mac) для направления взгляда объекта на точку поверхности любого коллайдера . Это позволяет легко ориентировать объекты относительно друг друга.

Вершинная привязка

Вы можете строить миры еще быстрее с возможностью, которая называется “вершинная привязка”( Vertex snapping ). Эта возможность очень проста, но является очень мощным инструментом в Unity. Она позволяет вам взять один меш за любую вершину и с помощью мышки расположить его в такое же положение вершины другого меша, который вы выберите.

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

Использовать вершинную привязку в Unity достаточно просто. Просто следуйте этим шагам:

  • Выберите меш, которым вы хотите манипулировать, и убедитесь что Transform Tool активно.
  • Нажмите и держите клавишу V для активации режима вершинной привязки.
  • Поместите курсор мыши над вершиной, которую Вы хотите использовать.
  • Зажмите левую кнопку мыши когда курсор находится над нужной вершиной, и перетащите меш к любой другой вершине на другом меше.
  • Отпустите кнопку мыши и клавишу V когда результат вас устраивает.
  • Shift-V работает как переключатель этой функциональности.
  • Вы можете привязывать вершину к вершине, вершину к поверхности, и пивот к вершине.
Читайте также:  Как настроить виртуальную память в windows 10 x64

Источник



Как настроить pivot в unity

KuzmaProduction 04 сен 2010, 22:42

Re: Pivot модели

Paul Siberdt 04 сен 2010, 23:03

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

Если ничего поделать с моделью нельзя, навесьте ее в Юне чилдом на нулевой трансформ, и подвиньте, как нужно. Теперь пивотом вам послужит родитель-трансформ, его и совмещайте, с чем хочется. по цене плюс 1 трансформ в сцене.

Re: Pivot модели

Avatarchik 05 сен 2010, 00:10

Re: Pivot модели

KuzmaProduction 05 сен 2010, 08:18

Re: Pivot модели

TexeL 03 окт 2010, 20:56

Re: Pivot модели

bayah 16 ноя 2010, 19:10

Re: Pivot модели

WhiteDevil 20 дек 2010, 21:45

Re: Pivot модели

djon801 07 дек 2014, 01:26

на какую версию Unity этот скрипт?
На 4.6 работает ,но только объект вообще проподает

это в Unity
Instantiating mesh due to calling MeshFilter.mesh during edit mode. This will leak meshes. Please use MeshFilter.sharedMesh instead.
UnityEngine.MeshFilter:get_mesh()
SetPivot:OnGUI() (at Assets/Editor/SetPivot.cs:37)
UnityEditor.DockArea:OnGUI()

это в VisualStudio
Предупреждение 1 не удалось разрешить первичную ссылку «System.Data», поскольку она имеет более позднюю версию «2.0.5.0», чем версия в текущей целевой платформе. В текущей целевой платформе найдена версия «2.0.0.0». Assembly-CSharp-vs

Re: Pivot модели

djon801 03 апр 2015, 23:53

using UnityEngine ;
using UnityEditor ;

public class SetPivot : EditorWindow
<

Vector3 p ; //Pivot value -1..1, calculated from Mesh bounds
Vector3 last_p ; //Last used pivot

GameObject obj ; //Selected object in the Hierarchy
MeshFilter meshFilter ; //Mesh Filter of the selected object
Mesh mesh ; //Mesh of the selected object
Collider col ; //Collider of the selected object

bool pivotUnchanged ; //Flag to decide when to instantiate a copy of the mesh

[ MenuItem ( «GameObject/Set Pivot» ) ] //Place the Set Pivot menu item in the GameObject menu
static void Init ( )
<
SetPivot window = ( SetPivot ) EditorWindow. GetWindow ( typeof ( SetPivot ) ) ;
window. RecognizeSelectedObject ( ) ; //Initialize the variables by calling RecognizeSelectedObject on the class instance
window. Show ( ) ;
>

void OnGUI ( )
<
if ( obj )
<
if ( mesh )
<
p. x = EditorGUILayout. Slider ( «X» , p. x , — 11.0f, 11.0f ) ;
p. y = EditorGUILayout. Slider ( «Y» , p. y , — 1.0f, 1.0f ) ;
p. z = EditorGUILayout. Slider ( «Z» , p. z , — 1.0f, 1.0f ) ;
if ( p != last_p )
< //Detects user input on any of the three sliders
//Only create instance of mesh when user changes pivot
if ( pivotUnchanged ) mesh = meshFilter. sharedMesh ; pivotUnchanged = false ;
UpdatePivot ( ) ;
last_p = p ;
>
if ( GUILayout. Button ( «Center» ) )
< //Set pivot to the center of the mesh bounds
//Only create instance of mesh when user changes pivot
if ( pivotUnchanged ) mesh = meshFilter. sharedMesh ; pivotUnchanged = false ;
p = Vector3. zero ;
UpdatePivot ( ) ;
last_p = p ;
>
GUILayout. Label ( «Bounds » + mesh. bounds . ToString ( ) ) ;
>
else
<
GUILayout. Label ( «Selected object does not have a Mesh specified.» ) ;
>
>
else
<
GUILayout. Label ( «No object selected in Hierarchy.» ) ;
>
>

//Achieve the movement of the pivot by moving the transform position in the specified direction
//and then moving all vertices of the mesh in the opposite direction back to where they were in world-space
void UpdatePivot ( )
<
Vector3 diff = Vector3. Scale ( mesh. bounds . extents , last_p — p ) ; //Calculate difference in 3d position
obj. transform . position -= Vector3. Scale ( diff, obj. transform . localScale ) ; //Move object position
//Iterate over all vertices and move them in the opposite direction of the object position movement
Vector3 [ ] verts = mesh. vertices ;
for ( int i = 0 ; i verts. Length ; i ++ )
<
verts [ i ] += diff ;
>
mesh. vertices = verts ; //Assign the vertex array back to the mesh
mesh. RecalculateBounds ( ) ; //Recalculate bounds of the mesh, for the renderer’s sake
//The ‘center’ parameter of certain colliders needs to be adjusted
//when the transform position is modified
if ( col )
<
if ( col is BoxCollider )
<
( ( BoxCollider ) col ) . center += diff ;
>
else if ( col is CapsuleCollider )
<
( ( CapsuleCollider ) col ) . center += diff ;
>
else if ( col is SphereCollider )
<
( ( SphereCollider ) col ) . center += diff ;
>
>
>

Читайте также:  Настрой как поверить в себя

//Look at the object’s transform position in comparison to the center of its mesh bounds
//and calculate the pivot values for xyz
void UpdatePivotVector ( )
<
Bounds b = mesh. bounds ;
Vector3 offset = — 1 * b. center ;
p = last_p = new Vector3 ( offset. x / b. extents . x , offset. y / b. extents . y , offset. z / b. extents . z ) ;
>

//When a selection change notification is received
//recalculate the variables and references for the new object
void OnSelectionChange ( )
<
RecognizeSelectedObject ( ) ;
>

//Gather references for the selected object and its components
//and update the pivot vector if the object has a Mesh specified
void RecognizeSelectedObject ( )
<
Transform t = Selection. activeTransform ;
obj = t ? t. gameObject : null ;
if ( obj )
<
meshFilter = obj. GetComponent ( typeof ( MeshFilter ) ) as MeshFilter ;
mesh = meshFilter ? meshFilter. sharedMesh : null ;
if ( mesh )
UpdatePivotVector ( ) ;
col = obj. GetComponent ( typeof ( Collider ) ) as Collider ;
pivotUnchanged = true ;
>
else
<
mesh = null ;
>
>
>

Источник

Cоздание визуальных компонентов в Unity UI. Система частиц

Привет! Эта статья о создании собственных визуальных компонентов в UI на примере компонента для визуализации системы частиц в Canvas’e.

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

Немного теории или с чего начать создание компонента

Основой для UI в Unity является Canvas. Именно он используется системой рендера для отображения “многослойной” геометрии, в соответствии с внутренней иерархией UI-элементов.
Любой визуальный компонент пользовательского интерфейса должен наследоваться от класса Graphic (или его производного класса MaskableGraphic), который передаёт компоненту CanvasRenderer все необходимые данные для его отрисовки. Создание данных происходит в методе OnPopulateMesh, который вызывается каждый раз, когда компоненту необходимо обновить свою геометрию (например при изменении размеров элемента). В качестве параметра передаётся VertexHelper, который помогает в генерации меша для UI.

Создание компонента

Основа

Начнём реализацию с создания скрипта UIParticleSystem, наследуемого от класса MaskableGraphic. MaskableGraphic является производным класса Graphic и в дополнение обеспечивает работу с масками. Переопределим метод OnPopulateMesh. Основа работы с VertexHelper для генерации вершин меша системы частиц будет выглядеть следующим образом:

Сначала необходимо очистить VertextHelper от имеющихся данных вызовом метода Clear. После этого можно приступать к его заполнению новыми данными о вершинах. Для этого будет использован метод AddUIVertexQuad, который позволяет добавлять информацию сразу о 4-х вершинах. Этот метод выбран из-за удобства использования, т.к. каждая частица представляет собой прямоугольник. Каждая вершина описывается объектом UIVertex. Из всех параметров нам потребуется заполнить только позицию, цвет и одни координаты uv развертки.

Так как каждый кадр положение частиц, их цвет и другие параметры будут меняться, меш для их отрисовки должен также обновляться.
Для этого каждый кадр будем вызывать метод SetVerticesDirty, который установит флаг о необходимости пересчитать новые данные, что приведёт к вызову метода OnPopulateMesh. Аналогично и для материала, если его свойства будут меняться, то нужно вызывать метод SetMaterialDirty.

Переопределим свойство mainTexture. Оно указывает какая текстура будет передаваться CanvasRenderer и использоваться в материале, свойстве шейдера _MainTex. Для этого создадим поле ParticleImage, которое будет возвращаться свойством mainTexture.

Система частиц

Данные для генерации вершин меша будем брать от компонента ParticleSystem, занимающегося всеми расчетами по расположению частиц, их размеру, цвету и т.д.
Отрисовкой частиц занимается компонент ParticleSystemRenderer, который будет необходимо отключить, так за созданием меша и его отрисовку в UI будут отвечать уже другие компоненты — UIParticleSystem и CanvasRenderer.

Читайте также:  Как настроить для быстрого сохранения

Создадим необходимые для работы поля и проинициализируем их в методе Awake.

Поле _particles будет использоваться для хранения частиц ParticleSystem, а
_main используется для удобства работы с модулем MainModule.

Допишем метод OnPopulateMesh, взяв все необходимые данные непосредственно из системы частиц. Создадим вспомогательные переменные Vector3[] _quadCorners и Vector2[] _simpleUV.

_quadCorners содержит координаты 4-х углов прямоугольника, относительно центра частицы. Изначальный размер каждой частицы считаем как квадрат со сторонами 1х1.
_simpleUV — координаты uv развертки, в данном случае все частицы используют одинаковую текстуру без каких либо смещений.

Теперь создадим для теста простой UI, с использованием стандартных компонентов.

К компоненту ParticleSystem добавим UIParticleSystem

Запустим сцену и проверим результат работы компонента.

Частицы отображаются в соответствии с их положением в иерархии и учитывают используемые маски. При изменении разрешения экрана и его пропорций, а так же при изменение свойства Rendere Mode у Canvas, частицы ведут себя аналогично любому другому визуальному компоненту в Canvas и отображаются только в нём.

SimulationSpace

Т.к. мы размещаем систему частиц внутри UI, возникает проблема с параметром SimulationSpace. При симуляции в мировом пространстве частицы отображаются не там, где должны. Поэтому добавим расчет положения частицы в зависимости от значения параметра.

Имитируем свойства ParticleSystemRenderer

Теперь реализуем часть функционала ParticleSystemRenderer. А именно свойства RenderMode, SortMode, Pivot.

RenderMode

Ограничимся тем, что частицы всегда будут находится только в плоскости холста. Поэтому реализуем только два значения: Billboard и StretchedBillboard.
Создадим для этого своё перечисление CanvasParticleSystemRenderMode.

При выборе параметра StretchedBillboard, размер частицы будет зависеть от параметров LengthScale и SpeedScale, а её поворот будет направлен только в сторону движения.

SortMode

Аналогично создадим перечисление CanvasParticlesSortMode. и реализуем только сортировку по времени жизни частиц.

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

Pivot

Создадим поле Pivot, для смещения центральной точки частицы.

И при расчете позиции вершины добавляем это значение.

Регулируем размер

Если элемент, к которому прикреплена система частиц, не имеет фиксированных размеров или они могут меняться во время выполнения, то было бы неплохо адаптировать и размеры системы частиц. Сделаем так, чтобы источник — shape был пропорционален размерам элемента.

Метод OnRectTransformDimensionsChange вызывается при изменении размеров компонента RectTransform. Переопределим этот метод, реализовав изменение масштаба shape в соответствии с размерами RectTransform.

Предварительно создадим переменные для компонента RectTransform и модуля ShapeModule. Для возможности отключения масштабирования shape создадим переменную ScaleShapeByRectTransform.

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

При расчета стоит учесть поворот Shape’а. Значения конечного результата нужно взять по модулю, так как они могут получиться отрицательным, что скажется на направлении движения частиц.

Для проверки работы запустим анимацию изменения размеров RectTransform, с прикрепленной к нему системой частиц.

Инициализация

Чтобы скрипт корректно выполнялся в редакторе и избежать ошибок при вызове метода OnRectTransformDimensionsChange, вынесем в отдельный метод инициализацию переменных. И добавим его вызов в методы OnPopulateMesh и OnRectTransformDimensionsChange.

Метод OnRectTransformDimensionsChange может вызваться раньше Awake. Поэтому при каждом его вызове необходимо провести инициализацию переменных.

Производительность и оптимизация

Такой рендер частиц немного затратней, нежели использование ParticleSystemRenderer, что требует более расчетливого использования, в частности на мобильных устройствах.
Также стоит отметить, что если хотя бы один из элементов Canvas помечен как Dirty, то это приведёт к перерасчету всей геометрии Canvas и генерации новых команд отрисовки. Если UI содержит много сложной геометрии и её расчетов, то стоит разбить его на несколько вложенных холстов.

Источник