📜  tilemap 着色器 (1)

📅  最后修改于: 2023-12-03 15:35:20.053000             🧑  作者: Mango

Tilemap 着色器

Tilemap 着色器是一种用于在游戏中呈现平铺式背景和地图元素的着色器。它们通常用于模拟 2D 游戏中的地形和背景,同时也可用于创建类似马赛克和拼贴画的视觉效果。

使用方法

在 Unity 中,可以使用内置的 Tilemap 工具来创建平铺地图。创建 Tilemap 后,给 Tilemap 添加 Tilemap Renderer 组件,然后将着色器类型设置为 Tiles/Basic。

在代码中使用

如果您想在代码中使用 Tilemap 着色器,可以使用以下代码片段:

using UnityEngine;

public class TilemapShaderExample : MonoBehaviour
{
    public Material tilemapMaterial;

    private void Start()
    {
        // 创建一个 Plane 对象并将材质设置为 Tilemap 着色器材质
        GameObject plane = GameObject.CreatePrimitive(PrimitiveType.Plane);
        plane.GetComponent<MeshRenderer>().material = tilemapMaterial;
    }
}
自定义着色器

如果您想自定义 Tilemap 着色器,可以使用以下代码片段作为起点:

Shader "Custom/Tilemap" {
    Properties {
        _MainTex ("Texture", 2D) = "white" {}
        _Color ("Color", Color) = (1, 1, 1, 1)
        _TileSize ("Tile Size", Range(0, 1)) = 0.1
    }

    SubShader {
        Tags { "Queue"="Background" "RenderType"="Opaque" }

        Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
           
            // 定义顶点结构体
            struct appdata_full {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            // 定义顶点输出结构体
            struct v2f {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            // 顶点坐标变换函数
            v2f vert (appdata_full v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv * _TileSize;
                return o;
            }

            // 片段渲染函数
            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);
                return col * _Color;
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
}
自定义 Tileset

如果您想要自定义 Tileset,可以使用以下代码片段:

using UnityEngine;
using UnityEditor;

public class CustomTilesetWindow : EditorWindow
{
    private GameObject newTilesetObject;

    [MenuItem("Assets/Create/New Tileset")]
    public static void ShowWindow()
    {
        GetWindow<CustomTilesetWindow>();
    }

    private void OnGUI()
    {
        GUILayout.Label("Create a new Tileset", EditorStyles.boldLabel);

        EditorGUILayout.BeginHorizontal();
        GUILayout.Label("Tile Dimensions: ");
        int tileSize = EditorGUILayout.IntField(16);
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.Space(20);

        EditorGUILayout.BeginHorizontal();
        GUILayout.Label("Texture: ");
        Texture2D texture = (Texture2D)EditorGUILayout.ObjectField(null, typeof(Texture2D), false);
        EditorGUILayout.EndHorizontal();

        if (GUILayout.Button("Create New Tileset"))
        {
            if (texture != null)
            {
                // 创建新的 Tileset
                newTilesetObject = new GameObject("New Tileset");

                // 添加 Tilemap 组件
                Tilemap tilemap = newTilesetObject.AddComponent<Tilemap>();

                // 添加 Tileset 组件
                Tileset tileset = newTilesetObject.AddComponent<Tileset>();
                tileset.InitFromTexture(texture, tileSize);

                // 更新 Tilemap
                tilemap.UpdateTileset();
            }
        }

        if (newTilesetObject != null)
        {
            if (GUILayout.Button("Save"))
            {
                // 将 Tileset 保存到 Assets 目录
                AssetDatabase.CreateAsset(newTilesetObject.GetComponent<Tileset>(), "Assets/NewTileset.asset");
            }
        }

        if (GUILayout.Button("Close"))
        {
            Close();
        }
    }
}
总结

Tilemap 着色器是一种用于呈现平铺式背景和地图元素的强大工具,可以在游戏中创建出色的 2D 地图和背景。您可以使用内置的 Tilemap 工具来创建和编辑 Tilemap,也可以使用自定义着色器和 Tileset 来实现更高级的效果。希望这个介绍能够帮助您更好地理解 Tilemap 着色器的使用方法。