Я пытаюсь создать простую сетку через код и попытаться создать простой сетчатый коллайдер того же размера, что и сетка. Я пробовал много разных вещей, однако сетчатый коллайдер всегда кажется больше, чем сама сетка. Я действительно смущен, может ли кто-нибудь решить проблему или указать мне в правильном направлении? Любая помощь приветствуется.Неверный размер коллапса сетки для процедурно сгенерированной сетки
Вот скриншот того, что происходит:
Кроме того, вот код:
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 раз больше, а в 2 раза больше; таким образом, используя 0.5f для значений, я получаю правильный размер коллайдера. Однако, даже если я получаю правильный размер, положение коллайдера также неверно. Вы правы, что он создает коллайдер автоматически, и это было проблемой для меня. Проведя больше времени, я нашел проблему и исправил ее. Проблема заключается в использовании его в виде выпуклого коллайдера. Если я не использую выпуклый коллайдер, Unity дает мне ошибку, говоря, что я не могу использовать коллайдер, если я делаю его выпуклым, он создает больший коллайдер в неправильном положении. – Perex19
Однако коллайдер, который он создает, - это 3d, а не 2d ручной коллайдер, который я пытаюсь создать. Итак, я решил создать 3d-коллайдер, а не 2d-коллайдер с очень тонкой границей. После преобразования моего коллайдера в 3d, Unity теперь видит его как выпуклый коллайдер и позволяет мне держать мой коллайдер, который решает проблему для меня сейчас. Мне все еще интересно узнать, почему я не могу использовать коллайдер 2d сетки, и почему единство не распознает коллайдер 2d сетки как выпуклую форму. Разве это не выпукло? И почему это делает размер коллайдера большим, чем форма при создании самого коллайдера? – Perex19
О, ничего себе, я не знал, что вы работаете с 2D. Я думаю, ваша проблема здесь в том, что MeshCollider - это 3D-коллайдер, я думаю, вы можете использовать PolygonCollider2D. Это может быть эквивалентно MeshCollider для 2D-программирования. –