المقدمة
تحتوي كل لعبة على بيانات يعمل معها مصممو الألعاب. في RPG ، هذه قاعدة بيانات للعناصر ، في المباراة 3 - التكلفة في بلورات الأدوات من المتجر ، في ألعاب الحركة - كمية HP التي تعالجها مجموعة الإسعافات الأولية.
هناك طرق عديدة لتخزين مثل هذه البيانات - يقوم شخص ما بتخزينها في جداول أو في ملفات xml أو json ، والتي يقوم بتحريرها باستخدام أدواته الخاصة. توفر الوحدة طريقتها الخاصة - الكائنات القابلة للبرمجة (SO) ، والتي أحبها لأنك لست بحاجة إلى كتابة محرر خاص بك لتمثيلها المرئي ، فمن السهل الارتباط بأصول اللعبة ومع بعضها البعض ، ومع ظهور Addressables ، يمكن تخزين هذه البيانات بسهولة ويسر في الخارج الألعاب والتحديث بشكل منفصل.
في هذه المقالة ، أود أن أتحدث عن مكتبة قاعدة بيانات SOD الخاصة بي ، والتي يمكنك من خلالها إنشاء عناصر قابلة للبرمجة وتعديلها واستخدامها بسهولة في اللعبة (تحريرها وتسلسلها).
إنشاء وتحرير SO
أقوم بإنشاء SOs وتحريرها في نافذة منفصلة ، والتي تشبه إلى حد ما نوافذ المشروع مع وجود مفتش - يوجد على اليسار شجرة مجلد (المجلد الذي توجد فيه جميع SOs - مجموعة في عناصر العنونة) ، وعلى اليمين يوجد مفتش SO المحدد.

لرسم مثل WindowEditor ، أستخدم مكتبة Odin Inspector . أيضًا ، أنا أستخدم التسلسل لـ SO من هذه المكتبة - إنه يوسع إلى حد كبير تسلسل الوحدات القياسي ، مما يسمح بتخزين الفئات متعددة الأشكال ، والتداخل العميق ، ومراجع الفئة.

يتم إنشاء SOs الجديدة بالنقر فوق زر في هذه النافذة - هناك تحتاج إلى تحديد نوع bipod المطلوب ، ويتم إنشاؤه في المجلد. لكي يظهر نوع SO في هذه النافذة كخيار ، يجب أن يرث SO من DataNode ، الذي يحتوي على حقل إضافي واحد فقط إلى ScriptableObject
public string FullPath { get; }
SO, .
SO
- , , SO - , — , , SO.
static SODatabase , , .
public static T GetModel<T>(string path) where T : DataNode
public static List<T> GetModels<T>(string path, bool includeSubFolders = false) where T : DataNode
, SODatabase , Addressables.
ScriptableObject , . ScriptableObject . , SO .
— , , - , . , SO . , unity, xml .
, ScriptableObject JSON.
DataNode — SO, SODatabase,
[JsonObject(MemberSerialization.OptIn, IsReference = true)]
JsonProperty save.txt . SODatabase addressables JsonConvert.PopulateObject SODatabase, .
, , SO ( , JsonProperty) -, SO . — . , , , .
-
async void Awake()
{
await SODatabase.InitAsync(null, null);
await SODatabase.LoadAsync();
}
private void OnApplicationPause(bool pauseStatus)
{
if (pauseStatus)
SODatabase.Save();
}
private void OnApplicationQuit()
{
SODatabase.Save();
}
PlayerSO, — , , . - , SODatabase, .
public class PlayerSO : DataNode
{
public static string Path => "PlayerInfo/Player";
[JsonProperty]
public string Title = string.Empty;
[JsonProperty]
public int Experience;
}
PlayerInventorySO, ( SO SODatabase).
public class PlayerInventorySO : DataNode
{
public static string Path => "PlayerInfo/PlayerInventory";
[JsonProperty]
public List<ItemSO> Items = new List<ItemSO>();
}
, — , . , , QuestSO (, , ..) . - .
public class QuestNode : BaseNode
{
public static string Path = "QuestNodes";
//Editor
public virtual string Title { get; } = string.Empty;
public virtual string Description { get; } = string.Empty;
public int TargetCount;
//Runtime
[JsonProperty]
private bool finished;
public bool Finished
{
get => finished;
set => finished = value;
}
}
, JsonProperty , SO .
var playerSO = SODatabase.GetModel<PlayerSO>(PlayerSO.Path);
var playerInventorySO = SODatabase.GetModel<PlayerInventorySO>(PlayerInventorySO.Path);
var questNodes = SODatabase.GetModels<QuestNode>(QuestNode.Path, true);
— - / , , SO, json. - , ( ..) . SO , SODatabase , Addressables.
المكتبة متاحة للجمهور على جيثب . مكتوب باستخدام Nullable من c # 8 ، لذلك يتطلب Unity 2020.1.4 كإصدار أدنى.