基于UNITY3D的照片墙演示项目技术分享

unity实现超大图片墙演示,由于拥有海量图片,使用了CPU 多线程,unity dots技术,图片组成文字部分,使用了点阵图技术,提取文字像素。

(关于点阵介绍)

点阵字体是把每一个字符都分成16×16或24×24个点,然后用每个点的虚实来表示字符的轮廓。点阵字体也叫位图字体,其中每个字形都以一组二维像素信息表示。

可私信联系

unity dots 图片墙,大量图片组成文字,点阵字体实现



核心(文字组成图片)

点阵图核心代码

void RenderImageAsPixels()

{

// 获取图片的宽度和高度

int width = imageTexture.width;

int height = imageTexture.height;

    // 获取图片的所有像素
    Color[] pixels = imageTexture.GetPixels();

    // 创建一个父物体来容纳所有的像素点
    GameObject pixelParent = gameObject;
    //  pixelParent.transform.SetParent(transform, false);
    var textures_Length = textures.Length;
    // 遍历每个像素
    int count = 0;
   // List<RectTransform[]> rectTransforms = new List<RectTransform[]>();
    for (int y = 0; y < height; y+= jumpStep)
    {
       // rectTransforms.Add(new RectTransform[width]);
        for (int x = 0; x < width; x += jumpStep)
        {
            // 获取当前像素的颜色
            Color pixelColor = pixels[y * width + x];

            // 如果是黑色像素(可以根据需要调整颜色条件)
            if (pixelColor == Color.black)
            {
                // 创建一个像素点并设置其位置和尺寸
                RawImage pixelImage = Instantiate(pixelPrefab, pixelParent.transform);
                RectTransform rectTransform = pixelImage.GetComponent<RectTransform>();
                pixelImage.texture = textures[Random.Range(0, textures_Length)];
                // 设置像素点的位置,考虑到间隔
                float posX = x * (pixelSize + spacing);
                float posY = y * (pixelSize + spacing);

                rectTransform.anchoredPosition = new Vector2(posX, posY)+ offset;
              
                rectTransform.sizeDelta = new Vector2(pixelSize, pixelSize);
                
                rectTransform.anchoredPosition *= size;
                var d= Random.Range(textrue_size.x, textrue_size.y);
                rectTransform.sizeDelta  =new Vector2(d,d);

                StartCoroutine(move_image2(rectTransform, count));
                count++;
              //  rectTransforms[0][0] = rectTransform;


            }
        }
    }
}