Browse Source

Add: module loaders

AnnulusGames 11 months ago
parent
commit
6cc66e3c1a

+ 114 - 0
src/Lua.Unity/Assets/AddressableAssetsData/AddressableAssetSettings.asset

@@ -0,0 +1,114 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 468a46d0ae32c3544b7d98094e6448a9, type: 3}
+  m_Name: AddressableAssetSettings
+  m_EditorClassIdentifier: 
+  m_DefaultGroup: 2a0e06d9ccf214f8fa1ca5d1510af7d2
+  m_currentHash:
+    serializedVersion: 2
+    Hash: 00000000000000000000000000000000
+  m_OptimizeCatalogSize: 0
+  m_BuildRemoteCatalog: 0
+  m_CatalogRequestsTimeout: 0
+  m_DisableCatalogUpdateOnStart: 0
+  m_InternalIdNamingMode: 0
+  m_InternalBundleIdMode: 1
+  m_AssetLoadMode: 0
+  m_BundledAssetProviderType:
+    m_AssemblyName: 
+    m_ClassName: 
+  m_AssetBundleProviderType:
+    m_AssemblyName: 
+    m_ClassName: 
+  m_IgnoreUnsupportedFilesInBuild: 0
+  m_UniqueBundleIds: 0
+  m_EnableJsonCatalog: 0
+  m_NonRecursiveBuilding: 1
+  m_CCDEnabled: 0
+  m_maxConcurrentWebRequests: 3
+  m_UseUWRForLocalBundles: 0
+  m_BundleTimeout: 0
+  m_BundleRetryCount: 0
+  m_BundleRedirectLimit: -1
+  m_SharedBundleSettings: 0
+  m_SharedBundleSettingsCustomGroupIndex: 0
+  m_ContiguousBundles: 1
+  m_StripUnityVersionFromBundleBuild: 0
+  m_DisableVisibleSubAssetRepresentations: 0
+  m_BuiltInBundleNaming: 0
+  mBuiltInBundleCustomNaming: 
+  m_MonoScriptBundleNaming: 0
+  m_CheckForContentUpdateRestrictionsOption: 0
+  m_MonoScriptBundleCustomNaming: 
+  m_RemoteCatalogBuildPath:
+    m_Id: 
+  m_RemoteCatalogLoadPath:
+    m_Id: 
+  m_ContentStateBuildPathProfileVariableName: 
+  m_CustomContentStateBuildPath: 
+  m_ContentStateBuildPath: 
+  m_BuildAddressablesWithPlayerBuild: 0
+  m_overridePlayerVersion: '[UnityEditor.PlayerSettings.bundleVersion]'
+  m_GroupAssets:
+  - {fileID: 11400000, guid: 30f1ec4a0d3c9473d9b32a1b02474847, type: 2}
+  m_BuildSettings:
+    m_LogResourceManagerExceptions: 1
+    m_BundleBuildPath: Temp/com.unity.addressables/AssetBundles
+  m_ProfileSettings:
+    m_Profiles:
+    - m_InheritedParent: 
+      m_Id: 1d0a56529a3514cf1aebb59dc61a2305
+      m_ProfileName: Default
+      m_Values:
+      - m_Id: 3d2c4246f2d9c4355b5acd8b3a19e557
+        m_Value: 'ServerData/[BuildTarget]'
+      - m_Id: 717ab8aa570a245ef8065628c9ff1501
+        m_Value: <undefined>
+      - m_Id: 7deb6bdcfd7e148bd8e411f164e168ad
+        m_Value: '{UnityEngine.AddressableAssets.Addressables.RuntimePath}/[BuildTarget]'
+      - m_Id: c649b540d1bf94a80844c4472c08a22b
+        m_Value: '[UnityEditor.EditorUserBuildSettings.activeBuildTarget]'
+      - m_Id: e169f91311e984e908fcdcff8215d9b9
+        m_Value: '[UnityEngine.AddressableAssets.Addressables.BuildPath]/[BuildTarget]'
+    m_ProfileEntryNames:
+    - m_Id: 3d2c4246f2d9c4355b5acd8b3a19e557
+      m_Name: Remote.BuildPath
+      m_InlineUsage: 0
+    - m_Id: 717ab8aa570a245ef8065628c9ff1501
+      m_Name: Remote.LoadPath
+      m_InlineUsage: 0
+    - m_Id: 7deb6bdcfd7e148bd8e411f164e168ad
+      m_Name: Local.LoadPath
+      m_InlineUsage: 0
+    - m_Id: c649b540d1bf94a80844c4472c08a22b
+      m_Name: BuildTarget
+      m_InlineUsage: 0
+    - m_Id: e169f91311e984e908fcdcff8215d9b9
+      m_Name: Local.BuildPath
+      m_InlineUsage: 0
+    m_ProfileVersion: 1
+  m_LabelTable:
+    m_LabelNames:
+    - default
+  m_SchemaTemplates: []
+  m_GroupTemplateObjects:
+  - {fileID: 11400000, guid: faa35a57f036243239643631bf4ab68d, type: 2}
+  m_InitializationObjects: []
+  m_CertificateHandlerType:
+    m_AssemblyName: 
+    m_ClassName: 
+  m_ActivePlayerDataBuilderIndex: 2
+  m_DataBuilders:
+  - {fileID: 11400000, guid: d6921a29df7234327863bccd63d917f6, type: 2}
+  - {fileID: 11400000, guid: 703d4c54c8176478e87c027f44a5424e, type: 2}
+  - {fileID: 11400000, guid: 276c7bc6c400449ed930dde9a70d1e70, type: 2}
+  m_ActiveProfileId: 1d0a56529a3514cf1aebb59dc61a2305

+ 78 - 0
src/Lua.Unity/Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets.asset

@@ -0,0 +1,78 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &-3850481184973069613
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 5834b5087d578d24c926ce20cd31e6d6, type: 3}
+  m_Name: ContentUpdateGroupSchema
+  m_EditorClassIdentifier: 
+  m_Group: {fileID: 0}
+  m_StaticContent: 0
+--- !u!114 &-1664902330954257685
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: e5d17a21594effb4e9591490b009e7aa, type: 3}
+  m_Name: BundledAssetGroupSchema
+  m_EditorClassIdentifier: 
+  m_Group: {fileID: 0}
+  m_InternalBundleIdMode: 1
+  m_Compression: 1
+  m_IncludeAddressInCatalog: 1
+  m_IncludeGUIDInCatalog: 1
+  m_IncludeLabelsInCatalog: 1
+  m_InternalIdNamingMode: 0
+  m_CacheClearBehavior: 0
+  m_IncludeInBuild: 1
+  m_BundledAssetProviderType:
+    m_AssemblyName: 
+    m_ClassName: 
+  m_ForceUniqueProvider: 0
+  m_UseAssetBundleCache: 1
+  m_UseAssetBundleCrc: 1
+  m_UseAssetBundleCrcForCachedBundles: 1
+  m_UseUWRForLocalBundles: 0
+  m_Timeout: 0
+  m_ChunkedTransfer: 0
+  m_RedirectLimit: -1
+  m_RetryCount: 0
+  m_BuildPath:
+    m_Id: 
+  m_LoadPath:
+    m_Id: 
+  m_BundleMode: 0
+  m_AssetBundleProviderType:
+    m_AssemblyName: 
+    m_ClassName: 
+  m_UseDefaultSchemaSettings: 0
+  m_SelectedPathPairIndex: 0
+  m_BundleNaming: 0
+  m_AssetLoadMode: 0
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1a3c5d64ac83548c09dd1678b9f6f1cd, type: 3}
+  m_Name: Packed Assets
+  m_EditorClassIdentifier: 
+  m_SchemaObjects:
+  - {fileID: -1664902330954257685}
+  - {fileID: -3850481184973069613}
+  m_Description: Pack assets into asset bundles.
+  m_Settings: {fileID: 11400000, guid: f1d773be05107486d85b5a324c1c2fb0, type: 2}

+ 28 - 0
src/Lua.Unity/Assets/AddressableAssetsData/AssetGroups/Default Local Group.asset

@@ -0,0 +1,28 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: bbb281ee3bf0b054c82ac2347e9e782c, type: 3}
+  m_Name: Default Local Group
+  m_EditorClassIdentifier: 
+  m_GroupName: Default Local Group
+  m_GUID: 2a0e06d9ccf214f8fa1ca5d1510af7d2
+  m_SerializeEntries:
+  - m_GUID: c611eb631438746b991def52ebe74776
+    m_Address: bar
+    m_ReadOnly: 0
+    m_SerializedLabels: []
+    FlaggedDuringContentUpdateRestriction: 0
+  m_ReadOnly: 0
+  m_Settings: {fileID: 11400000, guid: f1d773be05107486d85b5a324c1c2fb0, type: 2}
+  m_SchemaSet:
+    m_Schemas:
+    - {fileID: 11400000, guid: 1476390b038364f2f800595d61171b27, type: 2}
+    - {fileID: 11400000, guid: 7ebbf8a9fd56642d283eb1ef4c8ccf85, type: 2}

+ 47 - 0
src/Lua.Unity/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_BundledAssetGroupSchema.asset

@@ -0,0 +1,47 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: e5d17a21594effb4e9591490b009e7aa, type: 3}
+  m_Name: Default Local Group_BundledAssetGroupSchema
+  m_EditorClassIdentifier: 
+  m_Group: {fileID: 11400000, guid: 30f1ec4a0d3c9473d9b32a1b02474847, type: 2}
+  m_InternalBundleIdMode: 1
+  m_Compression: 1
+  m_IncludeAddressInCatalog: 1
+  m_IncludeGUIDInCatalog: 1
+  m_IncludeLabelsInCatalog: 1
+  m_InternalIdNamingMode: 0
+  m_CacheClearBehavior: 0
+  m_IncludeInBuild: 1
+  m_BundledAssetProviderType:
+    m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+    m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider
+  m_ForceUniqueProvider: 0
+  m_UseAssetBundleCache: 1
+  m_UseAssetBundleCrc: 1
+  m_UseAssetBundleCrcForCachedBundles: 1
+  m_UseUWRForLocalBundles: 0
+  m_Timeout: 0
+  m_ChunkedTransfer: 0
+  m_RedirectLimit: -1
+  m_RetryCount: 0
+  m_BuildPath:
+    m_Id: e169f91311e984e908fcdcff8215d9b9
+  m_LoadPath:
+    m_Id: 7deb6bdcfd7e148bd8e411f164e168ad
+  m_BundleMode: 0
+  m_AssetBundleProviderType:
+    m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+    m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider
+  m_UseDefaultSchemaSettings: 0
+  m_SelectedPathPairIndex: 0
+  m_BundleNaming: 0
+  m_AssetLoadMode: 0

+ 16 - 0
src/Lua.Unity/Assets/AddressableAssetsData/AssetGroups/Schemas/Default Local Group_ContentUpdateGroupSchema.asset

@@ -0,0 +1,16 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 5834b5087d578d24c926ce20cd31e6d6, type: 3}
+  m_Name: Default Local Group_ContentUpdateGroupSchema
+  m_EditorClassIdentifier: 
+  m_Group: {fileID: 11400000, guid: 30f1ec4a0d3c9473d9b32a1b02474847, type: 2}
+  m_StaticContent: 0

+ 20 - 0
src/Lua.Unity/Assets/AddressableAssetsData/DataBuilders/BuildScriptFastMode.asset

@@ -0,0 +1,20 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 88d21199f5d473f4db36845f2318f180, type: 3}
+  m_Name: BuildScriptFastMode
+  m_EditorClassIdentifier: 
+  instanceProviderType:
+    m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+    m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.InstanceProvider
+  sceneProviderType:
+    m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+    m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.SceneProvider

+ 20 - 0
src/Lua.Unity/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedMode.asset

@@ -0,0 +1,20 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 3e2e0ffa088c91d41a086d0b8cb16bdc, type: 3}
+  m_Name: BuildScriptPackedMode
+  m_EditorClassIdentifier: 
+  instanceProviderType:
+    m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+    m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.InstanceProvider
+  sceneProviderType:
+    m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+    m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.SceneProvider

+ 20 - 0
src/Lua.Unity/Assets/AddressableAssetsData/DataBuilders/BuildScriptPackedPlayMode.asset

@@ -0,0 +1,20 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: ad8c280d42ee0ed41a27db23b43dd2bf, type: 3}
+  m_Name: BuildScriptPackedPlayMode
+  m_EditorClassIdentifier: 
+  instanceProviderType:
+    m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+    m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.InstanceProvider
+  sceneProviderType:
+    m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+    m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.SceneProvider

+ 15 - 0
src/Lua.Unity/Assets/AddressableAssetsData/DefaultObject.asset

@@ -0,0 +1,15 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 3a189bb168d8d90478a09ea08c2f3d72, type: 3}
+  m_Name: DefaultObject
+  m_EditorClassIdentifier: 
+  m_AddressableAssetSettingsGuid: f1d773be05107486d85b5a324c1c2fb0

+ 1 - 1
src/Lua.Unity/Assets/Lua.Unity/Editor/LuaImporter.cs

@@ -5,7 +5,7 @@ using UnityEngine;
 namespace Lua.Unity.Editor
 {
     [ScriptedImporter(1, "lua")]
-    public class LuaImporter : ScriptedImporter
+    public sealed class LuaImporter : ScriptedImporter
     {
         public override void OnImportAsset(AssetImportContext ctx)
         {

+ 82 - 0
src/Lua.Unity/Assets/Lua.Unity/Runtime/AddressablesModuleLoader.cs

@@ -0,0 +1,82 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Threading;
+using System.Threading.Tasks;
+using UnityEngine.AddressableAssets;
+using UnityEngine.ResourceManagement.AsyncOperations;
+
+namespace Lua.Unity
+{
+    public sealed class AddressablesModuleLoader : ILuaModuleLoader
+    {
+        readonly Dictionary<string, LuaAsset> cache = new();
+
+        public bool Exists(string moduleName)
+        {
+            if (cache.TryGetValue(moduleName, out _)) return true;
+
+            var location = Addressables.LoadResourceLocationsAsync(moduleName).WaitForCompletion();
+            return location.Any();
+        }
+
+        public async ValueTask<LuaModule> LoadAsync(string moduleName, CancellationToken cancellationToken = default)
+        {
+            if (cache.TryGetValue(moduleName, out var asset))
+            {
+                return new LuaModule(moduleName, asset.text);
+            }
+
+            var asyncOperation = Addressables.LoadAssetAsync<LuaAsset>(moduleName);
+            asset = await asyncOperation;
+
+            if (asset == null)
+            {
+                throw new LuaModuleNotFoundException(moduleName);
+            }
+
+            cache.Add(moduleName, asset);
+            return new LuaModule(moduleName, asset.text);
+        }
+    }
+    internal static class AsyncOperationHandleExtensions
+    {
+        public static AsyncOperationHandleAwaiter<T> GetAwaiter<T>(this AsyncOperationHandle<T> asyncOperationHandle)
+        {
+            return new AsyncOperationHandleAwaiter<T>(asyncOperationHandle);
+        }
+
+        public readonly struct AsyncOperationHandleAwaiter<T> : ICriticalNotifyCompletion
+        {
+            public AsyncOperationHandleAwaiter(AsyncOperationHandle<T> asyncOperationHandle)
+            {
+                this.asyncOperationHandle = asyncOperationHandle;
+            }
+
+            readonly AsyncOperationHandle<T> asyncOperationHandle;
+
+            public bool IsCompleted => asyncOperationHandle.IsDone;
+
+            public void OnCompleted(Action continuation)
+            {
+                asyncOperationHandle.Completed += x => continuation.Invoke();
+            }
+
+            public void UnsafeOnCompleted(Action continuation)
+            {
+                asyncOperationHandle.Completed += x => continuation.Invoke();
+            }
+
+            public T GetResult()
+            {
+                return asyncOperationHandle.Result;
+            }
+
+            public AsyncOperationHandleAwaiter<T> GetAwaiter()
+            {
+                return this;
+            }
+        }
+    }
+}

+ 11 - 2
src/Lua.Unity/Assets/Lua.Unity/Runtime/Lua.Unity.asmdef

@@ -1,7 +1,10 @@
 {
     "name": "Lua.Unity",
     "rootNamespace": "",
-    "references": [],
+    "references": [
+        "GUID:9e24947de15b9834991c9d8411ea37cf",
+        "GUID:84651a3751eca9349aac36a66bba901b"
+    ],
     "includePlatforms": [],
     "excludePlatforms": [],
     "allowUnsafeCode": false,
@@ -11,6 +14,12 @@
     ],
     "autoReferenced": true,
     "defineConstraints": [],
-    "versionDefines": [],
+    "versionDefines": [
+        {
+            "name": "com.unity.addressables",
+            "expression": "",
+            "define": "LUA_UNITY_ADDRESSABLES"
+        }
+    ],
     "noEngineReferences": false
 }

+ 86 - 0
src/Lua.Unity/Assets/Lua.Unity/Runtime/ResourcesModuleLoader.cs

@@ -0,0 +1,86 @@
+using System;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+using System.Threading;
+using System.Threading.Tasks;
+using UnityEngine;
+
+namespace Lua.Unity
+{
+    public sealed class ResourcesModuleLoader : ILuaModuleLoader
+    {
+        readonly Dictionary<string, LuaAsset> cache = new();
+
+        public bool Exists(string moduleName)
+        {
+            if (cache.TryGetValue(moduleName, out _)) return true;
+
+            var asset = Resources.Load<LuaAsset>(moduleName);
+            if (asset == null) return false;
+
+            cache.Add(moduleName, asset);
+            return true;
+        }
+
+        public async ValueTask<LuaModule> LoadAsync(string moduleName, CancellationToken cancellationToken = default)
+        {
+            if (cache.TryGetValue(moduleName, out var asset))
+            {
+                return new LuaModule(moduleName, asset.text);
+            }
+
+            var request = Resources.LoadAsync<LuaAsset>(moduleName);
+            await request;
+
+            if (request.asset == null)
+            {
+                throw new LuaModuleNotFoundException(moduleName);
+            }
+
+            asset = (LuaAsset)request.asset;
+            cache.Add(moduleName, asset);
+            return new LuaModule(moduleName, asset.text);
+        }
+    }
+
+#if !UNITY_2023_1_OR_NEWER
+    internal static class ResourceRequestExtensions
+    {
+        public static ResourceRequestAwaiter GetAwaiter(this ResourceRequest request)
+        {
+            return new ResourceRequestAwaiter(request);
+        }
+
+        public readonly struct ResourceRequestAwaiter : ICriticalNotifyCompletion
+        {
+            public ResourceRequestAwaiter(ResourceRequest request)
+            {
+                this.request = request;
+            }
+
+            readonly ResourceRequest request;
+
+            public bool IsCompleted => request.isDone;
+
+            public void OnCompleted(Action continuation)
+            {
+                request.completed += x => continuation.Invoke();
+            }
+
+            public void UnsafeOnCompleted(Action continuation)
+            {
+                request.completed += x => continuation.Invoke();
+            }
+            
+            public void GetResult()
+            {
+            }
+
+            public ResourceRequestAwaiter GetAwaiter()
+            {
+                return this;
+            }
+        }
+    }
+#endif
+}

+ 7 - 0
src/Lua.Unity/Assets/Sandbox/Resources/foo.lua

@@ -0,0 +1,7 @@
+local t = {}
+
+t.greet = function()
+    print("Foo: Hello!")
+end
+
+return t

+ 56 - 8
src/Lua.Unity/Assets/Sandbox/SampleScene.unity

@@ -38,12 +38,12 @@ RenderSettings:
   m_ReflectionIntensity: 1
   m_CustomReflection: {fileID: 0}
   m_Sun: {fileID: 0}
-  m_IndirectSpecularColor: {r: 0.18028378, g: 0.22571412, b: 0.30692285, a: 1}
   m_UseRadianceAmbientProbe: 0
 --- !u!157 &3
 LightmapSettings:
   m_ObjectHideFlags: 0
-  serializedVersion: 12
+  serializedVersion: 13
+  m_BakeOnSceneLoad: 0
   m_GISettings:
     serializedVersion: 2
     m_BounceScale: 1
@@ -250,12 +250,12 @@ MonoBehaviour:
   m_RequiresColorTexture: 0
   m_Version: 2
   m_TaaSettings:
-    quality: 3
-    frameInfluence: 0.1
-    jitterScale: 1
-    mipBias: 0
-    varianceClampScale: 0.9
-    contrastAdaptiveSharpening: 0
+    m_Quality: 3
+    m_FrameInfluence: 0.1
+    m_JitterScale: 1
+    m_MipBias: 0
+    m_VarianceClampScale: 0.9
+    m_ContrastAdaptiveSharpening: 0
 --- !u!1 &410087039
 GameObject:
   m_ObjectHideFlags: 0
@@ -336,6 +336,9 @@ Light:
   m_ForceVisible: 0
   m_ShadowRadius: 0
   m_ShadowAngle: 0
+  m_LightUnit: 1
+  m_LuxAtDistance: 1
+  m_EnableSpotReflector: 1
 --- !u!4 &410087041
 Transform:
   m_ObjectHideFlags: 0
@@ -423,6 +426,50 @@ Transform:
   m_Children: []
   m_Father: {fileID: 0}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &948832268
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 948832270}
+  - component: {fileID: 948832269}
+  m_Layer: 0
+  m_Name: Sandbox
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &948832269
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 948832268}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: c59c64163ef484bb6a193121e8fc388c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!4 &948832270
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 948832268}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!1660057539 &9223372036854775807
 SceneRoots:
   m_ObjectHideFlags: 0
@@ -430,3 +477,4 @@ SceneRoots:
   - {fileID: 330585546}
   - {fileID: 410087041}
   - {fileID: 832575519}
+  - {fileID: 948832270}

+ 39 - 0
src/Lua.Unity/Assets/Sandbox/Sandbox.cs

@@ -0,0 +1,39 @@
+using System;
+using Lua;
+using Lua.Loaders;
+using Lua.Standard;
+using Lua.Unity;
+using UnityEngine;
+
+public class Sandbox : MonoBehaviour
+{
+    async void Start()
+    {
+        var state = LuaState.Create();
+        state.ModuleLoader = CompositeModuleLoader.Create(new AddressablesModuleLoader(), new ResourcesModuleLoader());
+        state.OpenStandardLibraries();
+        state.Environment["print"] = new LuaFunction("print", (context, buffer, ct) =>
+        {
+            Debug.Log(context.GetArgument<string>(0));
+            return new(0);
+        });
+
+        try
+        {
+            await state.DoStringAsync(
+    @"
+print('test start')
+local foo = require 'foo'
+foo.greet()
+
+local bar = require 'bar'
+bar.greet()
+
+", cancellationToken: destroyCancellationToken);
+        }
+        catch (Exception ex)
+        {
+            Debug.LogException(ex);
+        }
+    }
+}

+ 7 - 0
src/Lua.Unity/Assets/Sandbox/bar.lua

@@ -0,0 +1,7 @@
+local t = {}
+
+t.greet = function()
+    print("Bar: Hello!")
+end
+
+return t

+ 1 - 0
src/Lua.Unity/ProjectSettings/EditorBuildSettings.asset

@@ -9,5 +9,6 @@ EditorBuildSettings:
     path: Assets/Sandbox/SampleScene.unity
     guid: 99c9720ab356a0642a771bea13969a05
   m_configObjects:
+    com.unity.addressableassets: {fileID: 11400000, guid: 5b124f60b731f48fba10f000d3390a42, type: 2}
     com.unity.input.settings.actions: {fileID: -944628639613478452, guid: 052faaac586de48259a63d0c4782560b, type: 3}
   m_UseUCBPForAssetBundles: 0