2015-09-23 2 views
0

Я хотел бы отредактировать 1 вершину на кубе, но я не знаю, как это сделать. Я пробовал искать везде эту функцию, но я не могу найти решение.Как отредактировать mesh/vertices в Unity

Вот образ того, что я хочу добиться:

enter image description here

+0

образ того, что я хочу здесь http://i.stack.imgur.com/JKgl0.png –

+0

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

+0

Unity не является 3D-инструментом моделирования, вы не работаете с Edges или Vertices в Unity. В Unity вы работаете с уже подготовленными моделями – Briksins

ответ

1

редактора Unity не имеет встроенные возможности редактора сетки на данный момент. Я могу посоветовать вам использовать плагин Prototype.

1

Вы можете легко сделать это путем итерации через Вершины, которые Unity предоставит вам как Vector3[] через поле someObject.GetComponent<MeshFilter>().vertices. См. http://docs.unity3d.com/ScriptReference/Mesh-vertices.html для примера, где вершины перемещаются вверх со временем.

+0

Но нет встроенного способа сохранить эти изменения, исправить? (Не то, чтобы он делал ответ менее действенным - возможно, что апеллятору нужны только изменения времени выполнения.) – 31eee384

+0

Да, я действительно не знаю никаких * встроенных * методов, которые также сохраняют эту сетку. Теперь вы можете стать настоящим берсерком и экспортировать данные своих вершин в какой-нибудь файл-файл (.obj, что бы то ни было) и переименовать сетки, но вы прямо там. Но опять же, если вы хотите настойчиво менять вершины сетки, почему бы не сделать изменения в редакторе моделирования и сохранить его напрямую? –

+0

В этом единственном ответе есть скрипт, который позволяет редактировать вершины. http://answers.unity3d.com/questions/14567/editing-mesh-vertices-in-unity.html –

1

http://answers.unity3d.com/questions/14567/editing-mesh-vertices-in-unity.html

Этот код не мой. Bellow - это тот же код, что и ссылка выше. Я просто разделил его на два файла. (по одному на класс)

Работает неплохо. НО убедитесь, что вы сохранили сцену перед ее использованием, она немного глючит.

  • Не забудьте оставить режим редактирования, когда вы закончите с изменением.

  • Вам не нужно добавлять тег «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"); 
     } 
    } 
}