Единство изменить размер куба сетки - PullRequest
0 голосов
/ 27 ноября 2018

Есть ли в Unity методы для изменения ширины, высоты и глубины сетки?Я знаю, что был бы способ изменить вершины сетки.Например, вершина A = -5,0,0 и вершина B = 5,0,0, поэтому длина будет равна 10. Но это сложный путь.Это простой способ?

Я пытался сделать:

lorry.GetComponent<MeshFilter>().mesh.bounds.size.Set(1000F, 200F, 200F);

, но ничего не изменилось.Я даже не понимаю, зачем это bound.size.set(), потому что, когда я звоню Debug.Log(lorry.GetComponent<MeshFilter>().mesh.bounds.size);, он возвращает (1,1,1)

Я пытался позвонить

lorry.GetComponent<MeshFilter>().mesh.RecalculateBounds();

Но результат тот же.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Хорошо, похоже, Unity не предоставляет простого способа изменить размер меша.Поэтому я сделал расширение:

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

public static class Extensions {
    public static void recalculateMeshByBounds(this Mesh mesh, Vector3 dimensions) {

        mesh.Clear();

        float length = dimensions.x / 2;
        float height = dimensions.y / 2;
        float width  = dimensions.z / 2;

        #region Vertices
        Vector3 p0 = new Vector3(-length, -width,  height);
        Vector3 p1 = new Vector3( length, -width,  height);
        Vector3 p2 = new Vector3( length, -width, -height);
        Vector3 p3 = new Vector3(-length, -width, -height);

        Vector3 p4 = new Vector3(-length, width,  height);
        Vector3 p5 = new Vector3( length, width,  height);
        Vector3 p6 = new Vector3( length, width, -height);
        Vector3 p7 = new Vector3(-length, width, -height);

        Vector3[] vertices = new Vector3[]
        {
            // Bottom
            p0, p1, p2, p3,

            // Left
            p7, p4, p0, p3,

            // Front
            p4, p5, p1, p0,

            // Back
            p6, p7, p3, p2,

            // Right
            p5, p6, p2, p1,

            // Top
            p7, p6, p5, p4
        };
        #endregion

        #region Normales
        Vector3 up = Vector3.up;
        Vector3 down = Vector3.down;
        Vector3 front = Vector3.forward;
        Vector3 back = Vector3.back;
        Vector3 left = Vector3.left;
        Vector3 right = Vector3.right;

        Vector3[] normales = new Vector3[]
        {
            // Bottom
            down, down, down, down,

            // Left
            left, left, left, left,

            // Front
            front, front, front, front,

            // Back
            back, back, back, back,

            // Right
            right, right, right, right,

            // Top
            up, up, up, up
        };
        #endregion

        #region UVs
        Vector2 _00 = new Vector2(0f, 0f);
        Vector2 _10 = new Vector2(1f, 0f);
        Vector2 _01 = new Vector2(0f, 1f);
        Vector2 _11 = new Vector2(1f, 1f);

        Vector2[] uvs = new Vector2[]
        {
            // Bottom
            _11, _01, _00, _10,

            // Left
            _11, _01, _00, _10,

            // Front
            _11, _01, _00, _10,

            // Back
            _11, _01, _00, _10,

            // Right
            _11, _01, _00, _10,

            // Top
            _11, _01, _00, _10,
        };
        #endregion

        #region Triangles
        int[] triangles = new int[]
        {
            // Bottom
            3, 1, 0,
            3, 2, 1,            

            // Left
            3 + 4 * 1, 1 + 4 * 1, 0 + 4 * 1,
            3 + 4 * 1, 2 + 4 * 1, 1 + 4 * 1,

            // Front
            3 + 4 * 2, 1 + 4 * 2, 0 + 4 * 2,
            3 + 4 * 2, 2 + 4 * 2, 1 + 4 * 2,

            // Back
            3 + 4 * 3, 1 + 4 * 3, 0 + 4 * 3,
            3 + 4 * 3, 2 + 4 * 3, 1 + 4 * 3,

            // Right
            3 + 4 * 4, 1 + 4 * 4, 0 + 4 * 4,
            3 + 4 * 4, 2 + 4 * 4, 1 + 4 * 4,

            // Top
            3 + 4 * 5, 1 + 4 * 5, 0 + 4 * 5,
            3 + 4 * 5, 2 + 4 * 5, 1 + 4 * 5,

        };
        #endregion

        mesh.vertices = vertices;
        mesh.normals = normales;
        mesh.uv = uvs;
        mesh.triangles = triangles;

        mesh.RecalculateBounds();
        mesh.MarkDynamic();


    }
}

Использование: Добавить примитив Box к сцене.Создайте сценарий и перетащите в поле:

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

[ExecuteInEditMode]
public class Box: MonoBehaviour
{
    public Vector3 dimensions;   

    private void Start()
    {

        this.GetComponent<MeshFilter>().sharedMesh.recalculateMeshByBounds(dimensions);
    }

    private void Update()
    {

    }
}

И теперь вы можете получить доступ к измерениям Vector3 dimensions(length, height, width). И когда вы меняете значения, векторы вершины также меняются.Может быть, есть лучший способ, но до сих пор я нашел самый простой способ для меня.

0 голосов
/ 27 ноября 2018

Если вы хотите изменить размер игрового объекта во время выполнения, вы можете изменить масштаб.Например, чтобы удвоить размер GameObject:

transform.localScale = new Vector3(2F, 2F, 2F);

Правка на основе вашего комментария:

Дело в том, что я хочу создать коробку, похожую на контейнер.И я должен добавить коробки с различными размерами в нем.И мне нужно проверить, не выходят ли границы ящика за пределы контейнера.

Для этого вас может заинтересовать использование коллайдера, для которого не требуется сетка.Тогда вы можете установить размер коллайдера следующим образом:

BoxCollider boxCol;

void Awake(){
    boxCol = otherGameObject.GetComponent<BoxCollider>();
}

void Start(){
    //Here you set the size of the collider
    boxCol.size = new Vector3(2,2,2);
}
...