【问题标题】:Unity mesh collider problem. Sphere falls through meshUnity 网格对撞机问题。球体穿过网格
【发布时间】:2020-05-18 20:13:30
【问题描述】:

我正在尝试让一个球体落在我通过程序生成的网格上。不幸的是,球体从网格中掉了下来。此代码按程序生成网格。除了这段代码之外,我还有一个统一的球体,它附有刚体和球体对撞机。不幸的是,球体穿过网格,我不明白为什么。请帮忙。

   using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public class PGC_Mesh : MonoBehaviour
    {
        Mesh mesh;

        Vector3[] vertices;
        int[] triangles;

        public int xSize = 20;
        public int zSize = 20;

        public Material grassMat;


        void Start()
        {
            mesh = new Mesh();
            GetComponent<MeshFilter>().mesh = mesh;
            GetComponent<Renderer>().material = grassMat;
            MeshCollider collider = gameObject.AddComponent<MeshCollider>();
            CreateShape();
            UpdateMesh();
        }


        void CreateShape()
        {
            vertices = new Vector3[(xSize + 1) * (zSize + 1)];

            int i = 0;
            for (int z = 0; z <= zSize; z++)
            {
                for (int x = 0; x <= xSize; x++)
                {
                    float height = Mathf.PerlinNoise(x * .5f, z * .5f) * 10f;
                    vertices[i] = new Vector3(x, height, z);
                    i++;
                }
            }

            int myVertices = 0;
            int myTriangles = 0;
            triangles = new int[xSize * zSize * 6];

            for(int z = 0; z < zSize; z++)
            {
                for (int x = 0; x < xSize; x++)
                {
                    triangles[myTriangles + 0] = myVertices + (0);
                    triangles[myTriangles + 1] = myVertices + (xSize + 1);
                    triangles[myTriangles + 2] = myVertices + (1);
                    triangles[myTriangles + 3] = myVertices + (1);
                    triangles[myTriangles + 4] = myVertices + (xSize + 1);
                    triangles[myTriangles + 5] = myVertices + (xSize + 2);

                    myVertices++;
                    myTriangles += 6;
                }
                myVertices++;
            }


        }

        void UpdateMesh()
        {
            mesh.Clear();

            mesh.vertices = vertices;
            mesh.triangles = triangles;

            mesh.RecalculateNormals();
        }

        private void OnDrawGizmos()
        {
            if (vertices == null)
                return;
            for (int i = 0; i < vertices.Length; i++)
            {
                Gizmos.DrawSphere(vertices[i], .1f);
            }
        }

    }

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    你会的

    MeshCollider collider = gameObject.AddComponent<MeshCollider>();
    

    因此您添加了MeshCollider,但从未将实际网格分配给它,因此它不知道它的外观。

    你应该这样做

    var collider = gameObject.AddComponent<MeshCollider>();
    collider.convex = true;
    CreateShape();
    UpdateMesh();
    collider.sharedMesh = mesh;
    

    MeshCollider.sharedMesh


    另见MeshCollider.convex

    启用复选框以使 Mesh Collider 与其他 Mesh Collider 发生碰撞。

    这意味着如果您将此设置为 true,则您的网格碰撞器将不会有孔或入口。凸面网格可以与其他凸面碰撞器和非凸面网格碰撞。因此凸网格碰撞器适用于刚体,如果您确实需要比原始碰撞器提供的更详细的碰撞器。

    注意:物理引擎要求凸网格具有非零体积。被标记为凸面的平面网格(例如四边形或平面)将被物理引擎修改为具有满足此要求的厚度(因此是体积)。生成的网格的厚度与其尺寸成正比,最多可达网格平面中最长尺寸的 0.05。

    特别注意

    凸面网格碰撞器限制为 255 个三角形。


    最后,您可能还有兴趣在分配新的sharedMesh 之前设置某个MeshCollider.cookingOptions

    【讨论】:

      【解决方案2】:

      我已经确定了球体从网格中落下的原因。这是因为对撞机没有设置在正确的位置。应该在更新函数中设置,而不是在启动函数中设置。

      【讨论】:

        【解决方案3】:

        网格上有碰撞器吗?确保它和你的球体都有一个,否则它们会互相穿过。

        此外,泰勒汤普森的想法是正确的。您只使用了一次 UpdateMesh() 函数,因为您只是在程序开始时调用它,因为您已将它放在 Start() 函数中。将其移至通用 Update() 函数可以让程序不断调用它。

        【讨论】:

          猜你喜欢
          • 2021-12-18
          • 1970-01-01
          • 2020-04-27
          • 2021-05-29
          • 1970-01-01
          • 2016-06-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多