Apres ce nom de sujet uniquement remplis de mots clefs, je vais vous exposer mon problème~
Tout d’abord je suis sur la conceptions classique d'une base de données pour mon jeu.
/!\ toutes les modifications ce font coté editeur et non runtime~
J'utilise donc nos amis les ScriptableObject et AssetDatabase.
Je crée donc de manière générique des assets qui servent de base de données et donc avec aucun script reelement attaché.
Ici une base de données de livres :
Mais le problème vient du redémarrage de Unity, mon asset n'est plus accessible~
Pour les intéressés :
Scriptable_DB_Objet
Code : Tout sélectionner
using UnityEngine;
using System.Linq;
using System.Collections.Generic;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace BugQuest.DBSystem
{
[System.Serializable]
public class Scriptable_DB_Objet<T> : ScriptableObject where T : class
{
[SerializeField]
protected List<T> _objets = new List<T>();
public List<T> Objets
{
get { return _objets; }
}
public int Count
{
get { return _objets.Count; }
}
public T Get(int i)
{
return (T)System.Activator.CreateInstance(typeof(T), _objets.ElementAt(i));
}
public T GetRandom()
{
return (T)System.Activator.CreateInstance(typeof(T), Random.Range(0, _objets.Count - 1));
}
}
}
Code : Tout sélectionner
using UnityEditor;
using UnityEngine;
namespace BugQuest.DBSystem.Editor
{
public class DB_Editor<D, T> where D : Scriptable_DB_Objet<T> where T : DB_Object, new()
{
[SerializeField]
private D _database;
[SerializeField]
private string _name;
[SerializeField]
private string _path = @"Databases";
private int _selectedIndex = -1;
private T _tmpItem = new T();
private bool _showDetails = false;
private Vector2 _srollPos = Vector2.zero;
private string _itemType = "";
public DB_Editor(string name)
{
_name = name;
}
public void OnEnable(string itemType)
{
_itemType = itemType;
if (_database == null)
LoadDatabase();
}
private void LoadDatabase()
{
string fullPath = @"Assets/" + _path + "/" + _name;
_database = AssetDatabase.LoadAssetAtPath(fullPath, typeof(D)) as D;
if (_database == null)
{
CreateDatabase(fullPath);
}
}
private void CreateDatabase(string fullPath)
{
//Verification dossiée
if (!AssetDatabase.IsValidFolder("Assets/" + _path))
AssetDatabase.CreateFolder("Assets", _path);
//Creation de la base de donnée et mise à jour du fichier
_database = ScriptableObject.CreateInstance<D>() as D;
AssetDatabase.CreateAsset(_database, fullPath);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
public void OnGUI(Vector2 buttonSize, int listViewWidth)
{
ListView(buttonSize, listViewWidth);
Details();
}
public void Details()
{
GUILayout.BeginVertical("Box", GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true));
GUILayout.BeginVertical(GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true));
if (_showDetails)
_tmpItem.OnGUI();
GUILayout.EndVertical();
GUILayout.Space(50);
GUILayout.BeginHorizontal("Box", GUILayout.ExpandWidth(true));
DisplayButtons();
GUILayout.EndHorizontal();
GUILayout.EndVertical();
}
private void DisplayButtons()
{
if (_showDetails)
{
SaveButton();
if (_selectedIndex > -1)
DeleteButton();
CancelButton();
}
else
{
CreateButtons();
}
}
private void CreateButtons()
{
if (GUILayout.Button("New " + _itemType))
{
_tmpItem = new T();
_selectedIndex = -1;
_showDetails = true;
GUI.FocusControl("CancelButton");
}
}
private void SaveButton()
{
if (GUILayout.Button("Save"))
{
if (_selectedIndex == -1)
Add(_tmpItem);
else
Replace(_selectedIndex, _tmpItem);
_selectedIndex = -1;
_showDetails = false;
_tmpItem = new T();
GUI.FocusControl("CancelButton");
}
}
private void CancelButton()
{
GUI.SetNextControlName("CancelButton");
if (GUILayout.Button("Cancel"))
{
_selectedIndex = -1;
_showDetails = false;
_tmpItem = new T();
GUI.FocusControl("CancelButton");
}
}
private void DeleteButton()
{
if (GUILayout.Button("Delete") && _selectedIndex != -1)
{
if (EditorUtility.DisplayDialog("Delete " + _itemType, " Delete : " + _tmpItem.Name + " ?", "Yes", "Cancel"))
{
Remove(_selectedIndex);
_selectedIndex = -1;
_showDetails = false;
_tmpItem = new T();
GUI.FocusControl("CancelButton");
}
}
}
public void ListView(Vector2 buttonSize, int listViewWidth)
{
_srollPos = EditorGUILayout.BeginScrollView(_srollPos, "Box", GUILayout.ExpandHeight(true), GUILayout.Width(listViewWidth));
for (int i = 0; i < _database.Count; i++)
{
if (GUILayout.Button(_database.Get(i).Name, "Box", GUILayout.Width(buttonSize.x), GUILayout.Height(buttonSize.y)))
{
_selectedIndex = i;
_tmpItem = new T();
_tmpItem.SetFromDatabase(_database.Get(i));
_showDetails = true;
}
}
EditorGUILayout.EndScrollView();
}
public void Add(T item)
{
_database.Objets.Add(item);
EditorUtility.SetDirty(_database);
}
public void Insert(int i, T item)
{
_database.Objets.Insert(i, item);
EditorUtility.SetDirty(_database);
}
public void Remove(T i)
{
_database.Objets.Remove(i);
EditorUtility.SetDirty(_database);
}
public void Remove(int i)
{
_database.Objets.RemoveAt(i);
EditorUtility.SetDirty(_database);
}
public void Replace(int i, T item)
{
_database.Objets[i] = item;
EditorUtility.SetDirty(_database);
}
public static U GetDatabase<U>(string path, string name) where U : ScriptableObject
{
string fullPath = @"Assets/" + path + "/" + name;
U database = AssetDatabase.LoadAssetAtPath(fullPath, typeof(U)) as U;
if (database == null)
{
//Verification dossiée
if (!AssetDatabase.IsValidFolder("Assets/" + path))
AssetDatabase.CreateFolder("Assets", path);
//Creation de la base de donnée et mise à jour du fichier
database = ScriptableObject.CreateInstance<U>() as U;
AssetDatabase.CreateAsset(database, fullPath);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
return database;
}
}
}
Pourriez vous m'aidez s'il vous plait~
Je vous remercie d'avance !