Привет, очень надеюсь, что вы сможете помочь.
Я нашёл данный ассет(система сохранения местоположения), который полностью удовлетворяет моим потребностям в проекте, однако он абсолютно неработоспособен в андроид проекте.
Проблема проста до безобразия, файл в который заносится вся информация сохраняется в корневую папку с игрой, а как вы знаете, чтобы получить доступ туда на андроид игре - тот ещё геморой.
Помогите, пожалуйста, исправить код так, чтобы он работал на андройде.
Сам ассет: 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");
}
}
}
}
Всё что мне нужно - заставить сохранение работать на андройде.