Вопрос по разблокировке уровня

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

Вопрос по разблокировке уровня

Сообщение MungoXP 27 авг 2011, 14:41

У меня есть меню. Я сделал:
"New Game
Set Level
Exit"

Когда я жму Set Level меня перебрасывает на другую сцену(использую Application.LoadLevel(n);).
В Set Level есть кнопки для перехода(Level 2, 3 ничего не прикреплено.):
"Level 1
Level 2
Level 3".
////Я использую скрипт
Синтаксис:
Используется javascript
var isl01Btn = false;

function OnMouseUp()
{
        if(isl01Btn)
        {
                Application.LoadLevel(7); ///7 - номер 1 уровня.

        }
}

 

-----
Когда я жму New Game начинается игра. И мне надо проходить уровни.
----

Внимание вопрос:
Как сделать, чтобы если я прохожу уровень 7, то Level 2 разблокировался и кнопка работала. Как я понимаю, надо прописывать в
Синтаксис:
Используется javascript
if(isl01Btn && "тут продолжение"
.
но я не знаю как. Помогите решить сию проблему.

Заранее благодарю.

P.S.: Просьба не отправлять меня на Player Prefs. Не смог разобраться.
MungoXP
UNIт
 
Сообщения: 94
Зарегистрирован: 19 апр 2011, 18:54

Re: Вопрос по разблокировке уровня

Сообщение [LUkARD] 27 авг 2011, 14:59

разве нельзя на геймобжект по весит скрипт с переменной и и донДестройОнЛоад?
Запиался на курс программирования + html!
Аватара пользователя
[LUkARD]
UNIт
 
Сообщения: 108
Зарегистрирован: 24 июн 2011, 19:37
Откуда: Оренбургская обл. г. Ясный

Re: Вопрос по разблокировке уровня

Сообщение MungoXP 27 авг 2011, 15:28

С этого места по подробнее... Я новичок, нельзя ли пояснить.
И сохранится ли все это после перезапуска игры?
MungoXP
UNIт
 
Сообщения: 94
Зарегистрирован: 19 апр 2011, 18:54

Re: Вопрос по разблокировке уровня

Сообщение [LUkARD] 27 авг 2011, 16:21

Ну я вижу все так:
для каждого уровня хранить переменую вида тру/фолс
И в скрипте добавить DontDestroyOnLoad(подробнее ищи в справке )
Повесит скрипт на пустой Game Object.
Насчет перезапуска это либо сохранение в реестр(вроде огасода о чем-то таком в своих уроках писал)
либо запись в xml/бинарник(а вот это я как реализовать не знаю, но вроде Неодроп создал запись в бинарник)
какой способ лучше я не знаю.
Это лично мое видение сего процесса
Если найдешь что путное в личку напиши ок? ;)
Запиался на курс программирования + html!
Аватара пользователя
[LUkARD]
UNIт
 
Сообщения: 108
Зарегистрирован: 24 июн 2011, 19:37
Откуда: Оренбургская обл. г. Ясный

Re: Вопрос по разблокировке уровня

Сообщение Denkacn 28 авг 2011, 19:03

1) В общем , в своей самой первой сцене создаёшь объект пустой , называешь его допустим "LevelMng".
2) На него кидаешь скрипт "levelMngScr" с таким содержанием:
Синтаксис:
Используется javascript
function Awake () {
    DontDestroyOnLoad (transform.gameObject);
}
 

3) После чего данный объект будут с тобой на протяжении всех твоих уровней)) То есть в него можно будет ввести переменные уровня и изменять их от уровня к уровню.
допустим так :
Синтаксис:
Используется javascript
static var level : int[];

function Start(){
        level = new int[10]; //Количество уровней
        level[0] = 1; // первому присваиваешь 1 так как он должен загружаться.
}
 

4) Потом по прохождению уровня добавляешь 1 к последующему уровню, например так descriptionOfLevels.level[Application.loadedLevel+1] = 1
5) А когда пользователь жмёт на кнопки считываешь переменную данного уровня если она равна 1 значит грузить если 0 то не грузить.
6) Дальше если вдруг нужно сохранять данные в файл что бы при следующей загрузки прогресс пользователя сохранился то кидаем на объект "LevelMng" данный скрипт с именем "slData":
Синтаксис:
Используется javascript
import System;
import System.Collections;
import System.Xml;
import System.Xml.Serialization;
import System.IO;
import System.Text;

// То что нужно сохранить в XMLe
class DemoData
{
        var level_00 : int;
        var level_01 : int;
        var level_02 : int;
        var level_03 : int;
}

// Класс XML
class UserData
{
        public var _iUser : DemoData = new DemoData();
        function UserData() { }
}
        static var onSave = false;
        static var onLoad = false;
        private var _Save : Rect;
              private var _Load : Rect;
        private var _SaveMSG : Rect;
        private var _LoadMSG : Rect;
        private var _FileLocation : String;
        private var _FileName : String = "SaveData.xml";
        private var myData : UserData;
        private var _data : String;
        private var VPosition : Vector3;

        function Awake () {
                        _Save=new Rect(10,80,200,40);
                        _Load=new Rect(10,140,200,40);
                        _SaveMSG=new Rect(10,120,200,40);
                        _LoadMSG=new Rect(10,140,200,40);
                        _FileLocation=Application.dataPath;
                        myData=new UserData();
                }              
                function Update () {
                        if (onLoad == true){
                                OnLoad();
                        }
                        if (onSave == true){
                                OnSave();
                        }      
                }
//Сохраняем           
                function OnSave(){
                        myData._iUser.level_00 = descriptionOfLevels.level[0];
                        myData._iUser.level_01 = descriptionOfLevels.level[1];
                        myData._iUser.level_02 = descriptionOfLevels.level[2];
                        myData._iUser.level_03 = descriptionOfLevels.level[3];
                        _data = SerializeObject(myData);
                              CreateXML();
                        onSave = false;
                }      

//Загружаем           
                function OnLoad(){
                        LoadXML();
                        if(_data.ToString() != "")
                        {
                                myData = DeserializeObject(_data);                             
                                descriptionOfLevels.level[0] = myData._iUser.level_00;
                                descriptionOfLevels.level[1] = myData._iUser.level_01;
                                descriptionOfLevels.level[2] = myData._iUser.level_02;
                                descriptionOfLevels.level[3] = myData._iUser.level_03;                         
                        }
                        onLoad = false;
                }
                function UTF8ByteArrayToString(characters : byte[] )
                {
                        var encoding : UTF8Encoding  = new UTF8Encoding();
                        var constructedString : String  = encoding.GetString(characters);
                        return (constructedString);
                }              
                function StringToUTF8ByteArray(pXmlString : String)
                {
                        var encoding : UTF8Encoding  = new UTF8Encoding();
                        var byteArray : byte[]  = encoding.GetBytes(pXmlString);
                        return byteArray;
                }

                function SerializeObject(pObject : Object)
                {
                        var XmlizedString : String  = null;
                        var memoryStream : MemoryStream  = new MemoryStream();
                        var xs : XmlSerializer = new XmlSerializer(typeof(UserData));
                        var xmlTextWriter : XmlTextWriter  = new XmlTextWriter(memoryStream, Encoding.UTF8);
                        xs.Serialize(xmlTextWriter, pObject);
                        memoryStream = xmlTextWriter.BaseStream; // (MemoryStream)
                        XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray());
                        return XmlizedString;
                }
               
                function DeserializeObject(pXmlizedString : String)
                {
                        var xs : XmlSerializer  = new XmlSerializer(typeof(UserData));
                        var memoryStream : MemoryStream  = new MemoryStream(StringToUTF8ByteArray(pXmlizedString));
                        var xmlTextWriter : XmlTextWriter  = new XmlTextWriter(memoryStream, Encoding.UTF8);
                        return xs.Deserialize(memoryStream);
                }

                // Конечный метод загрузки и сохранения для файла
                function CreateXML()
                {
                        var writer : StreamWriter;
                        var t : FileInfo = new FileInfo(Application.persistentDataPath+"/"+ _FileName);
                        if(!t.Exists)
                        {
                                writer = t.CreateText();
                        }
                                writer = t.CreateText();
                        writer.Write(_data);
                        writer.Close();
                }

                function LoadXML()
                {
                        var r : StreamReader = File.OpenText(Application.persistentDataPath+"/"+ _FileName);
                        var _info : String = r.ReadToEnd();
                        r.Close();
                        _data=_info;
                }
 

7) После чего дописываем в наш скрипт "levelMngScr" строку slData.onLoad = true; что бы при загрузке очередного уровня загружалась информация из файла.
8) Ну и логично что бы сохранить в файл вызываем slData.onSave = true; по прохождению уровня.

Где то так это всё работает (popcorn1) гы... Главное пойми механику , а подстроить под свои нужды будет очень легко ... Удачи ... :D
Shadow Line (Android Game)
Аватара пользователя
Denkacn
UNIт
 
Сообщения: 83
Зарегистрирован: 11 фев 2011, 01:47
Откуда: Украина. Запорожье. Бабурка =)
  • ICQ

Re: Вопрос по разблокировке уровня

Сообщение Paul Siberdt 28 авг 2011, 19:59

Автор, почитайте в доке про Player.Prefs и храните статус прохождения в них.
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Вопрос по разблокировке уровня

Сообщение MungoXP 29 авг 2011, 01:47

Большое спасибо за ответы. Сейчас буду разбираться.
MungoXP
UNIт
 
Сообщения: 94
Зарегистрирован: 19 апр 2011, 18:54

Re: Вопрос по разблокировке уровня

Сообщение MungoXP 29 авг 2011, 02:47

До меня что-то не доходит. Я сделал скрипт с названием levelMngScr:
Синтаксис:
Используется javascript
static var level : int[];

function Start(){
        level = new int[4];
        level[1] = 1;
        level[2] = 0;
        level[3] = 0;


}



function Awake () {
    DontDestroyOnLoad (transform.gameObject);
}
 


Прикрепил к объекту. Сделал меню там три объекта первый ведет на 1 уровень, второй- на второй и т.д. Я поставил level[2]=0, но когда в меню я жму он все равно грузится. Непонимаю почему....

И как я понял descriptionOfLevels.level[Application.loadedLevel+1] = 1 нужно прописывать в итог уровня. То есть где у меня прописано, что происходит если уровень пройден:

Синтаксис:
Используется javascript
function gameWon ()
{
        Application.LoadLevel(2);


}
 


Я верно понял?
MungoXP
UNIт
 
Сообщения: 94
Зарегистрирован: 19 апр 2011, 18:54

Re: Вопрос по разблокировке уровня

Сообщение Paul Siberdt 29 авг 2011, 10:12

Аффтар, не уподобляйтесь талпаиоппам, прочтите справку по Player.Prefs, заведите переменную level_max и будьте счастливы.
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Вопрос по разблокировке уровня

Сообщение Denkacn 30 авг 2011, 02:24

Согласен PlayerPrefs проще ... Но зачем же обзываться ?! :-s Допустим я не знал что PlayerPrefs сохраняет данные даже после закрытия приложения , по этому и использовал XML ...
Объясняю по поводу PlayerPrefs для автора.
1) Создаёшь переменную level_max равную 1: PlayerPrefs.SetInt("level_max", 1). Она будет равна максимум открытым уровням.
2) После каждого пройденного уровня присваиваешь ей +1 так: PlayerPrefs.SetInt("level_max", Application.loadedLevel+1). То есть с каждым пройденным уровнем переменная level_max увеличиваться на 1.
3) Когда вставляешь кнопку проверяешь не больше ли уровень загружаемый кнопкой чем переменная level_max:
Синтаксис:
Используется javascript
if (GUI.Button (Rect (10,10,150,40), "Level"+loadLvl)) {
                      if (loadLvl <= PlayerPrefs.GetInt("level_max")){
                                 Application.LoadLevel(loadLvl);
                      }
        }
 

Ну по моему где то так. (popcorn)
Shadow Line (Android Game)
Аватара пользователя
Denkacn
UNIт
 
Сообщения: 83
Зарегистрирован: 11 фев 2011, 01:47
Откуда: Украина. Запорожье. Бабурка =)
  • ICQ

Re: Вопрос по разблокировке уровня

Сообщение Paul Siberdt 30 авг 2011, 09:49

Обзываюсь я исключительно потому, что на этом форуме жутко популярно на простые вопросы давать непростые ответы. То есть, чем хитрозадее и сложнее решение - тем круче автор. :-B
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Вопрос по разблокировке уровня

Сообщение Denkacn 31 авг 2011, 00:03

Не согласен с тобой ... Если бы я знал о PlayerPrefs и о том что он хранит переменные даже после закрытия приложения , я бы не писал про более сложный и запутаны XML ... А так я написал про то что знал ... И расписал это понятным языком ... Может кому то и пригодиться использовать XML ...
Знал бы сразу о PlayerPrefs, написал бы о нём ...
Если ты знаешь больше , это ещё не повод оскорблять другого человека ... Проще объяснить ему свою точку зрения и если она правильная скорее всего человек с ней согласиться ...
Shadow Line (Android Game)
Аватара пользователя
Denkacn
UNIт
 
Сообщения: 83
Зарегистрирован: 11 фев 2011, 01:47
Откуда: Украина. Запорожье. Бабурка =)
  • ICQ

Re: Вопрос по разблокировке уровня

Сообщение MungoXP 03 сен 2011, 00:02

Спасибо, сейчас попробую разобраться.
MungoXP
UNIт
 
Сообщения: 94
Зарегистрирован: 19 апр 2011, 18:54


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

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

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