程序生成的网格的网格碰撞器尺寸错误
Wrong Mesh Collider Size for Procedurally Generated Mesh
我正在尝试通过代码创建一个简单的网格,并尝试提供一个与网格大小相同的简单网格碰撞器。我尝试了很多不同的东西,但是网格对撞机似乎总是比网格本身大。我真的很困惑,任何人都可以解决问题或指出正确的方向吗?感谢任何帮助。
这是发生的事情的屏幕截图:
此外,这是代码:
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");
}
}
如果我没记错的话,您不必手动创建对撞机。您应该能够将组件添加到您使用网格创建的游戏对象,并且它应该为您计算对撞机。但如果你仍然想手动创建它,我认为碰撞器通常比世界范围内的网格大 10 倍。所以collider的大小应该除以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% 确定,所以如果你尝试了请告诉我。
我正在尝试通过代码创建一个简单的网格,并尝试提供一个与网格大小相同的简单网格碰撞器。我尝试了很多不同的东西,但是网格对撞机似乎总是比网格本身大。我真的很困惑,任何人都可以解决问题或指出正确的方向吗?感谢任何帮助。
这是发生的事情的屏幕截图:
此外,这是代码:
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");
}
}
如果我没记错的话,您不必手动创建对撞机。您应该能够将组件添加到您使用网格创建的游戏对象,并且它应该为您计算对撞机。但如果你仍然想手动创建它,我认为碰撞器通常比世界范围内的网格大 10 倍。所以collider的大小应该除以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% 确定,所以如果你尝试了请告诉我。