using UnityEngine; using System.Collections.Generic; using System; using System.Runtime.InteropServices; public class TiledTextureReceiver : MonoBehaviour { public Material targetMaterial; // 目标材质 // [DllImport("__Internal")] // private static extern void DisableKeyboardInput(); void Start() { if (targetMaterial == null) { Debug.LogError("请设置目标材质!"); return; } // DisableKeyboardInput(); } public void ReceiveTiledTextureInfo(string jsonString) { Debug.Log("Received: " + jsonString); try { TiledTextureInfo info = JsonUtility.FromJson(jsonString); GenerateTiledTexture(info); } catch (Exception e) { Debug.LogError("Error parsing JSON: " + e.Message); } } void GenerateTiledTexture(TiledTextureInfo info) { List tileTextures = new List(); foreach (string base64String in info.tileBase64Strings) { byte[] bytes = Convert.FromBase64String(base64String); Texture2D texture = new Texture2D(2, 2); // 创建一个临时纹理 texture.LoadImage(bytes); tileTextures.Add(texture); } if (tileTextures.Count == 0) { Debug.LogError("No tile textures received."); return; } int tileWidth = tileTextures[0].width; int tileHeight = tileTextures[0].height; int targetWidth = tileWidth * info.tileCols; int targetHeight = tileHeight * info.tileRows; Texture2D targetTexture = new Texture2D(targetWidth, targetHeight); for (int row = 0; row < info.tileRows; row++) { for (int col = 0; col < info.tileCols; col++) { int x = col * tileWidth; int y = row * tileHeight; Texture2D currentTile = tileTextures[(row * info.tileCols + col) % tileTextures.Count]; for (int i = 0; i < tileWidth; i++) { for (int j = 0; j < tileHeight; j++) { targetTexture.SetPixel(x + i, y + j, currentTile.GetPixel(i, j)); } } } } targetTexture.Apply(); targetMaterial.mainTexture = targetTexture; // 清理临时纹理 foreach (var texture in tileTextures) { Destroy(texture); } } } [Serializable] public class TiledTextureInfo { public List tileBase64Strings; public int tileRows; public int tileCols; }