Неверный размер коллайдера для процедурной сетки

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

Вот скриншот того, что происходит: проблема

Также вот код:

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");

    }

}

1 ответ

Решение

Если я не ошибаюсь, вам не нужно создавать коллайдер вручную. Вы должны иметь возможность добавить компонент к игровому объекту, который вы создаете с помощью вашей сетки, и он должен рассчитать коллайдер для вас. Но если вы все еще хотите создать его вручную, я думаю, что коллайдер обычно в 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 процентов, поэтому, пожалуйста, дайте мне знать, если вы попробуете.

Другие вопросы по тегам