Написал для себя утилиту для изменения пивота . Меняется только позиция, без поворота. Если мне понадобится, то и поворот сделаю, а пока - лень
Выкладываю, мб кому пригодится.
Удобство в этом методе в том, что пивот устанавливается "наглядно" передвижением объекта(подробности ниже), а не как тут установкой значений.
Код:
Синтаксис:
Используется csharp
using UnityEngine;
using UnityEditor;
using System.Collections;
public class SetPivots : EditorWindow
{
public Transform oldPosition;
public Transform newPosition;
[MenuItem("Tools/Set Pivots")]
public static void CreateWindow()
{
SetPivots window = GetWindow<SetPivots>();
window.title = "Set Pivots";
}
public void OnGUI()
{
GUILayout.Space (20);
GUILayout.BeginHorizontal();
GUILayout.Label("Object:", GUILayout.Width(120));
oldPosition = (Transform)EditorGUILayout.ObjectField(oldPosition, typeof(Transform),true);
GUILayout.EndHorizontal();
GUILayout.Space (20);
GUILayout.BeginHorizontal();
GUILayout.Label("New Position:", GUILayout.Width(120));
newPosition = (Transform)EditorGUILayout.ObjectField(newPosition, typeof(Transform),true);
GUILayout.EndHorizontal();
GUILayout.Space (20);
if(GUILayout.Button("Edit pivot mesh"))
{
if(oldPosition==null)
{
Debug.LogError("No Object!");
return;
}
if(newPosition==null)
{
Debug.LogError("No newPosition!");
return;
}
MeshFilter mesh = oldPosition.GetComponent<MeshFilter>();
if(mesh==null)
{
Debug.LogError("No MeshFilter in Object!");
return;
}
Vector3 vect = new Vector3(newPosition.position.x-oldPosition.position.x,newPosition.position.y-oldPosition.position.y,newPosition.position.z-oldPosition.position.z);
Vector3[] verts = mesh.sharedMesh.vertices;
for(int i=0; i<verts.Length; i++) {
verts[i] += vect;
}
mesh.sharedMesh.vertices = verts;
mesh.sharedMesh.RecalculateBounds();
newPosition.position = oldPosition.position;
Debug.Log("Edit OK.");
}
}
}
using UnityEditor;
using System.Collections;
public class SetPivots : EditorWindow
{
public Transform oldPosition;
public Transform newPosition;
[MenuItem("Tools/Set Pivots")]
public static void CreateWindow()
{
SetPivots window = GetWindow<SetPivots>();
window.title = "Set Pivots";
}
public void OnGUI()
{
GUILayout.Space (20);
GUILayout.BeginHorizontal();
GUILayout.Label("Object:", GUILayout.Width(120));
oldPosition = (Transform)EditorGUILayout.ObjectField(oldPosition, typeof(Transform),true);
GUILayout.EndHorizontal();
GUILayout.Space (20);
GUILayout.BeginHorizontal();
GUILayout.Label("New Position:", GUILayout.Width(120));
newPosition = (Transform)EditorGUILayout.ObjectField(newPosition, typeof(Transform),true);
GUILayout.EndHorizontal();
GUILayout.Space (20);
if(GUILayout.Button("Edit pivot mesh"))
{
if(oldPosition==null)
{
Debug.LogError("No Object!");
return;
}
if(newPosition==null)
{
Debug.LogError("No newPosition!");
return;
}
MeshFilter mesh = oldPosition.GetComponent<MeshFilter>();
if(mesh==null)
{
Debug.LogError("No MeshFilter in Object!");
return;
}
Vector3 vect = new Vector3(newPosition.position.x-oldPosition.position.x,newPosition.position.y-oldPosition.position.y,newPosition.position.z-oldPosition.position.z);
Vector3[] verts = mesh.sharedMesh.vertices;
for(int i=0; i<verts.Length; i++) {
verts[i] += vect;
}
mesh.sharedMesh.vertices = verts;
mesh.sharedMesh.RecalculateBounds();
newPosition.position = oldPosition.position;
Debug.Log("Edit OK.");
}
}
}
Создайте в Project папку Editor. В этой папке создайте C# скрипт с именем SetPivots и положите в него данный скрипт.
Использование:
1. Объект, у которого нужно изменить пивот помещаем на сцену. Создаём для него клона, нажатием Ctrl+D. Устанавливаем клона так, как должен стоять меш после изменения пивота.
2. Вверху появится меню Tools/Set Pivots. Открыть его.
3. В поле Object поместить исходный объект, который с мешем.
4. В поле New Position поместить клона.
5. Нажать кнопку "Edit pivot mesh".
6. Если всё хорошо, то меш изменится и в консоле будет надпись "Edit OK.". Иначе - в консоле будет ошибка.
7. Клона можно удалить.
Внимание! Данная утилита меняет исходник меша в проекте, это необратимая операция! Обращайтесь осторожно