Переменная 'i' в l oop внутри метода IEnumerator ProcessImages получает значение 99 Я добавил переменную publi c int currentFrameIndex, чтобы увидеть подсчет 'i', и оно приближается к 99 Я добавил снимок экрана внизу.
но радиальное изображение индикатора выполнения достигает 100%, и поскольку 'i' равно 99, а не 100, переменная currentValue также никогда не достигает 100, поэтому флаг bool imagesLoaded никогда не имеет значения true.
Я мог бы поставить флаг в конце Coroutine, но это не дойдет до 100 в l oop.
Почему он не доходит до 100? Так как «i» начинается с 0 и есть 100 файлов, получается 99, но почему тогда радиальное изображение показывает 100%? И что я должен изменить, чтобы он достиг 100, чтобы флаг imagesLoaded был истинным? Или, может быть, мне лучше изменить его:
if (currentValue < 100)
На
if (currentValue < fileInfos.Length - 1)
Это сценарий:
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;
public class StreamVideo : MonoBehaviour
{
public Texture2D[] frames; // array of textures
public float framesPerSecond = 2.0f; // delay between frames
public RawImage image;
public int currentFrameIndex;
public GameObject LoadingText;
public Text ProgressIndicator;
public Image LoadingBar;
public float speed;
private float currentValue;
private FileInfo[] info;
private bool imagesLoaded = false;
void Start()
{
DirectoryInfo dir = new DirectoryInfo(@"C:\tmp");
// since you use ToLower() the capitalized version are quite redundant btw ;)
string[] extensions = new[] { ".jpg", ".jpeg", ".png" };
info = dir.GetFiles().Where(f => extensions.Contains(f.Extension.ToLower())).ToArray();
if (!image)
{
image = gameObject.GetComponent<RawImage>();
}
StartCoroutine(ProcessImages(info));
foreach (var frame in frames)
frame.Apply(true, true);
}
public IEnumerator ProcessImages(FileInfo[] fileInfos)
{
var output = new Texture2D[fileInfos.Length];
for (var i = 0; i < fileInfos.Length; i++)
{
var bytes = File.ReadAllBytes(fileInfos[i].FullName);
output[i] = new Texture2D(1, 1);
if (!ImageConversion.LoadImage((Texture2D)output[i], bytes, false))
{
UnityEngine.Debug.LogError($"Could not load image from {fileInfos.Length}!", this);
}
if (currentValue < 100)
{
currentValue = 100 * (i + 1) / fileInfos.Length;
ProgressIndicator.text = ((int)currentValue).ToString() + "%";
LoadingText.SetActive(true);
}
else
{
LoadingText.SetActive(false);
ProgressIndicator.text = "Done";
imagesLoaded = true;
}
LoadingBar.fillAmount = currentValue / 100;
currentFrameIndex = i;
yield return null;
}
}
private Texture2D[] GetTextures(FileInfo[] fileInfos)
{
var output = new Texture2D[fileInfos.Length];
for (var i = 0; i < fileInfos.Length; i++)
{
var bytes = File.ReadAllBytes(fileInfos[i].FullName);
output[i] = new Texture2D(1, 1);
if (!ImageConversion.LoadImage((Texture2D)output[i], bytes, false))
{
UnityEngine.Debug.LogError($"Could not load image from {fileInfos.Length}!", this);
}
}
return output;
}
void Update()
{
if (imagesLoaded == true)
{
int index = (int)(Time.time * framesPerSecond) % frames.Length;
image.texture = frames[index];
}
}
private void OnDestroy()
{
foreach (var frame in frames)
Destroy(frame);
}
}
Процент радиального изображения равен 100%, но i и currentFrameIndex равны 99