Почему Collider остается в том же положении, но сетка меняет свою позицию после выпечки?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Почему Collider остается в том же положении, но сетка меняет свою позицию после выпечки?

Сообщение Anonymous »

Я работаю над мировой системой выпечки в Unity, которая объединяет сетки и генерирует оптимизированные коллайдеры. После запуска моего сценария выпечки я замечаю несоответствие между положением сетки и положением коллайдера моих запеченных объектов. < /P>
using UnityEngine;
using System.Collections.Generic;
using System;

public class WorldBaker2 : MonoBehaviour
{
[SerializeField] private List blocksToBake = new List();
// [SerializeField] private GameObject combinedContainer;
[SerializeField] private LayerMask groundLayer;

const float BlockScale = 1;

private Mesh cubeMesh;
private Transform currentBlock;

private List verticies = new List();
private List uvs = new List();
private List triangles = new List();

//
// // // private List combineInstances = new List();

[ContextMenu("Bake World")]
public void BakeWorld()
{
foreach (var item in blocksToBake)
{
currentBlock = item.transform;
cubeMesh = new Mesh();

// Удаляем существующий Collider (если есть)
Collider existingCollider = currentBlock.gameObject.GetComponent();
if (existingCollider != null)
{
UnityEngine.Object.Destroy(existingCollider);
}
currentBlock.gameObject.AddComponent();

RemakeMesh();

//
// // CombineInstance ci = new CombineInstance();
// ci.mesh = cubeMesh;
// ci.transform = currentBlock.localToWorldMatrix;
// combineInstances.Add(ci);

// item.SetActive(false);
item.GetComponent().sharedMesh = cubeMesh;
}

Mesh finalMesh = new Mesh();
// // finalMesh.CombineMeshes(combineInstances.ToArray());

// Присваиваем объединенный меш combinedContainer
// MeshFilter containerFilter = combinedContainer.GetComponent();
// if (containerFilter == null)
// {
// containerFilter = combinedContainer.AddComponent();
// }
// containerFilter.sharedMesh = finalMesh;
// Добавляем коллайдер к объединенному контейнеру
// MeshCollider containerCollider = combinedContainer.GetComponent();
// if (containerCollider == null)
// {
// containerCollider = combinedContainer.AddComponent();
// }
// containerCollider.sharedMesh = finalMesh;

// HideBakedBlocks();

print("baked");
}

private void HideBakedBlocks()
{
foreach (var item in blocksToBake)
{
item.SetActive(false);
}
}

private void RemakeMesh()
{
verticies.Clear();
uvs.Clear();
triangles.Clear();

RemakeBlock();

cubeMesh.triangles = Array.Empty();
cubeMesh.vertices = verticies.ToArray();
cubeMesh.uv = uvs.ToArray();
cubeMesh.triangles = triangles.ToArray();

cubeMesh.Optimize();

cubeMesh.RecalculateNormals();
cubeMesh.RecalculateBounds();

currentBlock.GetComponent().sharedMesh = cubeMesh;
}

private void RemakeBlock()
{

if (!Physics.Raycast(currentBlock.position, Vector3.right, BlockScale, groundLayer)) GenerateRightSide();
if (!Physics.Raycast(currentBlock.position, Vector3.left, BlockScale, groundLayer)) GenerateLeftSide();
if (!Physics.Raycast(currentBlock.position, Vector3.forward, BlockScale, groundLayer)) GenerateFrontSide();
if (!Physics.Raycast(currentBlock.position, Vector3.back, BlockScale, groundLayer)) GenerateBackSide();
if (!Physics.Raycast(currentBlock.position, Vector3.up, BlockScale, groundLayer)) GenerateTopSide();
if (!Physics.Raycast(currentBlock.position, Vector3.down, BlockScale, groundLayer)) GenerateBottomSide();
}

private void GenerateRightSide()
{
verticies.Add(new Vector3(1, 0, 0));
verticies.Add(new Vector3(1, 1, 0));
verticies.Add(new Vector3(1, 0, 1));
verticies.Add(new Vector3(1, 1, 1));

AddLastVerticiesSquare();
}

private void GenerateLeftSide()
{
print("generate left side");
verticies.Add(new Vector3(0, 0, 0));
verticies.Add(new Vector3(0, 0, 1));
verticies.Add(new Vector3(0, 1, 0));
verticies.Add(new Vector3(0, 1, 1));

AddLastVerticiesSquare();
}

private void GenerateFrontSide()
{
verticies.Add(new Vector3(0, 0, 1));
verticies.Add(new Vector3(1, 0, 1));
verticies.Add(new Vector3(0, 1, 1));
verticies.Add(new Vector3(1, 1, 1));

AddLastVerticiesSquare();
}

private void GenerateBackSide()
{
verticies.Add(new Vector3(0, 0, 0));
verticies.Add(new Vector3(0, 1, 0));
verticies.Add(new Vector3(1, 0, 0));
verticies.Add(new Vector3(1, 1, 0));

AddLastVerticiesSquare();
}

private void GenerateTopSide()
{
verticies.Add(new Vector3(0, 1, 0));
verticies.Add(new Vector3(0, 1, 1));
verticies.Add(new Vector3(1, 1, 0));
verticies.Add(new Vector3(1, 1, 1));

AddLastVerticiesSquare();
}

private void GenerateBottomSide()
{
verticies.Add(new Vector3(0, 0, 0));
verticies.Add(new Vector3(1, 0, 0));
verticies.Add(new Vector3(0, 0, 1));
verticies.Add(new Vector3(1, 0, 1));

AddLastVerticiesSquare();
}

private void AddLastVerticiesSquare()
{

uvs.Add(new Vector2(0, 0));
uvs.Add(new Vector2(0, 1));
uvs.Add(new Vector2(1, 0));
uvs.Add(new Vector2(1, 1));

triangles.Add(verticies.Count - 4);
triangles.Add(verticies.Count - 3);
triangles.Add(verticies.Count - 2);

triangles.Add(verticies.Count - 3);
triangles.Add(verticies.Count - 1);
triangles.Add(verticies.Count - 2);
}
}
< /code>
Почему визуальная сетка отображается в другой позиции, чем его коллайдер после выпечки, когда они оба используют одни и те же сетки? Что может вызвать это позиционное несоответствие между визуализированной сеткой и сеткой столкновения? src = "https://i.sstatic.net/9qsempok.png"/>


Подробнее здесь: https://stackoverflow.com/questions/796 ... ition-afte
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Unity 6: Box Collider движется, но тело остается на месте
    Anonymous » » в форуме C#
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Unity 6: Box Collider движется, но тело остается на месте
    Anonymous » » в форуме C#
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Сортируемый JQuery - извлекает позицию элементов из базы данных и помещает каждый элемент в свою собственную позицию при
    Гость » » в форуме Jquery
    0 Ответы
    98 Просмотры
    Последнее сообщение Гость
  • Bootstrap Toolp в неправильном положении при начальном падении, затем в правильном положении
    Anonymous » » в форуме Html
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Bootstrap Toolp в неправильном положении при начальном падении, затем в правильном положении
    Anonymous » » в форуме CSS
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»