Я хотел бы отредактировать 1 вершину куба, но не знаю, как это сделать. Я пробовал везде искать эту функцию, но не могу найти решение.
Вот изображение того, чего я хочу достичь:
Я хотел бы отредактировать 1 вершину куба, но не знаю, как это сделать. Я пробовал везде искать эту функцию, но не могу найти решение.
Вот изображение того, чего я хочу достичь:
http://answers.unity3d.com/questions/14567/editing-mesh-vertices-in-unity.html
Этот код не мой. Ниже приведен тот же код, что и по ссылке выше. Я просто разделил его на два файла. (по одному на класс)
Это работает довольно хорошо. НО обязательно сохраните сцену перед ее использованием, она немного глючит.
Не забудьте выйти из режима редактирования, когда закончите с модификацией.
Вам не нужно добавлять тег «editMesh» к игровому объекту, который вы изменяете, иначе он будет стерт, когда вы выйдете из режима редактирования.
Наконец, если вы измените примитив из единицы, модификация будет применена к каждому экземпляру этого примитива! (если заменить куб на пирамиду, каждый куб станет пирамидой)
Чтобы избежать этого, сделайте копию примитивной сетки, измените сетку, которую вы используете в средстве визуализации сетки, на свою копию, а затем измените ее. (ниже скрипт, чтобы добавить простую функцию копирования в меню единства)
EditMesh.cs
#if UNITY_EDITOR
using UnityEngine;
using System.Collections;
/// <summary>
/// http://answers.unity3d.com/questions/14567/editing-mesh-vertices-in-unity.html
/// </summary>
[AddComponentMenu("Mesh/Vert Handler")]
[ExecuteInEditMode]
public class EditMesh : MonoBehaviour {
public bool _destroy;
private Mesh mesh;
private Vector3[] verts;
private Vector3 vertPos;
private GameObject[] handles;
private const string TAG_HANDLE = "editMesh";
void OnEnable() {
mesh = GetComponent<MeshFilter>().sharedMesh; // sharedMesh seem equivalent to .mesh
verts = mesh.vertices;
foreach (Vector3 vert in verts) {
vertPos = transform.TransformPoint(vert);
GameObject handle = new GameObject(TAG_HANDLE);
// handle.hideFlags = HideFlags.DontSave;
handle.transform.position = vertPos;
handle.transform.parent = transform;
handle.tag = TAG_HANDLE;
handle.AddComponent<EditMeshGizmo>()._parent = this;
}
}
void OnDisable() {
GameObject[] handles = GameObject.FindGameObjectsWithTag(TAG_HANDLE);
foreach (GameObject handle in handles) {
DestroyImmediate(handle);
}
}
void Update() {
if (_destroy) {
_destroy = false;
DestroyImmediate(this);
return;
}
handles = GameObject.FindGameObjectsWithTag(TAG_HANDLE);
for (int i = 0; i < verts.Length; i++) {
verts[i] = handles[i].transform.localPosition;
}
mesh.vertices = verts;
mesh.RecalculateBounds();
mesh.RecalculateNormals();
}
}
#endif
EditMeshGizmo.cs
#if UNITY_EDITOR
using UnityEngine;
using System.Collections;
/// <summary>
/// http://answers.unity3d.com/questions/14567/editing-mesh-vertices-in-unity.html
/// </summary>
[ExecuteInEditMode]
public class EditMeshGizmo : MonoBehaviour {
private static float CURRENT_SIZE = 0.1f;
public float _size = CURRENT_SIZE;
public EditMesh _parent;
public bool _destroy;
private float _lastKnownSize = CURRENT_SIZE;
void Update() {
// Change the size if the user requests it
if (_lastKnownSize != _size) {
_lastKnownSize = _size;
CURRENT_SIZE = _size;
}
// Ensure the rest of the gizmos know the size has changed...
if (CURRENT_SIZE != _lastKnownSize) {
_lastKnownSize = CURRENT_SIZE;
_size = _lastKnownSize;
}
if (_destroy)
DestroyImmediate(_parent);
}
void OnDrawGizmos() {
Gizmos.color = Color.red;
Gizmos.DrawCube(transform.position, Vector3.one * CURRENT_SIZE);
}
}
#endif
CopyMesh.cs (поместите его в каталог с именем «Редактор») (вы должны найти его в строке меню)
using UnityEditor;
using UnityEngine;
namespace Assets {
/// <summary>
///
/// </summary>
public class CopyMesh : MonoBehaviour {
[MenuItem("Assets/CopyMesh")]
static void DoCopyMesh() {
Mesh mesh = Selection.activeObject as Mesh;
Mesh newmesh = new Mesh();
newmesh.vertices = mesh.vertices;
newmesh.triangles = mesh.triangles;
newmesh.uv = mesh.uv;
newmesh.normals = mesh.normals;
newmesh.colors = mesh.colors;
newmesh.tangents = mesh.tangents;
AssetDatabase.CreateAsset(newmesh, AssetDatabase.GetAssetPath(mesh) + " copy.asset");
}
[MenuItem("Assets/CopyMeshGameObject")]
static void DoCopyMeshGameObject() {
Mesh mesh = (Selection.activeGameObject.GetComponent<MeshFilter>()).sharedMesh;
Mesh newmesh = new Mesh();
newmesh.vertices = mesh.vertices;
newmesh.triangles = mesh.triangles;
newmesh.uv = mesh.uv;
newmesh.normals = mesh.normals;
newmesh.colors = mesh.colors;
newmesh.tangents = mesh.tangents;
print(AssetDatabase.GetAllAssetPaths()[0]);
AssetDatabase.CreateAsset(newmesh, AssetDatabase.GetAllAssetPaths()[0] + "/mesh_copy.asset");
}
}
}
Недавно Unity добавила доступ к пакету ProBuilder через «Диспетчер пакетов».
Подробнее здесь: https://docs.unity3d.com/Packages/[email protected]/manual/index.html
Редактор Unity на данный момент не имеет встроенных возможностей редактора мешей. Я могу посоветовать вам использовать для этого плагин Prototype.
Вы можете легко сделать это, перебирая вершины, которые Unity предоставит вам как Vector3[]
через поле someObject.GetComponent<MeshFilter>().vertices
. См. http://docs.unity3d.com/ScriptReference/Mesh-vertices.html для примера, где вершины перемещаются вверх со временем.