2. 创建编辑器表示
在上一节中,我们已经创建了资源的运行时。在本节,我们来创建资源的编辑器部分。
在 winS.Unity.ResourceManagement 中,每个在运行时需要加载来使用的资源都必须是可索引的。为此,您必须为这些资源创建编辑器表示。
为单个资源创建编辑器表示
我们为上一节中的 Player 预设来创建其编辑器表示。
扩展包中的IEditorResource
用于表示单个编辑器资源,它是一个interface,有众多派生类来表示不同类型的资源。
其中,抽象类winS.UnityEditor.ResourceManagement.EditorPrefabResource
表示预设类型的资源,我们创建名为 EditorPlayer 的编辑器类并继承:
using winS.UnityEditor.ResourceManagement;
public class EditorPlayer : EditorPrefabResource
{
public override string name { get; }
public override string resourcePath { get; }
}
通过上述代码可以看到,EditorPrefabResource 要求子类实现:
- name:该资源的名称,此名称仅作为编辑器下的标识;
- resourcePath:该资源实体的物理路径。此路径基于项目文件夹;
此外,EditorPrefabResource 还有一个名为GetResourceAddress的虚方法:
protected virtual ResourceAddressInfo GetResourceAddress(string name, string path)
该虚方法允许你返回一个winS.UnityEditor.ResourceManagement.ResourceAddressInfo的实例来指定该资源的 Addressables 地址和所在资源组。
我们简单的实现该类:
using winS.UnityEditor.ResourceManagement;
public class EditorPlayer : EditorPrefabResource
{
public override string name => "玩家预设";
public override string resourcePath => "Assets/Prefabs/Player.prefab";
protected override ResourceAddressInfo GetResourceAddress(string name, string path)
{
return new ResourceAddressInfo(MyResources.player.address);
}
}
在上述代码中,我们通过resourcePath属性指定了该资源的实际路径。
同时,我们通过覆写GetResourceAddress方法来指定此资源的地址,确保其与在上一节中定义的运行时表示的地址一致。
为资源组创建编辑器表示
同理,我们为上一节中的 Enemy 资源组来创建其编辑器表示。
Enemy 有3个预设,分别是 Skeleton、Slime 和 Bat,它们是 Enemy 资源组下的单个资源。
扩展包中的IEditorResources
用于表示编辑器资源组,它是一个interface,有众多派生类来表示不同类型的资源组。
其中,抽象类winS.UnityEditor.ResourceManagement.EditorPrefabResources
表示预设类型的资源组,我们创建名为 EditorEnemy 的编辑器类并继承:
using winS.UnityEditor.ResourceManagement;
public class EditorEnemy : EditorPrefabResources
{
public override string name { get; }
public override string resourcesDirectory { get; }
}
通过上述代码可以看到,EditorPrefabResources 要求子类实现:
- name:该资源的名称;
- resourcesDirectory:该系列资源的物理目录。此目录基于项目文件夹;
EditorPrefabResource 同样有名为GetResourceAddress的虚方法,且会为目录下的每个预设都调用此方法:
protected virtual ResourceAddressInfo GetResourceAddress(string name, string path)
我们简单的实现该类:
using winS.UnityEditor.ResourceManagement;
public class EditorEnemy : EditorPrefabResources
{
public override string name => "敌人预设组";
public override string resourcesDirectory => "Assets/Prefabs/Enemy";
protected override ResourceAddressInfo GetResourceAddress(string name, string path)
{
return new ResourceAddressInfo(MyResources.enemy + name);
}
}
通过resourcesDirectory属性,我们指定了这些预设都存放在 "Assets/Prefabs/Enemy" 文件夹下(请确保它们真实存在)。 且在GetResourceAddress方法内,我们指定了这些预设的地址,此时,它们的地址应为:
- Skeleton:Enemy/Skeleton;
- Slime:Enemy/Slime;
- Bat:Enemy/Bat;
至此,我们已经完成了本次示例中所有预设地址的设置,在下一节中,我们将在编辑器中管理它们。