Моделлер лезет в 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ец
 
Сообщения: 8
Зарегистрирован: 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
Адепт
 
Сообщения: 7990
Зарегистрирован: 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ец
 
Сообщения: 8
Зарегистрирован: 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
Старожил
 
Сообщения: 624
Зарегистрирован: 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ец
 
Сообщения: 8
Зарегистрирован: 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
Старожил
 
Сообщения: 624
Зарегистрирован: 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ец
 
Сообщения: 8
Зарегистрирован: 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ец
 
Сообщения: 8
Зарегистрирован: 13 авг 2019, 00:04

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

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

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

File.ReadAllLines

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

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

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

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

File.ReadAllLines

А вот теперь тоже самое на мобилках, или других каких платформах. Да даже на винде - какой путь у пользователя укажешь?
Ну хотя бы persistentDataPath или streamingAssetsPath упомянул.
А так - все будет работать только у разработчика...

Написал вот так, в самом Unity всё работает, но при запуске на смартфоне, факты не "цепляются из файла", просто пустое поле. Текстовые файлы лежат в папке Assets/Resources.
Синтаксис:
Используется csharp
 public Text text; // поле вывода
    private List<string> list;
    int r;//номер факта
    public GameObject next;//кнопка след. факта  
 
    public void Start()
    {
           list = File.ReadAllLines(Application.dataPath + "/resources/airplane_f.txt").ToList();
       // Debug.Log($"В файле найдено строк {list.Count} строк");
        GenerateFacts();
    }

   
    public void GenerateFacts()
    {
        if (list.Count > 0)//Если в листе есть факты то...
        {
            r = Random.Range(0, list.Count);// случайное число от 0 до кол-ва фактов
            text.text = list[r];
            list.RemoveAt(r);//удаляем факт
            //Debug.Log($"вы нажали на кнопку, осталось {list.Count} фактов");

        }
                else
        {
            next.SetActive(false);
            text.text = "Пока что на этом всё";
          //  Debug.Log("факты закончились, кнопка выключена");
        }
       
    }

    public void close()// кнопка выход в меню
    {
        SceneManager.LoadScene("categories");
    }
raz-beg
UNец
 
Сообщения: 8
Зарегистрирован: 13 авг 2019, 00:04

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

Сообщение VladikDEV 19 авг 2019, 15:42

текстовый файл на самом деле не там лежит
https://docs.unity3d.com/ScriptReference/Resources.Load.html
VladikDEV
UNIт
 
Сообщения: 68
Зарегистрирован: 24 май 2016, 13:45
Откуда: Минск

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

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

VladikDEV писал(а):текстовый файл на самом деле не там лежит
https://docs.unity3d.com/ScriptReference/Resources.Load.html

Спасибо за ответ. Но, как теперь загрузить строки файла в лист?
raz-beg
UNец
 
Сообщения: 8
Зарегистрирован: 13 авг 2019, 00:04

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

Сообщение seaman 19 авг 2019, 21:36

Вы вообще ходили по ссылкам в моем первом ответе?
К Resources.Load - уже вернулись. Слава богу неверный ответ Saltant остался позади. Осталось пройти по ссылке и почитать как построчно его прочитать.
https://docs.microsoft.com/ru-ru/dotnet ... -at-a-time
seaman
Адепт
 
Сообщения: 7990
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

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

Сообщение raz-beg 22 авг 2019, 01:41

seaman писал(а):Вы вообще ходили по ссылкам в моем первом ответе?
К Resources.Load - уже вернулись. Слава богу неверный ответ Saltant остался позади. Осталось пройти по ссылке и почитать как построчно его прочитать.
https://docs.microsoft.com/ru-ru/dotnet ... -at-a-time

Реализовал задумку вот таким вот образом.
Синтаксис:
Используется csharp
 public Text text; // поле вывода
    private List<string> list;
    int r;//номер факта
    public GameObject next;//кнопка след. факта  

    private void Start()
    {
        var textFile = Resources.Load<TextAsset>("facts");
        list = new List<string>(textFile.text.Split('\n'));
        // Debug.Log($"В файле найдено строк {list.Count} строк");
        GenerateFacts();

    }

    public void GenerateFacts()
    {
        if (list.Count > 0)//Если в листе есть факты то...
        {
            r = Random.Range(0, list.Count);// случайное число от 0 до кол-ва фактов
            text.text = list[r];
            list.RemoveAt(r);//удаляем факт
                        //Debug.Log($"вы нажали на кнопку, осталось {list.Count} фактов");
        }
        else
        {
            next.SetActive(false);
            text.text = "Пока что на этом всё";
            //Debug.Log("факты закончились, кнопка выключена");
        }

    }
 
raz-beg
UNец
 
Сообщения: 8
Зарегистрирован: 13 авг 2019, 00:04


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

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

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