动态生成关卡预览缩略图_002

最近做的一个2D小游戏,游戏的关卡选择界面,需要将关卡内容做成缩略图显示在关卡选择图标上面。

随便百度的一个关卡选择界面,图一,游戏界面,图二,现需将游戏界面的内容,以缩略图的形式显示在关卡选择界面对应的图标
动态生成关卡预览缩略图动态生成关卡预览缩略图

  1. 记录需要预览的关卡
  2. 利用协程 依次生成预览场景,避免在某一帧做大量计算
  3. 相机获取预览场景缩略图
  4. 关卡图标赋值,显示缩略图
  5. 显示下一个关卡图标

主要代码如下,附注释,其余代码可以及场景设置,可以下载项目查看:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PreviewManager : MonoBehaviour
{
    public static PreviewManager Instance;
    // 预览场景,并不是Scene,这里指Scene里,所有需要在缩略图中预览的GameObject
    //保存待生成预览图的信息队列
    Dictionary<int, RawImage> toShowDic = new Dictionary<int, RawImage>();
    //保存已生成的预览图,第二次直接获取,不再生成
    Dictionary<int, Texture2D> textureDic = new Dictionary<int, Texture2D>();
    //预览场景相机
    Camera previewCamera;
    //生成预览场景的方法,可由外界传入
    System.Action<int> showPreviewMapFunc;
    //默认图
    Texture2D defaultTexture;
    void Awake()
    {
        Instance = this;
    }
    public void Init(Camera previewUseCamera, Texture2D defaultTexture2D, System.Action<int> action)
    {
        previewCamera = previewUseCamera;
        defaultTexture = defaultTexture2D;
        showPreviewMapFunc = action;
    }
    /// <summary>
    /// Sets the texture by level.
    /// </summary>
    /// <param name="level">Stage level.</param>
    /// <param name="iconImage">Icon image.</param>
    public void SetTextureByLevel(int level, RawImage iconImage)
    {
        if (textureDic.ContainsKey(level))
        {
            //若预览图已经生成,直接赋值
            iconImage.texture = textureDic[level];
        }
        else//先显示默认图
            iconImage.texture = defaultTexture;
            //若预览图没有生成,生成并赋值
            StopAllCoroutines();
            toShowDic.Add(level, iconImage);
            StartCoroutine(ShowAllMap());
        }
    }
    //生成所有预览图
    IEnumerator ShowAllMap()
    {
        while (toShowDic.Count > 0)
        {
            yield return StartCoroutine(ShowOneMap());
            //可在此设置间隔时间,增加下个预览图出现的时间,调节整体效果
            //yield return new WaitForSeconds(0.5f);
        }
    }
    //生成一个预览图
    IEnumerator ShowOneMap()
    {            
        //获取待生成队列字典中第一组数据
        int stageLevel = 0;
        RawImage rawImage = null;
        foreach (var item in toShowDic)
        {
            stageLevel = item.Key;
            rawImage = item.Value;
            break;
        }
        if (rawImage == null)
            yield break;
        //动态生成预览场景
        if (showPreviewMapFunc != null)
            showPreviewMapFunc(stageLevel);
        else
        {
            rawImage.texture = defaultTexture;
            yield break;
        }
        //等待一帧
        yield return new WaitForEndOfFrame();
        //RenderTexture接收渲染相机结果
        RenderTexture renderTexture = new RenderTexture(200, 200, 16);
        previewCamera.targetTexture = renderTexture;
        previewCamera.Render();
        //从RenderTexture获取Texture2D,将RenderTexture从GPU拷贝到CPU
        RenderTexture.active = renderTexture;
        Texture2D texture2D = new Texture2D(200, 200);
        texture2D.ReadPixels(new Rect(0, 0, texture2D.width, texture2D.height), 0, 0);
        texture2D.Apply();
        //对目标图片赋值
        rawImage.texture = texture2D;
        //添加到字典,下次需要获取texture2D时,可直接通过字典获取,只会生成一次
        textureDic.Add(stageLevel, texture2D);
        //移出待生成队列字典
        toShowDic.Remove(stageLevel);
        //等待一帧
        yield return new WaitForEndOfFrame();
    }
}

链接:https://pan.baidu.com/s/12Up_x4h4_xYHUPHOWKpI5g 密码:9z4n

猜你喜欢

转载自blog.csdn.net/qq_39108767/article/details/81544367