using UnityEngine;
using System.Collections.Generic;
using System;
public class WorldBaker : MonoBehaviour
{
[SerializeField] private List<GameObject> blocksToBake = new List<GameObject>();
[SerializeField] private LayerMask groundLayer;
const float BlockScale = 1;
private Mesh cubeMesh;
private Transform currentBlock;
private List<Vector3> verticies = new List<Vector3>();
private List<Vector2> uvs = new List<Vector2>();
private List<int> triangles = new List<int>();
[ContextMenu("Bake World")]
public void BakeWorld()
{
foreach (var item in blocksToBake)
{
currentBlock = item.transform;
cubeMesh = new Mesh();
// Удаляем существующий Collider (если есть)
Collider existingCollider = currentBlock.gameObject.GetComponent<Collider>();
if (existingCollider != null)
{
UnityEngine.Object.DestroyImmediate(existingCollider);
}
currentBlock.gameObject.AddComponent<MeshCollider>();
RemakeMesh();
MeshFilter meshFilter = item.GetComponent<MeshFilter>();
meshFilter.sharedMesh = cubeMesh;
meshFilter.transform.position = currentBlock.position; // Устанавливаем позицию меша равной позиции блока
}
print("baked and combined");
}
private void RemakeMesh()
{
verticies.Clear();
uvs.Clear();
triangles.Clear();
RemakeBlock();
cubeMesh.triangles = Array.Empty<int>();
cubeMesh.vertices = verticies.ToArray();
cubeMesh.uv = uvs.ToArray();
cubeMesh.triangles = triangles.ToArray();
cubeMesh.Optimize();
cubeMesh.RecalculateNormals();
cubeMesh.RecalculateBounds();
currentBlock.GetComponent<MeshCollider>().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()
{
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);
}
}