Сохранение в мобильной игре
| |
Knife_Kill | Дата: Вторник, 10 Ноября 2015, 10:15 | Сообщение # 1 |
частый гость
Сейчас нет на сайте
| Здравствуйте, у меня имеется небольшая мобильная игра, так же в игре имеется магазин с улучшениями (пока примитивный), суть в том, что нужно реализовать сохранения значений maxBull и maxInvis, как это сделать? Есть ли уроки? Пробовал через PlayerPrefs, но в таком случае в игре при подбирании бонуса ничего не происходит (скорее всего значение становится = 0, почему? (до этого все работало, но при выходе из игры все значения сбрасывались 0) "bonused" - префаб с значениями (игрок), во второй сцене он создается.
Код using UnityEngine; using System.Collections;
public class MainMenu : MonoBehaviour {
public AudioSource music; public bool isActive = false; public GameObject bonused;
// Use this for initialization void Start() {
}
// Update is called once per frame void Update() {
}
void OnGUI() { if (GUI.Button(new Rect(Screen.width / 2 - 250, Screen.height / 2 - 20, 150, 60), "Play")) { Application.LoadLevel("game");
if (PlayerPrefs.HasKey("maxBullet") && PlayerPrefs.HasKey("maxInis"))
{ bonused.GetComponent<ControlPlayer>().maxBullet = PlayerPrefs.GetInt("maxBull"); bonused.GetComponent<ControlPlayer>().maxInvis = PlayerPrefs.GetInt("maxInvis"); }
}
if (GUI.Button(new Rect(Screen.width / 2 - 50, Screen.height / 2 - 20, 150, 60), "Sound: On/Off")) { if (isActive == true) { music.mute = false; isActive = false; }
else if (isActive == false) { music.mute = true; isActive = true; }
}
if (GUI.Button(new Rect(Screen.width / 2 - 50, Screen.height / 2 + 70, 150, 60), "Shop")) { bonused.GetComponent<ControlPlayer>().maxBullet++; bonused.GetComponent<ControlPlayer>().maxInvis++; Save(); }
if (GUI.Button(new Rect(Screen.width / 2 + 150, Screen.height / 2 - 20, 150, 60), "Exit")) { Application.Quit(); } }
void Save() { int saveBull = bonused.GetComponent<ControlPlayer>().maxBullet; int saveInvis = bonused.GetComponent<ControlPlayer>().maxInvis; PlayerPrefs.SetInt("maxBullet", saveBull); PlayerPrefs.SetInt("maxInis", saveInvis); } }
П.с. про вред использования GetComponent прошу не писать, в дальнейшем попробую найти альтернативу.Добавлено (10 ноября 2015, 10:15) --------------------------------------------- АП
Сообщение отредактировал Knife_Kill - Вторник, 10 Ноября 2015, 10:15 |
|
| |
manonedge | Дата: Вторник, 10 Ноября 2015, 10:23 | Сообщение # 2 |
почетный гость
Сейчас нет на сайте
| В плеерпрефс надо не только указать значение, но вызывать функцию сохранения.
|
|
| |
Knife_Kill | Дата: Вторник, 10 Ноября 2015, 10:39 | Сообщение # 3 |
частый гость
Сейчас нет на сайте
| Цитата manonedge ( ) В плеерпрефс надо не только указать значение, но вызывать функцию сохранения.
Можете привести пример? Зарание благодарю
|
|
| |
irinautkina | Дата: Вторник, 10 Ноября 2015, 10:57 | Сообщение # 4 |
участник
Сейчас нет на сайте
| PlayerPrefs.SetInt("maxBullet", saveBull); PlayerPrefs.SetInt("maxInis", saveInvis);
PlayerPrefs.Save();
|
|
| |
Knife_Kill | Дата: Среда, 11 Ноября 2015, 09:16 | Сообщение # 5 |
частый гость
Сейчас нет на сайте
| Цитата irinautkina ( ) PlayerPrefs.SetInt("maxBullet", saveBull);... БлагодарюДобавлено (10 ноября 2015, 20:41) --------------------------------------------- Хммм.. Ребята, на ПК данный код работает (вроде как), а на Андроид нет, чем может быть проблема? PlayerPrefs на Android работает так же как и на ПК?
Код using UnityEngine; using System.Collections;
public class MainMenu : MonoBehaviour {
public AudioSource music; public bool isActive = false; public GameObject bonused;
// Use this for initialization void Start() { bonused.GetComponent<ControlPlayer>().maxBullet = PlayerPrefs.GetInt("maxBull"); bonused.GetComponent<ControlPlayer>().maxInvis = PlayerPrefs.GetInt("maxInvis"); }
// Update is called once per frame void Update() {
}
void OnGUI() { if (GUI.Button(new Rect(Screen.width / 2 - 250, Screen.height / 2 - 20, 150, 60), "Play")) { Application.LoadLevel("game"); }
if (GUI.Button(new Rect(Screen.width / 2 - 50, Screen.height / 2 - 20, 150, 60), "Sound: On/Off")) { if (isActive == true) { music.mute = false; isActive = false; }
else if (isActive == false) { music.mute = true; isActive = true; }
}
if (GUI.Button(new Rect(Screen.width / 2 - 50, Screen.height / 2 + 70, 150, 60), "Shop")) { bonused.GetComponent<ControlPlayer>().maxBullet++; bonused.GetComponent<ControlPlayer>().maxInvis++; Save(); }
if (GUI.Button(new Rect(Screen.width / 2 + 150, Screen.height / 2 - 20, 150, 60), "Exit")) { Save(); Application.Quit(); } }
void Save() { int saveBull = bonused.GetComponent<ControlPlayer>().maxBullet; int saveInvis = bonused.GetComponent<ControlPlayer>().maxInvis; PlayerPrefs.SetInt("maxBullet", saveBull); PlayerPrefs.SetInt("maxInis", saveInvis); PlayerPrefs.Save(); } }
Добавлено (11 ноября 2015, 09:16) --------------------------------------------- up
|
|
| |
NightLord | Дата: Четверг, 12 Ноября 2015, 00:57 | Сообщение # 6 |
участник
Сейчас нет на сайте
| Сохранение происходит в другом потоке. Подозреваю, что юнити тупо не успевает сохранить изменения и вырубает все потоки. Работа с диском довольно медленная операция.
Часто стоишь в пробке или очереди? Эта игра поможет скоротать время 7Bricks - головоломка с цифрами.
|
|
| | |
manonedge | Дата: Суббота, 14 Ноября 2015, 11:11 | Сообщение # 8 |
почетный гость
Сейчас нет на сайте
| Как оно у тебя на компе работает, если ты для чтения и для записи разные поля используешь. При записи у тебя maxBullet и maxInis, а при чтении - maxBull и maxInvis. Смотрел в коде чуть выше. В самом первом посте вообще еще и hasKey другие названия.
Сообщение отредактировал manonedge - Суббота, 14 Ноября 2015, 11:12 |
|
| |
Vakhrushev | Дата: Пятница, 03 Февраля 2017, 02:13 | Сообщение # 9 |
уже был
Сейчас нет на сайте
| Knife_Kill, ещё в шапке скрипта не всё указано, что должен использовать Unity. Для PlayerPrefs на мобилке обязательно в твоём случае должно быть так:
Код using UnityEngine; using System.Collections; using System.Collections.Generic; using System.IO; using System;
Далее как обычно. Мне это решило проблему, но, если это не получится, можно в AndroidManifest.xml прописать: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> Этот файл находится в \Unity\Editor\Data\PlaybackEngines\androidplayer и в папке Temp проекта. Не знаю, нужно ли его переносить в plugins/android Это даст разрешение на чтение-запись на карту памяти
|
|
| |
|