You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免游戏会话中随机图片展示脚本重复显示同一图片?

解决Unity会话内图片不重复展示的问题

嘿,这个问题很好解决!核心思路就是在当前游戏会话里维护一个「还没展示过的图片」列表,每次选完就把图片从这个列表里删掉,这样就不会重复选到了,等所有图片都轮完再重置列表就行。

咱们一步步改你的代码:

首先,在脚本的私有变量区域加一个列表,用来存当前可用的图片:

// 用来跟踪当前会话中还没展示过的图片
private List<Sprite> _availableMemes;

然后在Start()方法里初始化这个列表,把原始的memeImg列表内容复制进去:

void Start () {
    // 初始化可用图片列表,复制原始列表的所有内容
    _availableMemes = new List<Sprite>(memeImg);
    // 启动随机事件协程
    StartCoroutine(RandomReportEvent());
}

接下来修改你的showRandomImage()方法,改成从可用列表里选图片,选完就移除:

void showRandomImage(){
    // 检查可用列表是否为空,如果空了就重新填充(相当于一轮展示完,重新开始)
    if (_availableMemes.Count == 0) {
        _availableMemes = new List<Sprite>(memeImg);
    }

    // 从可用列表里随机选一个索引
    int randomIndex = Random.Range(0, _availableMemes.Count);
    // 给SpriteRenderer赋值选中的图片
    sr.sprite = _availableMemes[randomIndex];
    // 把这张图片从可用列表里删掉,以后就不会再选到它了
    _availableMemes.RemoveAt(randomIndex);
}

对了,我注意到你的RandomReportEvent()协程现在只执行一次,应该让它循环起来才对,不然只会显示一次图片。所以给协程加个无限循环:

IEnumerator RandomReportEvent(){
    // 无限循环执行随机事件
    while (true) {
        float wait_time = Random.Range (53.5F, 361.2f);
        // 等待随机时长
        yield return new WaitForSeconds(wait_time);
        
        memeWindow.SetActive (true);
        
        // 生成并格式化报告数值
        float reportValue = Random.Range (1.2F, 57.8F);
        reportValue = Mathf.Round(reportValue * 100f) / 100f;
        randomReportValue.text = string.Format ("<color=#FF8400FF>{0}K</color>", reportValue);
        
        // 展示随机图片(现在不会重复了)
        showRandomImage();
    }
}

这样修改后,在当前游戏运行的会话里,每张图片都会被展示一次,直到所有图片都用完才会重新开始新一轮的随机展示,完全不会出现重复的情况。

如果你的memeImg是数组类型而不是List<Sprite>,那初始化可用列表的时候需要加个ToList()转换,记得在脚本顶部引入using System.Linq;就行。

内容的提问来源于stack exchange,提问作者Arthur Belkin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:11:25