2015-10-11 2 views
0

Я пытаюсь создать простую сетку через код и попытаться создать простой сетчатый коллайдер того же размера, что и сетка. Я пробовал много разных вещей, однако сетчатый коллайдер всегда кажется больше, чем сама сетка. Я действительно смущен, может ли кто-нибудь решить проблему или указать мне в правильном направлении? Любая помощь приветствуется.Неверный размер коллапса сетки для процедурно сгенерированной сетки

Вот скриншот того, что происходит: Problem

Кроме того, вот код:

public class PolygonGenerator : MonoBehaviour 
{ 
    private Mesh mesh; 
    public List<Vector3> newVertices = new List<Vector3>(); 
    public List<int> newTriangles = new List<int>(); 
    private MeshCollider meshCol; 
    public List<Vector3> colVertices = new List<Vector3>(); 
    public List<int> colTriangles = new List<int>(); 

    float x; 
    float y; 
    float z; 

    // Use this for initialization 
    void Start() 
    { 
     mesh = GetComponent<MeshFilter>().mesh; 
     meshCol = gameObject.AddComponent(typeof(MeshCollider)) as MeshCollider; 
     meshCol.convex = true; 


     x = this.gameObject.transform.position.x; 
     y = this.gameObject.transform.position.y; 
     z = this.gameObject.transform.position.z; 

     GenSquare (x, y); 
     GenCollider (x, y); 

     UpdateMesh(); 
    } 

    void UpdateMesh() 
    { 
     mesh.Clear(); 
     mesh.vertices = newVertices.ToArray(); 
     mesh.triangles = newTriangles.ToArray(); 
     mesh.Optimize(); 
     mesh.RecalculateNormals(); 

     Mesh newMesh = new Mesh(); 
     newMesh.vertices = colVertices.ToArray(); 
     newMesh.triangles = colTriangles.ToArray(); 
     meshCol.sharedMesh = newMesh; 
    } 

    void GenSquare(float x, float y) 
    { 
     newVertices.Add(new Vector3 (x , y , z)); 
     newVertices.Add(new Vector3 (x + 1 , y , z)); 
     newVertices.Add(new Vector3 (x + 1 , y-1 , z)); 
     newVertices.Add(new Vector3 (x , y-1 , z)); 

     newTriangles.Add(0); 
     newTriangles.Add(2); 
     newTriangles.Add(3); 
     newTriangles.Add(0); 
     newTriangles.Add(1); 
     newTriangles.Add(2); 
    } 

    void GenCollider(float x, float y) 
    { 
     colVertices.Add(new Vector3 (x , y , z)); 
     colVertices.Add(new Vector3 (x + 1 , y , z)); 
     colVertices.Add(new Vector3 (x + 1 , y-1 , z)); 
     colVertices.Add(new Vector3 (x , y-1 , z)); 

     colTriangles.Add (0); 
     colTriangles.Add (2); 
     colTriangles.Add (3); 
     colTriangles.Add (0); 
     colTriangles.Add (1); 
     colTriangles.Add (2); 
    } 

    void OnCollisionEnter(Collision col) 
    { 
     Debug.Log("Collision"); 

    } 

    void OnTriggerEnter(Collider col) 
    { 
     Debug.Log ("Trigger"); 

    } 

} 

ответ

0

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

Это должно исправить:

void GenCollider(float x, float y) 
{ 
    colVertices.Add(new Vector3 (x , y , z)); 
    colVertices.Add(new Vector3 (x + 0.1f , y , z)); 
    colVertices.Add(new Vector3 (x + 0.1f , y-0.1f , z)); 
    colVertices.Add(new Vector3 (x , y-0.1f , z)); 

    colTriangles.Add (0); 
    colTriangles.Add (2); 
    colTriangles.Add (3); 
    colTriangles.Add (0); 
    colTriangles.Add (1); 
    colTriangles.Add (2); 
} 

Я не 100 процентов уверен, поэтому, пожалуйста, дайте мне знать, если вы попробуете его.

+0

Я пробовал. Это не в 10 раз больше, а в 2 раза больше; таким образом, используя 0.5f для значений, я получаю правильный размер коллайдера. Однако, даже если я получаю правильный размер, положение коллайдера также неверно. Вы правы, что он создает коллайдер автоматически, и это было проблемой для меня. Проведя больше времени, я нашел проблему и исправил ее. Проблема заключается в использовании его в виде выпуклого коллайдера. Если я не использую выпуклый коллайдер, Unity дает мне ошибку, говоря, что я не могу использовать коллайдер, если я делаю его выпуклым, он создает больший коллайдер в неправильном положении. – Perex19

+0

Однако коллайдер, который он создает, - это 3d, а не 2d ручной коллайдер, который я пытаюсь создать. Итак, я решил создать 3d-коллайдер, а не 2d-коллайдер с очень тонкой границей. После преобразования моего коллайдера в 3d, Unity теперь видит его как выпуклый коллайдер и позволяет мне держать мой коллайдер, который решает проблему для меня сейчас. Мне все еще интересно узнать, почему я не могу использовать коллайдер 2d сетки, и почему единство не распознает коллайдер 2d сетки как выпуклую форму. Разве это не выпукло? И почему это делает размер коллайдера большим, чем форма при создании самого коллайдера? – Perex19

+1

О, ничего себе, я не знал, что вы работаете с 2D. Я думаю, ваша проблема здесь в том, что MeshCollider - это 3D-коллайдер, я думаю, вы можете использовать PolygonCollider2D. Это может быть эквивалентно MeshCollider для 2D-программирования. –