如何避免游戏会话中随机图片展示脚本重复显示同一图片?
解决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
相关产品推荐
相关产品推荐

