×

Проблеми зі збереженням префабу

Маю таку проблему : Створив меню створення персонажа (меню кастомізації) і мені треба зробити так, щоб збарігалися зміни префаба и перенеслися на іншу сцену. Я дивився багато відео, питав у чата GPT і все зводилося до того, що я маю робити збереження через JSON або PlayerPrefs. А я взагалі не розумію як я це можу зробити зі своїм кодом. Прошу допомогу

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

public class CharacterCreatorMenu : MonoBehaviour
{
public GameObject character;
public List<OutfitChanger> outfitChangers = new List<OutfitChanger>();

public void RandomizeCharacter()
{
foreach (OutfitChanger changer in outfitChangers)
{
changer.Randomize();
}
}

public void Submit()
{
PrefabUtility.SaveAsPrefabAsset(character, “Assets/Player.prefab”);
SceneManager.LoadScene(2);
}
}




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

public class OutfitChanger : MonoBehaviour
{
[Header("Sprite to Changer")]
public SpriteRenderer brownPart;

[Header("Sprites to Cycle Through")]
public List<Sprite> options = new List<Sprite>();

private int currentOption = 0;


public void NextOptiot()
{
currentOption++;
if (currentOption >= options.Count)
{
currentOption = 0;
}
brownPart.sprite = options[currentOption];
}


public void PreviousOption()
{
currentOption—;
if (currentOption <= 0)
{
currentOption = options.Count — 1;
}
brownPart.sprite = options[currentOption];
}

public void Randomize()
{
currentOption = Random.Range(0, options.Count — 1);
brownPart.sprite = options[currentOption];
}
}

Підписуйтеся на Telegram-канал @gamedev_dou, щоб не пропустити найважливіші статті і новини про геймдев

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Якщо чисто перенести в іншу сцену то DontDestroyOnLoad(); в Awake буде достатньо.. а якщо зберігати то краще використовувати 3в1, PlayerPrefs зберігає назву файлу збереження в якому string в вигляді Json, а так як Json дуже габаритний то можна сереалізувати все в BinaryFormater.. в будь якому випадку тобі для початку треба клас з даними які хочеш зберегти під атрибутом [System.Serialize], а далі все як описано вище.

Запакуй спрайти в ScriptableObject. Найкраще всередині використати dictionary, щоб індексація була по назві(але треба скачати з гітхабу чи ассет стору розширення до словника яке дозволяє його серіалізувати). Реалізуй в scriptable функції доступу до спрайтів і імплементуй це в свій код. Після створення персонажа створи json з індексами елементів кастомізації і збережи в PlayerPrefs.

Все правильно сказали про PlayerPrefs , зачем персонажа сохранять оплностью в отдельный префаб, если можно только сохранить «индексы» частей которые кастомизируются и на другой сцене загрузить их

А как сделать сохранение индексов ?

Ось вам дуже простий приклад. Перші чотири константи — ключі, за якими будемо зберігати обрані речі і індекс за замовчуванням. Індекс кожної обраної речі зберігається у наступних трьох полях. Метод Save зберігає за вищезгаданими ключами поточні значення, а метод Load — для кожної речі викликає метод LoadInt, який перевіряє — якщо за переданим ключем вже є запис — повертає його, а якщо нема — записує туди значення за замовчуванням і повертає його.

private const string HeadIndexKey = “SelectedHeadIndex”;
private const string BodyIndexKey = “SelectedBodyIndex”;
private const string BootsIndexKey = “SelectedBootsIndex”;
private const int DefaultIndex = 0;

private int _selectedHeadIndex;
private int _selectedBodyIndex;
private int _selectedBootsIndex;

public void Save()
{
PlayerPrefs.SetInt(HeadIndexKey, _selectedHeadIndex);
PlayerPrefs.SetInt(BodyIndexKey, _selectedBodyIndex);
PlayerPrefs.SetInt(BootsIndexKey, _selectedBootsIndex);
}

public void Load()
{
_selectedHeadIndex = LoadInt(HeadIndexKey);
_selectedBodyIndex = LoadInt(BodyIndexKey);
_selectedBootsIndex = LoadInt(BootsIndexKey);
}

private static int LoadInt(string key)
{
if (PlayerPrefs.HasKey(key) == false)
PlayerPrefs.SetInt(key, DefaultIndex);

return PlayerPrefs.GetInt(key);
}

Привіт!
Як буде можливість, напиши в тг @Urizchnko, спробую допомогти тобі з цим)

Підписатись на коментарі