2015-10-28 1 views
0

J'essaye d'écrire un script qui rend un cube bleu et affiche les vertices du cube quand il est sélectionné pendant l'exécution. Donc, quand on clique dessus, il affichera tous les sommets, puis permettra à un utilisateur de sélectionner différents sommets du cube.Comment afficher les sommets sur un cube lorsqu'il est sélectionné dans Unity (pendant l'exécution)?

C'est ce que j'ai jusqu'ici, essentiellement en tournant le cube en bleu. Comment puis-je afficher les sommets du cube en tant que sphères? Je veux pouvoir sélectionner ces sommets plus tard.

using UnityEngine; 
using System.Collections; 

public class Cube : MonoBehaviour { 
    void OnMouseDown() { 
     Renderer rend = GetComponent<Renderer>(); 
     rend.material.color = Color.blue; 
     //insert method to display vertices 
    } 
} 
+0

comment allez-vous trouver les sommets de votre « cube »? et qu'utilisez-vous comme "sphères"? Primitives d'unité? – maksymiuk

+0

@LOLslowSTi Je n'ai pas trouvé les sommets, j'ai supposé qu'ils étaient dans une sorte de tableau en tant que propriété du cube. Je voudrais utiliser les primitives d'unité comme sphères. (Je suis nouveau à l'unité donc je peux dire que c'est faux, me pointer dans la bonne direction d'où regarder serait apprécié) – ryanmattscott

+0

Qu'est-ce que le «cube» est-il aussi un primitif? – maksymiuk

Répondre

1

Étant donné que le cube et les sphères sont primitives:

vous trouverez les sommets comme celui-ci (en supposant cube est un GameObject):

Vector3[] vertices = cube.GetComponent<MeshFilter>().mesh.vertices; 

Et puis pour créer vos sphères (besoin using System.Linq):

GameObject[] spheres = vertices.Select(vert => 
{ 
    GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere) 
    sphere.transform.position = vert; 
    return sphere; 
}) 
.ToArray(); 

MISE À JOUR : Ok, je vois votre problème avec trop de vertices maintenant, et voici comment je le ferais, et je ferais personnellement le seuil du rayon de vos sphères, de sorte qu'une fois que les sphères commencent à se chevaucher, ils deviennent un:

float threshold = 0.1f; 

public void CreateSpheres() 
{ 
    List<GameObject> spheres = new List<GameObject>(); 
    foreach (Vector3 vert in vertices) 
    { 
     if (spheres.Any(sph => (sph.transform.position - vert) < threshold)) continue; 

     GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere) 
     sphere.transform.position = vert; 
     spheres.Add(sphere); 
    } 
} 
+0

Je n'ai pas la variable 'cube' en tant que' GameObject' Je ne sais pas comment faire. J'ai essayé de définir le cube comme ceci: 'GameObject cube = this.gameObject;' Mais alors quand j'écris 'Vector3 [] vertices = cube.GetComponent () .mesh.vertices;' J'obtiens l'erreur Impossible de convertir entre le type 'Unity .Engine.MeshFilter' et 'Unity.Engine.Vector3 []' – ryanmattscott

+0

si vous tapez ceci à l'intérieur d'un 'MonoBehaviour' alors vous devez écrire' gameObject' au lieu de 'cube' comme ceci:' gameObject.GetComponent (). engrener.sommets; 'devrait fonctionner. – maksymiuk

+0

Cela fonctionne cependant le 'vertices.Select' me donne un type d'erreur arguments pour la méthode 'Enumerable.Select ne peut pas être déduit de l'utilisation' dans Visual Studio. Dans Unity, cette erreur apparaît 'erreur CS1643: tous les chemins de code ne renvoient pas une valeur dans la méthode anonyme de type 'System.Func ' – ryanmattscott

0

Impossible de faire fonctionner la fonction Sélectionner pour afficher dans l'un des exemples précédents. Les coordonnées ont été trouvées en utilisant GetComponent<MeshFilter>.mesh.vertices; comme décrit dans l'autre réponse.

void OnMouseDown() { 
    Renderer rend = GetComponent<Renderer>(); 
    rend.material.color = Color.blue; 
    Vector3[] vertices = GetComponent<MeshFilter>().mesh.vertices; 
    Vector3[] verts = removeDuplicates(vertices); 
    drawSpheres(verts); 
} 

Le tableau de sommets contient 24 éléments pour la raison représenté here. Ainsi, la fonction removeDuplicates a été écrite pour se débarrasser des sommets dupliqués. Cette fonction est indiquée ci-dessous:

Vector3[] removeDuplicates(Vector3[] dupArray) { 

    Vector3[] newArray = new Vector3[8]; //change 8 to a variable dependent on shape 
    bool isDup = false; 
    int newArrayIndex = 0; 
    for (int i = 0; i < dupArray.Length; i++) { 
     for (int j = 0; j < newArray.Length; j++) { 
      if (dupArray[i] == newArray[j]) { 
       isDup = true; 
      } 
     } 
     if (!isDup) { 
      newArray[newArrayIndex] = dupArray[i]; 
      newArrayIndex++; 
      isDup = false; 
     } 
    } 
    return newArray; 
} 

Enfin, les Sphères ont été établis à l'aide du nouveau tableau en utilisant la verts fonction drawSpheres montré ici:

void drawSpheres(Vector3[] verts) { 
    GameObject[] Spheres = new GameObject[verts.Length]; 
    for (int i = 0; i < verts.Length; i++) { 
     Spheres[i] = GameObject.CreatePrimitive(PrimitiveType.Sphere); 
     Spheres[i].transform.position = verts[i]; 
     Spheres[i].transform.localScale -= new Vector3(0.8F, 0.8F, 0.8F); 
    } 
}