Адаптировать скрипт под андроид!

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

Адаптировать скрипт под андроид!

Сообщение porar57790 01 фев 2022, 21:35

Привет, очень надеюсь, что вы сможете помочь.

Я нашёл данный ассет(система сохранения местоположения), который полностью удовлетворяет моим потребностям в проекте, однако он абсолютно неработоспособен в андроид проекте.

Проблема проста до безобразия, файл в который заносится вся информация сохраняется в корневую папку с игрой, а как вы знаете, чтобы получить доступ туда на андроид игре - тот ещё геморой.
Помогите, пожалуйста, исправить код так, чтобы он работал на андройде.

Сам ассет: https://assetstore.unity.com/packages/t ... tem-151293

Вот все скрипты, что задействуются в работе сохранения.

GameMaster.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace NGS.ExtendableSaveSystem
{
[RequireComponent(typeof(SaveMaster))]
public class GameMaster : MonoBehaviour
{
public void SaveGame()
{
GetComponent<SaveMaster>().Save("Assets/Saves/", "save", ".data");
Debug.Log("Game saved");
}

public void LoadGameUntil()
{
GetComponent<SaveMaster>().Load("Assets/Saves/", "save", ".data");
Debug.Log("Game loaded");
}
}
}


SaveMaster.cs


using System.Runtime.Serialization.Formatters.Binary;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEngine;

namespace NGS.ExtendableSaveSystem
{
public class SaveMaster : MonoBehaviour
{
protected ISavableComponent[] GetOrderedSavableComponents()
{
return FindObjectsOfTypeAll(typeof(Component))
.Where(c => c is ISavableComponent)
.Select(c => (ISavableComponent)c)
.OrderBy(c => c.executionOrder)
.ToArray();
}

public virtual void Save(string folderPath, string fileName, string fileFormat)
{
if (!folderPath.EndsWith("/")) folderPath += "/";
if (!fileFormat.StartsWith(".")) fileFormat = "." + fileFormat;

if (!Directory.Exists(folderPath))
Directory.CreateDirectory(folderPath);

Dictionary<int, ComponentData> componentsData = new Dictionary<int, ComponentData>();

foreach (var savableComponent in GetOrderedSavableComponents())
componentsData.Add(savableComponent.uniqueID, savableComponent.Serialize());

BinaryFormatter formatter = new BinaryFormatter();

using (FileStream stream = new FileStream(folderPath + fileName + fileFormat, FileMode.Create))
formatter.Serialize(stream, componentsData);
}

public virtual void Load(string folderPath, string fileName, string fileFormat)
{
if (!folderPath.EndsWith("/")) folderPath += "/";
if (!fileFormat.StartsWith(".")) fileFormat = "." + fileFormat;

if (!Directory.Exists(folderPath))
throw new DirectoryNotFoundException("SaveMaster::Directory '" + folderPath + "' not found");

Dictionary<int, ComponentData> componentsData = null;

BinaryFormatter formatter = new BinaryFormatter();
using (FileStream stream = new FileStream(folderPath + fileName + fileFormat, FileMode.Open))
componentsData = (Dictionary<int, ComponentData>) formatter.Deserialize(stream);

foreach (var savableComponent in GetOrderedSavableComponents())
if (componentsData.ContainsKey(savableComponent.uniqueID))
savableComponent.Deserialize(componentsData[savableComponent.uniqueID]);
}
}
}



TransformSaver.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace NGS.ExtendableSaveSystem
{
public class TransformSaver : MonoBehaviour, ISavableComponent
{
[SerializeField] private int _uniqueID;
[SerializeField] private int _executionOrder;

public int uniqueID
{
get
{
return _uniqueID;
}
}
public int executionOrder
{
get
{
return _executionOrder;
}
}


private void Reset()
{
_uniqueID = GetHashCode();
}

public ComponentData Serialize()
{
ExtendedComponentData data = new ExtendedComponentData();

data.SetTransform("transform", transform);

return data;
}

public void Deserialize(ComponentData data)
{
ExtendedComponentData unpacked = (ExtendedComponentData)data;

unpacked.GetTransform("transform", transform);
}
}
}

SavePoint.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;


namespace NGS.ExtendableSaveSystem
{
[RequireComponent(typeof(SaveMaster))]
public class SavePoint : MonoBehaviour
{

public GameObject SaveMessage;
public GameObject SavePointModel;
public void OnTriggerEnter(Collider other)
{

if (other.gameObject.tag == "Player")
{
SaveMessage.SetActive(true);
SavePointModel.SetActive(false);
SavePointModel.transform.position = new Vector3(-10, -10, -10);
GetComponent<SaveMaster>().Save("Assets/Saves/", "save", ".data");
Debug.Log("Game saved");
}
}

}
}



Всё что мне нужно - заставить сохранение работать на андройде.
porar57790
UNец
 
Сообщения: 5
Зарегистрирован: 21 авг 2021, 22:46

Re: Адаптировать скрипт под андроид!

Сообщение KBEP 22 фев 2022, 19:57

Сохранять надо не в Assets/Saves/, а сюда: Application.persistentDataPath.
Аватара пользователя
KBEP
Старожил
 
Сообщения: 598
Зарегистрирован: 24 сен 2012, 23:23
Откуда: Калининград, СПб, Северодвинск

Re: Адаптировать скрипт под андроид!

Сообщение Jarico 23 фев 2022, 20:50

Фу как много букв...

Проще сделать статический список с объектами и реализовать интерфейс ISave а затем наследовать все скрипты от интерфейса где требуется сохранение данных
Синтаксис:
Используется csharp
public interface ISave
{
void OnSave(BinaryWriter writer);//для записи данных
void OnLoad(BinaryReader reader);//для чтения данных
}
 


Статический класс для чтения и записи
Синтаксис:
Используется csharp
public static class SaveLoad
{
public static List<ISave> objects = new List<ISave>();

public static void Save()
{
using(MemoryStream ms = new MemoryStream())
{
using(BinaryWriter writer = new BinaryWriter(ms))
{
writer .Write(objects.Count);
for(int i = 0; i < objects.Count;i++)
{
objects[i].OnSave(writer);
}
File.WriteAllBytes(Path.Combine(Application.dataPath, "saves.bin"), writer.BaseStream.ToArray());
}

public static void Load()
{
using(FileStream fs = new FileStream(Path.Combine(Application.dataPath, "saves.bin")))
{
using(BinaryReader reader = new BinaryReader(ms))
{
int objects_count = reader.ReadInt32();
for(int i = 0; i < objects_count ;i++)
{
objects[i].OnLoad(reader);
}
}
}
 


Синтаксис:
Используется csharp
public class MyTransform : MonoBehaviour, ISave
{
void Awake()
{
SaveLoad.objects.Add(this);//добавляем в список для сохранения
}

void OnDestroy()
{
SaveLoad.objects.Remove(this);//удаляем из списка для сохранения
}
}
 


P.S. Код писал без IDE, возможны ошибки
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт


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

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

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


cron