Migrate settings to a more manageable structure and implement Service Locator pattern for runtime Addressables retrieval
This commit is contained in:
@@ -18,7 +18,7 @@ namespace Editor
|
||||
private enum ItemType { None, Pickup, ItemSlot }
|
||||
private ItemType _itemType = ItemType.None;
|
||||
|
||||
[MenuItem("Tools/Item Prefab Editor")]
|
||||
[MenuItem("AppleHills/Item Prefab Editor")]
|
||||
public static void ShowWindow()
|
||||
{
|
||||
var window = GetWindow<ItemPrefabEditorWindow>("Item Prefab Editor");
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace Editor
|
||||
|
||||
private bool _createNext = false;
|
||||
|
||||
[MenuItem("Tools/Prefab Creator")]
|
||||
[MenuItem("AppleHills/Item Prefab Creator")]
|
||||
public static void ShowWindow()
|
||||
{
|
||||
var window = GetWindow<PrefabCreatorWindow>("Prefab Creator");
|
||||
|
||||
@@ -9,7 +9,7 @@ public class PuzzleChainEditorWindow : EditorWindow
|
||||
private Vector2 scrollPos;
|
||||
private const int INDENT_SIZE = 24;
|
||||
|
||||
[MenuItem("Tools/Puzzle Chain Editor")]
|
||||
[MenuItem("AppleHills/Puzzle Chain Editor")]
|
||||
public static void ShowWindow()
|
||||
{
|
||||
var window = GetWindow<PuzzleChainEditorWindow>("Puzzle Chain Editor");
|
||||
|
||||
@@ -15,7 +15,7 @@ public class SceneObjectLocatorWindow : EditorWindow
|
||||
private List<PickupInfo> pickupInfos = new List<PickupInfo>();
|
||||
private Vector2 scrollPos;
|
||||
|
||||
[MenuItem("Tools/Scene Object Locator")]
|
||||
[MenuItem("AppleHills/Scene Object Locator")]
|
||||
public static void ShowWindow()
|
||||
{
|
||||
var window = GetWindow<SceneObjectLocatorWindow>("Scene Object Locator");
|
||||
|
||||
190
Assets/Editor/SettingsEditorWindow.cs
Normal file
190
Assets/Editor/SettingsEditorWindow.cs
Normal file
@@ -0,0 +1,190 @@
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.IO;
|
||||
|
||||
namespace AppleHills.Core.Settings.Editor
|
||||
{
|
||||
public class SettingsEditorWindow : EditorWindow
|
||||
{
|
||||
private Vector2 scrollPosition;
|
||||
private List<BaseSettings> allSettings = new List<BaseSettings>();
|
||||
private string[] tabNames = new string[] { "Player & Follower", "Interaction & Items", "Minigames" };
|
||||
private int selectedTab = 0;
|
||||
private Dictionary<string, SerializedObject> serializedSettingsObjects = new Dictionary<string, SerializedObject>();
|
||||
private GUIStyle headerStyle;
|
||||
|
||||
[MenuItem("AppleHills/Settings Editor")]
|
||||
public static void ShowWindow()
|
||||
{
|
||||
GetWindow<SettingsEditorWindow>("Game Settings");
|
||||
}
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
LoadAllSettings();
|
||||
}
|
||||
|
||||
private void LoadAllSettings()
|
||||
{
|
||||
allSettings.Clear();
|
||||
serializedSettingsObjects.Clear();
|
||||
|
||||
// Find all settings assets
|
||||
string[] guids = AssetDatabase.FindAssets("t:BaseSettings");
|
||||
foreach (string guid in guids)
|
||||
{
|
||||
string path = AssetDatabase.GUIDToAssetPath(guid);
|
||||
BaseSettings settings = AssetDatabase.LoadAssetAtPath<BaseSettings>(path);
|
||||
if (settings != null)
|
||||
{
|
||||
allSettings.Add(settings);
|
||||
serializedSettingsObjects[settings.GetType().Name] = new SerializedObject(settings);
|
||||
}
|
||||
}
|
||||
|
||||
// If any settings are missing, create them
|
||||
CreateSettingsIfMissing<PlayerFollowerSettings>("PlayerFollowerSettings");
|
||||
CreateSettingsIfMissing<InteractionSettings>("InteractionSettings");
|
||||
CreateSettingsIfMissing<MinigameSettings>("MinigameSettings");
|
||||
}
|
||||
|
||||
private void CreateSettingsIfMissing<T>(string fileName) where T : BaseSettings
|
||||
{
|
||||
if (!allSettings.Any(s => s is T))
|
||||
{
|
||||
// Check if the asset already exists
|
||||
string[] guids = AssetDatabase.FindAssets($"t:{typeof(T).Name}");
|
||||
if (guids.Length == 0)
|
||||
{
|
||||
// Create the settings folder if it doesn't exist
|
||||
if (!AssetDatabase.IsValidFolder("Assets/Settings"))
|
||||
{
|
||||
AssetDatabase.CreateFolder("Assets", "Settings");
|
||||
}
|
||||
|
||||
// Create new settings asset
|
||||
T settings = CreateInstance<T>();
|
||||
string path = $"Assets/Settings/{fileName}.asset";
|
||||
AssetDatabase.CreateAsset(settings, path);
|
||||
AssetDatabase.SaveAssets();
|
||||
|
||||
allSettings.Add(settings);
|
||||
serializedSettingsObjects[typeof(T).Name] = new SerializedObject(settings);
|
||||
Debug.Log($"Created missing settings asset: {path}");
|
||||
}
|
||||
else
|
||||
{
|
||||
// Load existing asset
|
||||
string path = AssetDatabase.GUIDToAssetPath(guids[0]);
|
||||
T settings = AssetDatabase.LoadAssetAtPath<T>(path);
|
||||
allSettings.Add(settings);
|
||||
serializedSettingsObjects[typeof(T).Name] = new SerializedObject(settings);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnGUI()
|
||||
{
|
||||
if (headerStyle == null)
|
||||
{
|
||||
headerStyle = new GUIStyle(EditorStyles.boldLabel);
|
||||
headerStyle.fontSize = 14;
|
||||
headerStyle.margin = new RectOffset(0, 0, 10, 10);
|
||||
}
|
||||
|
||||
EditorGUILayout.Space(10);
|
||||
EditorGUILayout.LabelField("Apple Hills Game Settings", headerStyle);
|
||||
EditorGUILayout.HelpBox("Use this window to modify game settings. Changes are saved automatically.", MessageType.Info);
|
||||
|
||||
EditorGUILayout.Space(10);
|
||||
selectedTab = GUILayout.Toolbar(selectedTab, tabNames);
|
||||
|
||||
scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
|
||||
|
||||
switch (selectedTab)
|
||||
{
|
||||
case 0: // Player & Follower
|
||||
DrawSettingsEditor<PlayerFollowerSettings>();
|
||||
break;
|
||||
case 1: // Interaction & Items
|
||||
DrawSettingsEditor<InteractionSettings>();
|
||||
break;
|
||||
case 2: // Minigames
|
||||
DrawSettingsEditor<MinigameSettings>();
|
||||
break;
|
||||
}
|
||||
|
||||
EditorGUILayout.EndScrollView();
|
||||
|
||||
EditorGUILayout.Space(10);
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
GUILayout.FlexibleSpace();
|
||||
|
||||
if (GUILayout.Button("Refresh", GUILayout.Width(100)))
|
||||
{
|
||||
LoadAllSettings();
|
||||
}
|
||||
|
||||
if (GUILayout.Button("Save All", GUILayout.Width(100)))
|
||||
{
|
||||
foreach (var serializedObj in serializedSettingsObjects.Values)
|
||||
{
|
||||
serializedObj.ApplyModifiedProperties();
|
||||
EditorUtility.SetDirty(serializedObj.targetObject);
|
||||
}
|
||||
AssetDatabase.SaveAssets();
|
||||
Debug.Log("All settings saved!");
|
||||
}
|
||||
|
||||
EditorGUILayout.EndHorizontal();
|
||||
}
|
||||
|
||||
private void DrawSettingsEditor<T>() where T : BaseSettings
|
||||
{
|
||||
BaseSettings settings = allSettings.Find(s => s is T);
|
||||
if (settings == null)
|
||||
{
|
||||
EditorGUILayout.HelpBox($"No {typeof(T).Name} found. Click Refresh to create one.", MessageType.Warning);
|
||||
return;
|
||||
}
|
||||
|
||||
SerializedObject serializedObj = serializedSettingsObjects[typeof(T).Name];
|
||||
serializedObj.Update();
|
||||
|
||||
EditorGUILayout.Space(10);
|
||||
|
||||
// Draw all properties
|
||||
SerializedProperty property = serializedObj.GetIterator();
|
||||
bool enterChildren = true;
|
||||
while (property.NextVisible(enterChildren))
|
||||
{
|
||||
enterChildren = false;
|
||||
|
||||
// Skip the script field
|
||||
if (property.name == "m_Script") continue;
|
||||
|
||||
EditorGUILayout.PropertyField(property, true);
|
||||
}
|
||||
|
||||
// Apply changes
|
||||
if (serializedObj.ApplyModifiedProperties())
|
||||
{
|
||||
EditorUtility.SetDirty(settings);
|
||||
}
|
||||
}
|
||||
|
||||
// Helper method to highlight important fields
|
||||
private void DrawHighlightedProperty(SerializedProperty property, string tooltip = null)
|
||||
{
|
||||
GUI.backgroundColor = new Color(1f, 1f, 0.8f);
|
||||
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
|
||||
GUI.backgroundColor = Color.white;
|
||||
|
||||
EditorGUILayout.PropertyField(property, new GUIContent(property.displayName, tooltip));
|
||||
|
||||
EditorGUILayout.EndVertical();
|
||||
}
|
||||
}
|
||||
}
|
||||
3
Assets/Editor/SettingsEditorWindow.cs.meta
Normal file
3
Assets/Editor/SettingsEditorWindow.cs.meta
Normal file
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bfb9e77c746e41a2903603a39df3d424
|
||||
timeCreated: 1758619952
|
||||
307
Assets/Editor/SettingsMigrationWindow.cs
Normal file
307
Assets/Editor/SettingsMigrationWindow.cs
Normal file
@@ -0,0 +1,307 @@
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using UnityEditor.AddressableAssets;
|
||||
using UnityEditor.AddressableAssets.Settings;
|
||||
using System.IO;
|
||||
using AppleHills.Core.Settings;
|
||||
|
||||
namespace AppleHills.Editor
|
||||
{
|
||||
public class SettingsMigrationWindow : EditorWindow
|
||||
{
|
||||
private GameSettings legacySettings;
|
||||
private bool settingsFolderExists;
|
||||
private bool addressablesInstalled;
|
||||
private AddressableAssetSettings addressableSettings;
|
||||
private AddressableAssetGroup settingsGroup;
|
||||
private GUIStyle headerStyle;
|
||||
private GUIStyle successStyle;
|
||||
private Vector2 scrollPosition;
|
||||
private bool migrationCompleted = false;
|
||||
|
||||
[MenuItem("AppleHills/Migrate Legacy Settings")]
|
||||
public static void ShowWindow()
|
||||
{
|
||||
var window = GetWindow<SettingsMigrationWindow>("Settings Migration");
|
||||
window.minSize = new Vector2(450, 400);
|
||||
}
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
// Check if Settings folder exists
|
||||
settingsFolderExists = AssetDatabase.IsValidFolder("Assets/Settings");
|
||||
|
||||
// Check if Addressables package is installed
|
||||
addressablesInstalled = AddressableAssetSettingsDefaultObject.SettingsExists;
|
||||
|
||||
if (addressablesInstalled)
|
||||
{
|
||||
addressableSettings = AddressableAssetSettingsDefaultObject.Settings;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnGUI()
|
||||
{
|
||||
if (headerStyle == null)
|
||||
{
|
||||
headerStyle = new GUIStyle(EditorStyles.boldLabel);
|
||||
headerStyle.fontSize = 14;
|
||||
headerStyle.margin = new RectOffset(0, 0, 10, 10);
|
||||
|
||||
successStyle = new GUIStyle(EditorStyles.label);
|
||||
successStyle.normal.textColor = Color.green;
|
||||
successStyle.fontSize = 12;
|
||||
}
|
||||
|
||||
scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
|
||||
|
||||
EditorGUILayout.LabelField("Migrate Legacy Settings", headerStyle);
|
||||
EditorGUILayout.Space(10);
|
||||
|
||||
EditorGUILayout.HelpBox(
|
||||
"This tool will migrate your legacy GameSettings to the new modular settings system. " +
|
||||
"It will create new settings assets in the Assets/Settings folder, mark them as Addressables, " +
|
||||
"and copy values from your legacy settings.",
|
||||
MessageType.Info);
|
||||
|
||||
EditorGUILayout.Space(10);
|
||||
|
||||
// Prerequisites section
|
||||
EditorGUILayout.LabelField("Prerequisites", EditorStyles.boldLabel);
|
||||
|
||||
// Check Addressables
|
||||
GUI.enabled = false;
|
||||
EditorGUILayout.Toggle("Addressables Package Installed", addressablesInstalled);
|
||||
GUI.enabled = true;
|
||||
|
||||
if (!addressablesInstalled)
|
||||
{
|
||||
EditorGUILayout.HelpBox(
|
||||
"The Addressables package is not installed. Please install it via Window > Package Manager.",
|
||||
MessageType.Error);
|
||||
}
|
||||
|
||||
EditorGUILayout.Space(5);
|
||||
|
||||
// Legacy settings field
|
||||
legacySettings = EditorGUILayout.ObjectField("Legacy GameSettings", legacySettings, typeof(GameSettings), false) as GameSettings;
|
||||
|
||||
if (legacySettings == null)
|
||||
{
|
||||
EditorGUILayout.HelpBox(
|
||||
"Please assign your legacy GameSettings asset to migrate from.",
|
||||
MessageType.Warning);
|
||||
}
|
||||
|
||||
EditorGUILayout.Space(15);
|
||||
|
||||
// Migration button
|
||||
GUI.enabled = legacySettings != null && addressablesInstalled;
|
||||
|
||||
if (GUILayout.Button("Migrate Settings", GUILayout.Height(30)))
|
||||
{
|
||||
MigrateSettings();
|
||||
}
|
||||
|
||||
GUI.enabled = true;
|
||||
|
||||
// Success message
|
||||
if (migrationCompleted)
|
||||
{
|
||||
EditorGUILayout.Space(10);
|
||||
EditorGUILayout.LabelField("Migration completed successfully!", successStyle);
|
||||
EditorGUILayout.HelpBox(
|
||||
"The legacy settings have been migrated to the new system. " +
|
||||
"You can now access these settings through the AppleHills > Settings Editor menu.",
|
||||
MessageType.Info);
|
||||
}
|
||||
|
||||
EditorGUILayout.EndScrollView();
|
||||
}
|
||||
|
||||
private void MigrateSettings()
|
||||
{
|
||||
// Create Settings folder if it doesn't exist
|
||||
if (!settingsFolderExists)
|
||||
{
|
||||
AssetDatabase.CreateFolder("Assets", "Settings");
|
||||
settingsFolderExists = true;
|
||||
}
|
||||
|
||||
// Setup Addressables group for settings
|
||||
SetupAddressablesGroup();
|
||||
|
||||
// Create and populate the new settings assets
|
||||
CreatePlayerFollowerSettings();
|
||||
CreateInteractionSettings();
|
||||
CreateMinigameSettings();
|
||||
|
||||
// Save all assets
|
||||
AssetDatabase.SaveAssets();
|
||||
|
||||
migrationCompleted = true;
|
||||
}
|
||||
|
||||
private void SetupAddressablesGroup()
|
||||
{
|
||||
// Find or create a settings group
|
||||
settingsGroup = addressableSettings.FindGroup("Settings");
|
||||
|
||||
if (settingsGroup == null)
|
||||
{
|
||||
settingsGroup = addressableSettings.CreateGroup("Settings", false, false, true, null);
|
||||
}
|
||||
}
|
||||
|
||||
private void AddAssetToAddressables(string assetPath, string address)
|
||||
{
|
||||
// Create entry in addressables
|
||||
var guid = AssetDatabase.AssetPathToGUID(assetPath);
|
||||
var entry = addressableSettings.CreateOrMoveEntry(guid, settingsGroup);
|
||||
|
||||
// Set the address
|
||||
entry.address = address;
|
||||
|
||||
Debug.Log($"Added {assetPath} to Addressables with address {address}");
|
||||
}
|
||||
|
||||
private void CreatePlayerFollowerSettings()
|
||||
{
|
||||
// Create the settings asset
|
||||
var settings = ScriptableObject.CreateInstance<PlayerFollowerSettings>();
|
||||
|
||||
// Copy values from legacy settings
|
||||
if (legacySettings != null)
|
||||
{
|
||||
// Player settings
|
||||
var playerSettings = typeof(GameSettings).GetField("moveSpeed");
|
||||
if (playerSettings != null) settings.GetType().GetField("moveSpeed", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.moveSpeed);
|
||||
|
||||
var stopDistanceField = typeof(GameSettings).GetField("stopDistance");
|
||||
if (stopDistanceField != null) settings.GetType().GetField("stopDistance", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.stopDistance);
|
||||
|
||||
var useRigidbodyField = typeof(GameSettings).GetField("useRigidbody");
|
||||
if (useRigidbodyField != null) settings.GetType().GetField("useRigidbody", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.useRigidbody);
|
||||
|
||||
var defaultHoldMovementModeField = typeof(GameSettings).GetField("defaultHoldMovementMode");
|
||||
if (defaultHoldMovementModeField != null) settings.GetType().GetField("defaultHoldMovementMode", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.defaultHoldMovementMode);
|
||||
|
||||
// Follower settings
|
||||
var followDistanceField = typeof(GameSettings).GetField("followDistance");
|
||||
if (followDistanceField != null) settings.GetType().GetField("followDistance", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.followDistance);
|
||||
|
||||
var manualMoveSmoothField = typeof(GameSettings).GetField("manualMoveSmooth");
|
||||
if (manualMoveSmoothField != null) settings.GetType().GetField("manualMoveSmooth", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.manualMoveSmooth);
|
||||
|
||||
var thresholdFarField = typeof(GameSettings).GetField("thresholdFar");
|
||||
if (thresholdFarField != null) settings.GetType().GetField("thresholdFar", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.thresholdFar);
|
||||
|
||||
var thresholdNearField = typeof(GameSettings).GetField("thresholdNear");
|
||||
if (thresholdNearField != null) settings.GetType().GetField("thresholdNear", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.thresholdNear);
|
||||
|
||||
var stopThresholdField = typeof(GameSettings).GetField("stopThreshold");
|
||||
if (stopThresholdField != null) settings.GetType().GetField("stopThreshold", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.stopThreshold);
|
||||
|
||||
// Backend settings
|
||||
var followUpdateIntervalField = typeof(GameSettings).GetField("followUpdateInterval");
|
||||
if (followUpdateIntervalField != null) settings.GetType().GetField("followUpdateInterval", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.followUpdateInterval);
|
||||
|
||||
var followerSpeedMultiplierField = typeof(GameSettings).GetField("followerSpeedMultiplier");
|
||||
if (followerSpeedMultiplierField != null) settings.GetType().GetField("followerSpeedMultiplier", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.followerSpeedMultiplier);
|
||||
|
||||
var heldIconDisplayHeightField = typeof(GameSettings).GetField("heldIconDisplayHeight");
|
||||
if (heldIconDisplayHeightField != null) settings.GetType().GetField("heldIconDisplayHeight", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.heldIconDisplayHeight);
|
||||
}
|
||||
|
||||
// Save the asset
|
||||
string assetPath = "Assets/Settings/PlayerFollowerSettings.asset";
|
||||
AssetDatabase.CreateAsset(settings, assetPath);
|
||||
|
||||
// Add to addressables
|
||||
AddAssetToAddressables(assetPath, "Settings/PlayerFollowerSettings");
|
||||
|
||||
Debug.Log("Created PlayerFollowerSettings asset");
|
||||
}
|
||||
|
||||
private void CreateInteractionSettings()
|
||||
{
|
||||
// Create the settings asset
|
||||
var settings = ScriptableObject.CreateInstance<InteractionSettings>();
|
||||
|
||||
// Copy values from legacy settings
|
||||
if (legacySettings != null)
|
||||
{
|
||||
// Interaction settings
|
||||
var playerStopDistanceField = typeof(GameSettings).GetField("playerStopDistance");
|
||||
if (playerStopDistanceField != null) settings.GetType().GetField("playerStopDistance", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.playerStopDistance);
|
||||
|
||||
var playerStopDistanceDirectInteractionField = typeof(GameSettings).GetField("playerStopDistanceDirectInteraction");
|
||||
if (playerStopDistanceDirectInteractionField != null) settings.GetType().GetField("playerStopDistanceDirectInteraction", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.playerStopDistanceDirectInteraction);
|
||||
|
||||
var followerPickupDelayField = typeof(GameSettings).GetField("followerPickupDelay");
|
||||
if (followerPickupDelayField != null) settings.GetType().GetField("followerPickupDelay", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.followerPickupDelay);
|
||||
|
||||
var interactableLayerMaskField = typeof(GameSettings).GetField("interactableLayerMask");
|
||||
if (interactableLayerMaskField != null) settings.GetType().GetField("interactableLayerMask", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.interactableLayerMask);
|
||||
|
||||
// Prefabs
|
||||
var basePickupPrefabField = typeof(GameSettings).GetField("basePickupPrefab");
|
||||
if (basePickupPrefabField != null) settings.GetType().GetField("basePickupPrefab", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.basePickupPrefab);
|
||||
|
||||
var levelSwitchMenuPrefabField = typeof(GameSettings).GetField("levelSwitchMenuPrefab");
|
||||
if (levelSwitchMenuPrefabField != null) settings.GetType().GetField("levelSwitchMenuPrefab", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.levelSwitchMenuPrefab);
|
||||
|
||||
// Item configuration
|
||||
var combinationRulesField = typeof(GameSettings).GetField("combinationRules");
|
||||
if (combinationRulesField != null) settings.GetType().GetField("combinationRules", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.combinationRules);
|
||||
|
||||
var slotItemConfigsField = typeof(GameSettings).GetField("slotItemConfigs");
|
||||
if (slotItemConfigsField != null) settings.GetType().GetField("slotItemConfigs", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.slotItemConfigs);
|
||||
}
|
||||
|
||||
// Save the asset
|
||||
string assetPath = "Assets/Settings/InteractionSettings.asset";
|
||||
AssetDatabase.CreateAsset(settings, assetPath);
|
||||
|
||||
// Add to addressables
|
||||
AddAssetToAddressables(assetPath, "Settings/InteractionSettings");
|
||||
|
||||
Debug.Log("Created InteractionSettings asset");
|
||||
}
|
||||
|
||||
private void CreateMinigameSettings()
|
||||
{
|
||||
// Create the settings asset
|
||||
var settings = ScriptableObject.CreateInstance<MinigameSettings>();
|
||||
|
||||
// Copy values from legacy settings
|
||||
if (legacySettings != null)
|
||||
{
|
||||
// Endless descender settings
|
||||
var endlessDescenderLerpSpeedField = typeof(GameSettings).GetField("endlessDescenderLerpSpeed");
|
||||
if (endlessDescenderLerpSpeedField != null) settings.GetType().GetField("endlessDescenderLerpSpeed", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.endlessDescenderLerpSpeed);
|
||||
|
||||
var endlessDescenderMaxOffsetField = typeof(GameSettings).GetField("endlessDescenderMaxOffset");
|
||||
if (endlessDescenderMaxOffsetField != null) settings.GetType().GetField("endlessDescenderMaxOffset", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.endlessDescenderMaxOffset);
|
||||
|
||||
var endlessDescenderClampXMinField = typeof(GameSettings).GetField("endlessDescenderClampXMin");
|
||||
if (endlessDescenderClampXMinField != null) settings.GetType().GetField("endlessDescenderClampXMin", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.endlessDescenderClampXMin);
|
||||
|
||||
var endlessDescenderClampXMaxField = typeof(GameSettings).GetField("endlessDescenderClampXMax");
|
||||
if (endlessDescenderClampXMaxField != null) settings.GetType().GetField("endlessDescenderClampXMax", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.endlessDescenderClampXMax);
|
||||
|
||||
var endlessDescenderSpeedExponentField = typeof(GameSettings).GetField("endlessDescenderSpeedExponent");
|
||||
if (endlessDescenderSpeedExponentField != null) settings.GetType().GetField("endlessDescenderSpeedExponent", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(settings, legacySettings.endlessDescenderSpeedExponent);
|
||||
}
|
||||
|
||||
// Save the asset
|
||||
string assetPath = "Assets/Settings/MinigameSettings.asset";
|
||||
AssetDatabase.CreateAsset(settings, assetPath);
|
||||
|
||||
// Add to addressables
|
||||
AddAssetToAddressables(assetPath, "Settings/MinigameSettings");
|
||||
|
||||
Debug.Log("Created MinigameSettings asset");
|
||||
}
|
||||
}
|
||||
}
|
||||
3
Assets/Editor/SettingsMigrationWindow.cs.meta
Normal file
3
Assets/Editor/SettingsMigrationWindow.cs.meta
Normal file
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b16caebbe9934df3a34f0b75879e65f2
|
||||
timeCreated: 1758630926
|
||||
Reference in New Issue
Block a user