Почему переменная currentValue никогда не равна 100? - PullRequest
0 голосов
/ 13 июля 2020

Переменная '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

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Поскольку 'i' начинается с 0 и есть 100 файлов, получается 99, но почему тогда радиальное изображение показывает 100%? Это потому, что 100 * (99 + 1) / 100 = 100.

Я думаю, вы можете избавиться от этого оператора if и просто иметь:

public IEnumerator ProcessImages(FileInfo[] fileInfos)
{
    var output = new Texture2D[fileInfos.Length];
    LoadingText.SetActive(true);

    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);
        }
        
        currentValue = 100 * (i + 1) / fileInfos.Length;
        ProgressIndicator.text = ((int)currentValue).ToString() + "%";            

        LoadingBar.fillAmount = currentValue / 100;

        currentFrameIndex = i;

        yield return null;
    }

    LoadingText.SetActive(false);
    ProgressIndicator.text = "Done";

    imagesLoaded = true;
}
1 голос
/ 13 июля 2020

если длина равна 100 и я должен быть <100, он остановится на 99. используйте <=, чтобы добраться до 100, НО (!!) напоминайте, что массив размером 100 будет начинаться с 0 и заканчиваться на 99, ничего нет в позиции 100 .... </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...