Unity实现子目录下的Plugins加载

记得在以前的博客里就提到过probing的privatePath属性可以定义当前AppDomain搜索程序集文件的目录。比如当前应用程序使用A.dll,但是A.dll并没有直接存放在AppDomain的根目录下,而是存储于子目录。在应用程序配置文件中添加probing privatePath可以解决这个问题。看一个配置简单示例:

<runtime>
  <assemblyBinding xmlns=”urn:schemas-microsoft-com:asm.v1″>
    <probing privatePath=”Bin2″ />
  </assemblyBinding>
</runtime>

privatePath只可以是相对路径,并以’;'符号分隔。如果为绝对路径则无法加载。Unity本身是无法实现不同物理存储模块的加载,被注册类型必须存在于当前的AppDomain中,否则内部调用Type.GetType函数会抛出异常。对于一个Plugin容器,它的Plugins会存放在分类目录中便于管理。如果你并不想为每一个Plugin隔离加载或者多个Plugin存储在完全不同的目录下,那么可以考虑还是用Unity吧。在你的应用程序配置文件中添加多个probing privatePath就可以。看一个简单的示例:

 

ComponentModel是一个程序集,它定义了一个IAction接口:

 

1 namespace ComponentModel
2 {
3   public interface IAction
4   {
5     void DoWork();
6   }
7 }

ClassLibrary1是一个插件程序集,Action1实现了ComponentModel的IAction接口。

 1 using ComponentModel;
 2 
 3 namespace ClassLibrary1
 4 {
 5   public sealed class Action1 : IAction
 6   {
 7     #region IAction Members
 8 
 9     public void DoWork()
10     {
11 
12     }
13 
14     #endregion
15   }
16 }

UnityTest8是一个插件容器,它的配置文件如下:

<?xml version=”1.0″ encoding=”utf-8″ ?>
<configuration>
  <configSections>
    <section name=”unity” type=”Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration”/>
  </configSections>

  <unity xmlns=”http://schemas.microsoft.com/practices/2010/unity”>
    <assembly name=”ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null” />
    <assembly name=”ComponentModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null” />

    <container>
      <register type=”ComponentModel.IAction” mapTo=”ClassLibrary1.Action1″ />
    </container>
  </unity>

  <runtime>
    <assemblyBinding xmlns=”urn:schemas-microsoft-com:asm.v1″>
      <probing privatePath=”Plugins\Plugin1″ />
    </assemblyBinding>
  </runtime>
</configuration>

当前AppDomain根目录下有一个子目录Plugins\Plugin1存放了IAction的实现ClassLibrary1.dll。现在通过Unity创建IAction的实现:

1 IUnityContainer unityContainer = new UnityContainer();
2 unityContainer.LoadConfiguration();
3 
4 IAction action = unityContainer.Resolve<IAction>();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Unity加载目录下的音频文件,你可以使用`Application.streamingAssetsPath`获取根目录的路径,然后使用`UnityWebRequest`加载音频文件。下面是一个示例代码: ```csharp using UnityEngine; using UnityEngine.Networking; public class AudioLoader : MonoBehaviour { private AudioSource audioSource; private void Start() { audioSource = GetComponent<AudioSource>(); string audioFilePath = Application.streamingAssetsPath + "/audioFile.mp3"; StartCoroutine(LoadAudioFromPath(audioFilePath)); } private IEnumerator LoadAudioFromPath(string path) { string audioURL = ""; // 在移动平台上,需要使用"jar:file://"前缀 if (Application.platform == RuntimePlatform.Android) { audioURL = "jar:file://" + path; } else { audioURL = "file://" + path; } using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(audioURL, AudioType.MPEG)) { yield return www.SendWebRequest(); if (www.result != UnityWebRequest.Result.Success) { Debug.LogError("Failed to load audio: " + www.error); } else { AudioClip audioClip = DownloadHandlerAudioClip.GetContent(www); audioSource.clip = audioClip; audioSource.Play(); } } } } ``` 这段代码首先获取一个`AudioSource`组件,然后使用`Application.streamingAssetsPath`获取根目录的路径,并将音频文件名添加到路径后面。然后,根据当前平台构建正确的音频URL。在Android平台上,将路径前缀设置为"jar:file://",在其他平台上,设置为"file://"。最后,使用`UnityWebRequest`从URL加载音频文件。 请将`audioFile.mp3`替换为你实际的音频文件名。确保音频文件位于Unity项目的根目录中,并正确设置Unity的平台设置以支持加载外部文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值