Моделлер лезет в Unity. Прошу помочь. Из файла в List.

Программирование на Юнити.

Моделлер лезет в Unity. Прошу помочь. Из файла в List.

Сообщение raz-beg 13 авг 2019, 00:30

Решил сделать первую в жизни программку, проще не бывает. Суть выдавать интересные факты. Есть множество категорий, выбираешь любую и тебе выдаёт по одному интересному факту, клавишей вперед просто пролистываешь факты. Так вот, фактов огромное множество. Насмотрелся ТУТОРИОЛОВ (popcorn) с ютуба и вроде получилось, только вот одно НО, каждый факт нужно забивать вручную с программы ~x( . Уже создал тьму текстовых файлов (*.txt), для каждой категории, по одному факту в строке т.е. тьма тьмущая строк. И вот наконец таки вопрос, как организовать считывание этих строк в массив и далее перемешивание фактов, вывод их в окно текста и удаление уже просмотренных???(Один *.txt файл для одной сцены т.е. категории, так что нужно просто один файл считать, остальные сцены сделаю подобно этой [unity 3D] ).
Код:
Синтаксис:
Используется csharp
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class airplane_script : MonoBehaviour
{
    public FactList[] facts;
    public Text ftext;
    List<object> fList;
    int randF;
    public GameObject next;
    private void OnLevelWasLoaded() //
    {
        fList = new List<object>(facts);
        factsgenerate();
       
    }
    void factsgenerate()
    {
        if (fList.Count > 0)
        {
            randF = Random.Range(0, fList.Count);
            FactList crntF = fList[randF] as FactList;
            ftext.text = crntF.fact;
        }
        else
        {
            ftext.text = "потом придумаю";
            next.SetActive(false);
        }
    }
    public void nextbuttons()// Кнопка следующего факта
    {
        factsgenerate();//новый факт генерируется
        fList.RemoveAt(randF);//просмотренный удаляется

    }
    public void OnMouseUpAsButton() // Кнопка выхода меню
    {
        SceneManager.LoadScene("main");
    }
}
[System.Serializable]
public class FactList
{
    public string fact; //вот этот камень об который я бьюсь.
}
Последний раз редактировалось raz-beg 13 авг 2019, 19:04, всего редактировалось 1 раз.
raz-beg
UNец
 
Сообщения: 5
Зарегистрирован: 13 авг 2019, 00:04

Re: Моделлер лезет в Unity. Прошу помочь. Из файла в массив.

Сообщение seaman 13 авг 2019, 11:16

var textFile = Resources.Load<TextAsset>("Text/file01");
https://docs.unity3d.com/ScriptReferenc ... .Load.html
Получаем строку с содержимым: textGile.text и читаем построчно:
https://docs.microsoft.com/ru-ru/dotnet ... -at-a-time
seaman
Адепт
 
Сообщения: 7865
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Моделлер лезет в Unity. Прошу помочь. Из файла в массив.

Сообщение raz-beg 13 авг 2019, 13:34

seaman писал(а):var textFile = Resources.Load<TextAsset>("Text/file01");
https://docs.unity3d.com/ScriptReferenc ... .Load.html
Получаем строку с содержимым: textGile.text и читаем построчно:
https://docs.microsoft.com/ru-ru/dotnet ... -at-a-time

Ничего не понятно, но очень интересно. :-B
raz-beg
UNец
 
Сообщения: 5
Зарегистрирован: 13 авг 2019, 00:04

Re: Моделлер лезет в Unity. Прошу помочь. Из файла в массив.

Сообщение AngryCat 13 авг 2019, 13:43

Просто передаешь полный путь до файла и все. Факты заполняются из файла.
Синтаксис:
Используется csharp
using System.IO;
...
public void FactLoad(string path){
    facts = File.ReadAllLines(path);
}
Здесь могла бы быть ваша реклама.
Аватара пользователя
AngryCat
Старожил
 
Сообщения: 595
Зарегистрирован: 20 июл 2018, 22:29
Skype: Дискорд - Флеш#4099

Re: Моделлер лезет в Unity. Прошу помочь. Из файла в массив.

Сообщение raz-beg 13 авг 2019, 16:15

AngryCat писал(а):Просто передаешь полный путь до файла и все. Факты заполняются из файла.
Синтаксис:
Используется csharp
using System.IO;
...
public void FactLoad(string path){
    facts = File.ReadAllLines(path);
}

Синтаксис:
Используется csharp
public Text ftext; // поле вывода
    public List<object> fList;//лист с фактами
    int randF;//номер факта
    public GameObject next;//кнопка след. факта  
    void OnLevelWasLoaded()
    {
        string[] facts = File.ReadAllLines("facts_airplane.txt");//Загрузка файла построчно в массив facts, как только запускается сцена
        fList = new List<Text>(); //!!!Как присвоить листу значения массива facts?!!!
        factsgenerate();              
    }
    void factsgenerate()
    {      
        if (fList.Count > 0)//Если в листе есть факты то...
        {
            randF = Random.Range(0, fList.Count);// случайное число от 0 до кол-ва фактов
                       //тут должен быть оператор выбора рандомного факта. !!!Чем здесь заполнить можно?!!!
            ftext.text = Rndfact;//текстовому окну присваиваем рандомный факт
        }
        else
        {
            ftext.text = "Пока что на этом всё";
            next.SetActive(false);//гасит кнопку
        }
    }
    public void nextbuttons()//кнопка далее
    {
        factsgenerate();
        fList.RemoveAt(randF);//удаляем факт

    }
    public void close()// кнопка выход в меню
    {
        SceneManager.LoadScene("categories");
    }
}

Что можно использовать для присвоения листу значений полученного массива и какой оператор можно использовать для выбора рандомного факта из листа?
Я понимаю, что логичнее сделать обработкой строк, и просто "цеплять" рандомные строки из массива и так же их удалять после использования. Но адекватного учебного материала я не нашел.+ нужно будет "переигрывать кнопку далее".(коменты для облегчения чтения)
raz-beg
UNец
 
Сообщения: 5
Зарегистрирован: 13 авг 2019, 00:04

Re: Моделлер лезет в Unity. Прошу помочь. Из файла в массив.

Сообщение AngryCat 13 авг 2019, 16:30

Зачем лист использовать??
Запонить нужно так
Синтаксис:
Используется csharp
randF = Random.Range(0, fList.Count);// случайное число от 0 до кол-ва
ftext.text = fList[randF].fact;//текстовому окну присваиваем рандомный факт
 
Здесь могла бы быть ваша реклама.
Аватара пользователя
AngryCat
Старожил
 
Сообщения: 595
Зарегистрирован: 20 июл 2018, 22:29
Skype: Дискорд - Флеш#4099

Re: Моделлер лезет в Unity. Прошу помочь. Из файла в массив.

Сообщение raz-beg 13 авг 2019, 16:46

AngryCat писал(а):Зачем лист использовать??
Запонить нужно так
Синтаксис:
Используется csharp
randF = Random.Range(0, fList.Count);// случайное число от 0 до кол-ва
ftext.text = fList[randF].fact;//текстовому окну присваиваем рандомный факт
 

Я понял, но это будет только выбор рандомного вопроса и так же из листа. Так я именно не могу понять, как листу присвоить строки из массива. Не судите строго, может я запутался. Но просто мой план действий:
1. Присвоить все значения массива, который мы вытащили из файла листу fList. И вот, как это сделать я не могу найти.
2. Использовать для отображения рандомного вопроса.
Синтаксис:
Используется csharp
randF = Random.Range(0, fList.Count);// случайное число от 0 до кол-ва
ftext.text = fList[randF].fact;//текстовому окну присваиваем рандомный факт
raz-beg
UNец
 
Сообщения: 5
Зарегистрирован: 13 авг 2019, 00:04

Re: Моделлер лезет в Unity. Прошу помочь. Из файла в массив.

Сообщение raz-beg 13 авг 2019, 17:47

seaman писал(а):var textFile = Resources.Load<TextAsset>("Text/file01");
https://docs.unity3d.com/ScriptReferenc ... .Load.html
Получаем строку с содержимым: textGile.text и читаем построчно:
https://docs.microsoft.com/ru-ru/dotnet ... -at-a-time

Написал так, вроде должно работать, но при запуске текстовое окно пустое.
Синтаксис:
Используется csharp
public Text ftext; // поле вывода
    List<string> flist;
    int randF;//номер факта
    public GameObject next;//кнопка след. факта  
   
    public void OnLevelWasLoaded()
    {
        flist = File.ReadAllLines("facts.txt").ToList();//Загрузка файла построчно в лист flist, как только запускается сцена
        factsgenerate();
    }
    public void factsgenerate()
    {      
        if (flist.Count > 0)//Если в листе есть факты то...
        {
            randF = Random.Range(0, flist.Count);// случайное число от 0 до кол-ва фактов
            ftext.text = flist[randF];//текстовому окну присваиваем рандомный факт
        }
        else
        {
            ftext.text = "Пока что на этом всё";
            next.SetActive(false);//гасит кнопку
        }
    }
    public void nextbuttons()//кнопка далее
    {
        factsgenerate();
        flist.RemoveAt(randF);//удаляем факт
    }
    public void close()// кнопка выход в меню
    {
        SceneManager.LoadScene("categories");
    }
}
raz-beg
UNец
 
Сообщения: 5
Зарегистрирован: 13 авг 2019, 00:04

Re: Моделлер лезет в Unity. Прошу помочь. Из файла в List.

Сообщение seaman 13 авг 2019, 22:25

Просто передаешь полный путь до файла и все.

File.ReadAllLines

А вот теперь тоже самое на мобилках, или других каких платформах. Да даже на винде - какой путь у пользователя укажешь?
Ну хотя бы persistentDataPath или streamingAssetsPath упомянул.
А так - все будет работать только у разработчика...
seaman
Адепт
 
Сообщения: 7865
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3