如何在非GUI元素中使用"9切片"图像类型?

Dis*_*tor 5 textures unity-game-engine

在我的游戏中,我在四边形上使用简单的纹理.我可以看到统一的GUI让我们通过设置"图像类型"选项,切片图像切片.

我想对我在四边形中使用的其他纹理做同样的事情.

简单来说,我不希望在缩放纹理本身时缩放纹理的边缘.

谢谢.

Krz*_*rko 5

看起来你必须自己生成网格,而不是听起来那么难.网格必须如下所示:

在四边形上的9切片

每个纹理网格由顶点(图片上的红点)定义,并且(在这种情况下)每个顶点都有两个参数:

  1. A Vector3与位置.仅xy这里所使用的,作为四是平坦的(因此,z= 0).
  2. A Vector2与UV,即材料放在网格上的方式.这是纹理坐标:uv.

为了配置这个网格,我添加了参数:

b- 对于边框 - 游戏对象的边框有多大(以3d为单位)
w,h- 对于游戏对象的宽度和高度(以3d为单位)
m- 图像中的边距有多大(浮动0f到0.5f)

如何在Unity3d中执行此操作:

  1. 创建一个GameObject,添加一个MeshRenderer包含所需材料的空白MeshFilter.
  2. 添加一个创建网格的脚本.看看Unity3d文档的Mesh,第一个例子.

请注意,对于unity3d,您必须使用三角形而不是四边形创建它(因此对于每个四边形创建两个三角形).


Aer*_*ion 5

查尼巴尔的解决方案对我来说就像一个魅力,但由于我不是这方面的专家,所以实现它对我来说并不简单。我将把这段代码放在这里,以防有人发现它有用。

using UnityEngine;

public class SlicedMesh : MonoBehaviour
{
    private float _b = 0.1f;
    public float Border
    {
        get
        {
            return _b;
        }
        set
        {
            _b = value;
            CreateSlicedMesh();
        }
    }

    private float _w = 1.0f;
    public float Width
    {
        get
        {
            return _w;
        }
        set
        {
            _w = value;
            CreateSlicedMesh();
        }
    }

    private float _h = 1.0f;
    public float Height
    {
        get
        {
            return _h;
        }
        set
        {
            _h = value;
            CreateSlicedMesh();
        }
    }

    private float _m = 0.4f;
    public float Margin
    {
        get
        {
            return _m;
        }
        set
        {
            _m = value;
            CreateSlicedMesh();
        }
    }

    void Start() 
    {

        CreateSlicedMesh();
    }

    void CreateSlicedMesh()
    {
        Mesh mesh = new Mesh();
        GetComponent<MeshFilter>().mesh = mesh;

        mesh.vertices = new Vector3[] {
            new Vector3(0, 0, 0), new Vector3(_b, 0, 0), new Vector3(_w-_b, 0, 0), new Vector3(_w, 0, 0),
            new Vector3(0, _b, 0), new Vector3(_b, _b, 0), new Vector3(_w-_b, _b, 0), new Vector3(_w, _b, 0),
            new Vector3(0, _h-_b, 0), new Vector3(_b, _h-_b, 0), new Vector3(_w-_b, _h-_b, 0), new Vector3(_w, _h-_b, 0),
            new Vector3(0, _h, 0), new Vector3(_b, _h, 0), new Vector3(_w-_b, _h, 0), new Vector3(_w, _h, 0)
        };

        mesh.uv = new Vector2[] {
            new Vector2(0, 0), new Vector2(_m, 0), new Vector2(1-_m, 0), new Vector2(1, 0),
            new Vector2(0, _m), new Vector2(_m, _m), new Vector2(1-_m, _m), new Vector2(1, _m),
            new Vector2(0, 1-_m), new Vector2(_m, 1-_m), new Vector2(1-_m, 1-_m), new Vector2(1, 1-_m),
            new Vector2(0, 1), new Vector2(_m, 1), new Vector2(1-_m, 1), new Vector2(1, 1)
        };

        mesh.triangles = new int[] {
            0, 4, 5,
            0, 5, 1,
            1, 5, 6,
            1, 6, 2,
            2, 6, 7,
            2, 7, 3,
            4, 8, 9,
            4, 9, 5, 
            5, 9, 10,
            5, 10, 6,
            6, 10, 11,
            6, 11, 7,
            8, 12, 13,
            8, 13, 9,
            9, 13, 14,
            9, 14, 10,
            10, 14, 15,
            10, 15, 11
        };
    }
}
Run Code Online (Sandbox Code Playgroud)