@ -0,0 +1,9 @@ |
|||||||
|
fileFormatVersion: 2 |
||||||
|
guid: 5ff164265158945c18b7d438b570ba22 |
||||||
|
folderAsset: yes |
||||||
|
timeCreated: 1478502248 |
||||||
|
licenseType: Free |
||||||
|
DefaultImporter: |
||||||
|
userData: |
||||||
|
assetBundleName: |
||||||
|
assetBundleVariant: |
@ -0,0 +1,9 @@ |
|||||||
|
fileFormatVersion: 2 |
||||||
|
guid: 5e5a1319ef7f546a7affe3baabd5fba6 |
||||||
|
folderAsset: yes |
||||||
|
timeCreated: 1478502692 |
||||||
|
licenseType: Free |
||||||
|
DefaultImporter: |
||||||
|
userData: |
||||||
|
assetBundleName: |
||||||
|
assetBundleVariant: |
After Width: | Height: | Size: 865 B |
After Width: | Height: | Size: 865 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.0 KiB |
@ -0,0 +1,59 @@ |
|||||||
|
fileFormatVersion: 2 |
||||||
|
guid: 5a87a7d3683164a238377d948572805f |
||||||
|
timeCreated: 1478502692 |
||||||
|
licenseType: Free |
||||||
|
TextureImporter: |
||||||
|
fileIDToRecycleName: {} |
||||||
|
serializedVersion: 2 |
||||||
|
mipmaps: |
||||||
|
mipMapMode: 0 |
||||||
|
enableMipMap: 0 |
||||||
|
linearTexture: 1 |
||||||
|
correctGamma: 0 |
||||||
|
fadeOut: 0 |
||||||
|
borderMipMap: 0 |
||||||
|
mipMapFadeDistanceStart: 1 |
||||||
|
mipMapFadeDistanceEnd: 3 |
||||||
|
bumpmap: |
||||||
|
convertToNormalMap: 0 |
||||||
|
externalNormalMap: 0 |
||||||
|
heightScale: 0.25 |
||||||
|
normalMapFilter: 0 |
||||||
|
isReadable: 0 |
||||||
|
grayScaleToAlpha: 0 |
||||||
|
generateCubemap: 0 |
||||||
|
cubemapConvolution: 0 |
||||||
|
cubemapConvolutionSteps: 7 |
||||||
|
cubemapConvolutionExponent: 1.5 |
||||||
|
seamlessCubemap: 0 |
||||||
|
textureFormat: -3 |
||||||
|
maxTextureSize: 2048 |
||||||
|
textureSettings: |
||||||
|
filterMode: -1 |
||||||
|
aniso: 1 |
||||||
|
mipBias: -1 |
||||||
|
wrapMode: 1 |
||||||
|
nPOTScale: 0 |
||||||
|
lightmap: 0 |
||||||
|
rGBM: 0 |
||||||
|
compressionQuality: 50 |
||||||
|
allowsAlphaSplitting: 0 |
||||||
|
spriteMode: 0 |
||||||
|
spriteExtrude: 1 |
||||||
|
spriteMeshType: 1 |
||||||
|
alignment: 0 |
||||||
|
spritePivot: {x: 0.5, y: 0.5} |
||||||
|
spriteBorder: {x: 0, y: 0, z: 0, w: 0} |
||||||
|
spritePixelsToUnits: 100 |
||||||
|
alphaIsTransparency: 1 |
||||||
|
spriteTessellationDetail: -1 |
||||||
|
textureType: 2 |
||||||
|
buildTargetSettings: [] |
||||||
|
spriteSheet: |
||||||
|
serializedVersion: 2 |
||||||
|
sprites: [] |
||||||
|
outline: [] |
||||||
|
spritePackingTag: |
||||||
|
userData: |
||||||
|
assetBundleName: |
||||||
|
assetBundleVariant: |
After Width: | Height: | Size: 1.1 KiB |
@ -0,0 +1,59 @@ |
|||||||
|
fileFormatVersion: 2 |
||||||
|
guid: 2f17490d993c84bd7872ef6588ffba47 |
||||||
|
timeCreated: 1478502692 |
||||||
|
licenseType: Free |
||||||
|
TextureImporter: |
||||||
|
fileIDToRecycleName: {} |
||||||
|
serializedVersion: 2 |
||||||
|
mipmaps: |
||||||
|
mipMapMode: 0 |
||||||
|
enableMipMap: 0 |
||||||
|
linearTexture: 1 |
||||||
|
correctGamma: 0 |
||||||
|
fadeOut: 0 |
||||||
|
borderMipMap: 0 |
||||||
|
mipMapFadeDistanceStart: 1 |
||||||
|
mipMapFadeDistanceEnd: 3 |
||||||
|
bumpmap: |
||||||
|
convertToNormalMap: 0 |
||||||
|
externalNormalMap: 0 |
||||||
|
heightScale: 0.25 |
||||||
|
normalMapFilter: 0 |
||||||
|
isReadable: 0 |
||||||
|
grayScaleToAlpha: 0 |
||||||
|
generateCubemap: 0 |
||||||
|
cubemapConvolution: 0 |
||||||
|
cubemapConvolutionSteps: 7 |
||||||
|
cubemapConvolutionExponent: 1.5 |
||||||
|
seamlessCubemap: 0 |
||||||
|
textureFormat: -3 |
||||||
|
maxTextureSize: 2048 |
||||||
|
textureSettings: |
||||||
|
filterMode: -1 |
||||||
|
aniso: 1 |
||||||
|
mipBias: -1 |
||||||
|
wrapMode: 1 |
||||||
|
nPOTScale: 0 |
||||||
|
lightmap: 0 |
||||||
|
rGBM: 0 |
||||||
|
compressionQuality: 50 |
||||||
|
allowsAlphaSplitting: 0 |
||||||
|
spriteMode: 0 |
||||||
|
spriteExtrude: 1 |
||||||
|
spriteMeshType: 1 |
||||||
|
alignment: 0 |
||||||
|
spritePivot: {x: 0.5, y: 0.5} |
||||||
|
spriteBorder: {x: 0, y: 0, z: 0, w: 0} |
||||||
|
spritePixelsToUnits: 100 |
||||||
|
alphaIsTransparency: 1 |
||||||
|
spriteTessellationDetail: -1 |
||||||
|
textureType: 2 |
||||||
|
buildTargetSettings: [] |
||||||
|
spriteSheet: |
||||||
|
serializedVersion: 2 |
||||||
|
sprites: [] |
||||||
|
outline: [] |
||||||
|
spritePackingTag: |
||||||
|
userData: |
||||||
|
assetBundleName: |
||||||
|
assetBundleVariant: |
After Width: | Height: | Size: 1.0 KiB |
@ -0,0 +1,59 @@ |
|||||||
|
fileFormatVersion: 2 |
||||||
|
guid: 2a76a781db2994b33b83cd84b8835da7 |
||||||
|
timeCreated: 1478502692 |
||||||
|
licenseType: Free |
||||||
|
TextureImporter: |
||||||
|
fileIDToRecycleName: {} |
||||||
|
serializedVersion: 2 |
||||||
|
mipmaps: |
||||||
|
mipMapMode: 0 |
||||||
|
enableMipMap: 0 |
||||||
|
linearTexture: 1 |
||||||
|
correctGamma: 0 |
||||||
|
fadeOut: 0 |
||||||
|
borderMipMap: 0 |
||||||
|
mipMapFadeDistanceStart: 1 |
||||||
|
mipMapFadeDistanceEnd: 3 |
||||||
|
bumpmap: |
||||||
|
convertToNormalMap: 0 |
||||||
|
externalNormalMap: 0 |
||||||
|
heightScale: 0.25 |
||||||
|
normalMapFilter: 0 |
||||||
|
isReadable: 0 |
||||||
|
grayScaleToAlpha: 0 |
||||||
|
generateCubemap: 0 |
||||||
|
cubemapConvolution: 0 |
||||||
|
cubemapConvolutionSteps: 7 |
||||||
|
cubemapConvolutionExponent: 1.5 |
||||||
|
seamlessCubemap: 0 |
||||||
|
textureFormat: -3 |
||||||
|
maxTextureSize: 2048 |
||||||
|
textureSettings: |
||||||
|
filterMode: -1 |
||||||
|
aniso: 1 |
||||||
|
mipBias: -1 |
||||||
|
wrapMode: 1 |
||||||
|
nPOTScale: 0 |
||||||
|
lightmap: 0 |
||||||
|
rGBM: 0 |
||||||
|
compressionQuality: 50 |
||||||
|
allowsAlphaSplitting: 0 |
||||||
|
spriteMode: 0 |
||||||
|
spriteExtrude: 1 |
||||||
|
spriteMeshType: 1 |
||||||
|
alignment: 0 |
||||||
|
spritePivot: {x: 0.5, y: 0.5} |
||||||
|
spriteBorder: {x: 0, y: 0, z: 0, w: 0} |
||||||
|
spritePixelsToUnits: 100 |
||||||
|
alphaIsTransparency: 1 |
||||||
|
spriteTessellationDetail: -1 |
||||||
|
textureType: 2 |
||||||
|
buildTargetSettings: [] |
||||||
|
spriteSheet: |
||||||
|
serializedVersion: 2 |
||||||
|
sprites: [] |
||||||
|
outline: [] |
||||||
|
spritePackingTag: |
||||||
|
userData: |
||||||
|
assetBundleName: |
||||||
|
assetBundleVariant: |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 2.8 KiB |
@ -1,149 +1,115 @@ |
|||||||
// This code is part of the Fungus library (http://fungusgames.com) maintained by Chris Gregan (http://twitter.com/gofungus). |
// This code is part of the Fungus library (http://fungusgames.com) maintained by Chris Gregan (http://twitter.com/gofungus). |
||||||
// It is released for free under the MIT open source license (https://github.com/snozbot/fungus/blob/master/LICENSE) |
// It is released for free under the MIT open source license (https://github.com/snozbot/fungus/blob/master/LICENSE) |
||||||
|
|
||||||
using UnityEngine; |
using UnityEngine; |
||||||
using UnityEditor; |
using UnityEditor; |
||||||
using System; |
using System; |
||||||
|
using System.IO; |
||||||
|
using System.Linq; |
||||||
|
using System.Collections.Generic; |
||||||
|
|
||||||
namespace Fungus.EditorUtils |
namespace Fungus.EditorUtils |
||||||
{ |
{ |
||||||
internal static class FungusEditorResources |
internal static partial class FungusEditorResources |
||||||
{ |
{ |
||||||
|
private static Dictionary<string, Texture2D> textures = new Dictionary<string, Texture2D>(); |
||||||
static FungusEditorResources() { |
private static readonly string editorResourcesFolderName = "\"EditorResources\""; |
||||||
GenerateSpecialTextures(); |
|
||||||
LoadResourceAssets(); |
|
||||||
} |
|
||||||
|
|
||||||
private enum ResourceName |
|
||||||
{ |
|
||||||
command_background = 0, |
|
||||||
choice_node_off, |
|
||||||
choice_node_on, |
|
||||||
process_node_off, |
|
||||||
process_node_on, |
|
||||||
event_node_off, |
|
||||||
event_node_on, |
|
||||||
play_big, |
|
||||||
play_small |
|
||||||
} |
|
||||||
|
|
||||||
private static string[] s_LightSkin = { |
static FungusEditorResources() |
||||||
"command_background", |
|
||||||
"choice_node_off", |
|
||||||
"choice_node_on", |
|
||||||
"process_node_off", |
|
||||||
"process_node_on", |
|
||||||
"event_node_off", |
|
||||||
"event_node_on", |
|
||||||
"play_big", |
|
||||||
"play_small" |
|
||||||
}; |
|
||||||
|
|
||||||
private static string[] s_DarkSkin = { |
|
||||||
"command_background", |
|
||||||
"choice_node_off", |
|
||||||
"choice_node_on", |
|
||||||
"process_node_off", |
|
||||||
"process_node_on", |
|
||||||
"event_node_off", |
|
||||||
"event_node_on", |
|
||||||
"play_big", |
|
||||||
"play_small" |
|
||||||
}; |
|
||||||
|
|
||||||
public static Texture2D texCommandBackground |
|
||||||
{ |
{ |
||||||
get { return s_Cached[(int)ResourceName.command_background]; } |
LoadTexturesFromNames(); |
||||||
} |
} |
||||||
|
|
||||||
public static Texture2D texEventNodeOn |
private static void LoadTexturesFromNames() |
||||||
{ |
{ |
||||||
get { return s_Cached[(int)ResourceName.event_node_on]; } |
var baseDirectories = AssetDatabase.FindAssets(editorResourcesFolderName).Select( |
||||||
} |
guid => AssetDatabase.GUIDToAssetPath(guid) |
||||||
|
).ToArray(); |
||||||
public static Texture2D texEventNodeOff |
|
||||||
{ |
foreach (var name in resourceNames) |
||||||
get { return s_Cached[(int)ResourceName.event_node_off]; } |
{ |
||||||
|
LoadTexturesFromGUIDs(AssetDatabase.FindAssets(name + " t:Texture2D", baseDirectories)); |
||||||
|
} |
||||||
} |
} |
||||||
|
|
||||||
public static Texture2D texProcessNodeOn |
private static void LoadAllTexturesInFolder() |
||||||
{ |
|
||||||
get { return s_Cached[(int)ResourceName.process_node_on]; } |
|
||||||
} |
|
||||||
|
|
||||||
public static Texture2D texProcessNodeOff |
|
||||||
{ |
{ |
||||||
get { return s_Cached[(int)ResourceName.process_node_off]; } |
var rootGuid = AssetDatabase.FindAssets(editorResourcesFolderName)[0]; |
||||||
|
var root = AssetDatabase.GUIDToAssetPath(rootGuid); |
||||||
|
LoadTexturesFromGUIDs(AssetDatabase.FindAssets("t:Texture2D", new [] { root })); |
||||||
} |
} |
||||||
|
|
||||||
public static Texture2D texChoiceNodeOn |
private static void LoadTexturesFromGUIDs(string[] guids) |
||||||
{ |
{ |
||||||
get { return s_Cached[(int)ResourceName.choice_node_on]; } |
var paths = guids.Select(guid => AssetDatabase.GUIDToAssetPath(guid)).OrderBy(path => path.ToLower().Contains("/pro/")); |
||||||
} |
|
||||||
|
foreach (var path in paths) |
||||||
public static Texture2D texChoiceNodeOff |
{ |
||||||
{ |
if (path.ToLower().Contains("/pro/") && !EditorGUIUtility.isProSkin) |
||||||
get { return s_Cached[(int)ResourceName.choice_node_off]; } |
{ |
||||||
|
return; |
||||||
|
} |
||||||
|
var texture = AssetDatabase.LoadAssetAtPath(path, typeof(Texture2D)) as Texture2D; |
||||||
|
textures[texture.name] = texture; |
||||||
|
} |
||||||
} |
} |
||||||
|
|
||||||
public static Texture2D texPlayBig |
[MenuItem("Tools/Fungus/Utilities/Update Editor Resources Script")] |
||||||
|
private static void GenerateResourcesScript() |
||||||
{ |
{ |
||||||
get { return s_Cached[(int)ResourceName.play_big]; } |
textures.Clear(); |
||||||
} |
LoadAllTexturesInFolder(); |
||||||
|
|
||||||
public static Texture2D texPlaySmall |
var guid = AssetDatabase.FindAssets("FungusEditorResources t:MonoScript")[0]; |
||||||
{ |
var relativePath = AssetDatabase.GUIDToAssetPath(guid).Replace("FungusEditorResources.cs", "FungusEditorResourcesGenerated.cs"); |
||||||
get { return s_Cached[(int)ResourceName.play_small]; } |
var absolutePath = Application.dataPath + relativePath.Substring("Assets".Length); |
||||||
} |
|
||||||
|
using (var writer = new StreamWriter(absolutePath)) |
||||||
|
{ |
||||||
|
writer.WriteLine("// This code is part of the Fungus library (http://fungusgames.com) maintained by Chris Gregan (http://twitter.com/gofungus)."); |
||||||
|
writer.WriteLine("// It is released for free under the MIT open source license (https://github.com/snozbot/fungus/blob/master/LICENSE)"); |
||||||
|
writer.WriteLine(""); |
||||||
|
writer.WriteLine("using UnityEngine;"); |
||||||
|
writer.WriteLine(""); |
||||||
|
writer.WriteLine("namespace Fungus.EditorUtils"); |
||||||
|
writer.WriteLine("{"); |
||||||
|
writer.WriteLine(" internal static partial class FungusEditorResources"); |
||||||
|
writer.WriteLine(" {"); |
||||||
|
writer.WriteLine(" private static readonly string[] resourceNames = new [] {"); |
||||||
|
|
||||||
|
foreach (var pair in textures) |
||||||
|
{ |
||||||
|
writer.WriteLine(" \"" + pair.Key + "\","); |
||||||
|
} |
||||||
|
|
||||||
public static Texture2D texItemSplitter { get; private set; } |
writer.WriteLine(" };"); |
||||||
|
writer.WriteLine(""); |
||||||
private static void GenerateSpecialTextures() |
|
||||||
{ |
foreach (var pair in textures) |
||||||
var splitterColor = EditorGUIUtility.isProSkin |
{ |
||||||
? new Color(1f, 1f, 1f, 0.14f) |
var name = pair.Key; |
||||||
: new Color(0.59f, 0.59f, 0.59f, 0.55f) |
var pascalCase = string.Join("", name.Split(new [] { '_' }, StringSplitOptions.RemoveEmptyEntries).Select( |
||||||
; |
s => s.Substring(0, 1).ToUpper() + s.Substring(1)).ToArray() |
||||||
texItemSplitter = CreatePixelTexture("(Generated) Item Splitter", splitterColor); |
); |
||||||
} |
writer.WriteLine(" public static Texture2D " + pascalCase + " { get { return GetTexture(\"" + name + "\"); } }"); |
||||||
|
} |
||||||
public static Texture2D CreatePixelTexture(string name, Color color) |
|
||||||
{ |
writer.WriteLine(" }"); |
||||||
var tex = new Texture2D(1, 1, TextureFormat.ARGB32, false, true); |
writer.WriteLine("}"); |
||||||
tex.name = name; |
} |
||||||
tex.hideFlags = HideFlags.HideAndDontSave; |
|
||||||
tex.filterMode = FilterMode.Point; |
AssetDatabase.ImportAsset(relativePath); |
||||||
tex.SetPixel(0, 0, color); |
|
||||||
tex.Apply(); |
|
||||||
return tex; |
|
||||||
} |
} |
||||||
|
|
||||||
private static Texture2D[] s_Cached; |
private static Texture2D GetTexture(string name) |
||||||
|
|
||||||
public static void LoadResourceAssets() |
|
||||||
{ |
{ |
||||||
var skin = EditorGUIUtility.isProSkin ? s_DarkSkin : s_LightSkin; |
Texture2D texture; |
||||||
s_Cached = new Texture2D[skin.Length]; |
if (!textures.TryGetValue(name, out texture)) |
||||||
|
|
||||||
for (int i = 0; i < s_Cached.Length; ++i) |
|
||||||
{ |
{ |
||||||
s_Cached[i] = Resources.Load("Textures/" + skin[i]) as Texture2D; |
Debug.LogWarning("Texture \"" + name + "\" not found!"); |
||||||
} |
} |
||||||
|
|
||||||
s_LightSkin = null; |
return texture; |
||||||
s_DarkSkin = null; |
|
||||||
} |
|
||||||
|
|
||||||
private static void GetImageSize(byte[] imageData, out int width, out int height) |
|
||||||
{ |
|
||||||
width = ReadInt(imageData, 3 + 15); |
|
||||||
height = ReadInt(imageData, 3 + 15 + 2 + 2); |
|
||||||
} |
|
||||||
|
|
||||||
private static int ReadInt(byte[] imageData, int offset) |
|
||||||
{ |
|
||||||
return (imageData[offset] << 8) | imageData[offset + 1]; |
|
||||||
} |
} |
||||||
} |
} |
||||||
} |
} |
||||||
|
@ -0,0 +1,44 @@ |
|||||||
|
// This code is part of the Fungus library (http://fungusgames.com) maintained by Chris Gregan (http://twitter.com/gofungus). |
||||||
|
// It is released for free under the MIT open source license (https://github.com/snozbot/fungus/blob/master/LICENSE) |
||||||
|
|
||||||
|
using UnityEngine; |
||||||
|
|
||||||
|
namespace Fungus.EditorUtils |
||||||
|
{ |
||||||
|
internal static partial class FungusEditorResources |
||||||
|
{ |
||||||
|
private static readonly string[] resourceNames = new [] { |
||||||
|
"add", |
||||||
|
"add_small", |
||||||
|
"delete", |
||||||
|
"down", |
||||||
|
"duplicate", |
||||||
|
"up", |
||||||
|
"choice_node_off", |
||||||
|
"choice_node_on", |
||||||
|
"command_background", |
||||||
|
"event_node_off", |
||||||
|
"event_node_on", |
||||||
|
"play_big", |
||||||
|
"play_small", |
||||||
|
"process_node_off", |
||||||
|
"process_node_on", |
||||||
|
}; |
||||||
|
|
||||||
|
public static Texture2D Add { get { return GetTexture("add"); } } |
||||||
|
public static Texture2D AddSmall { get { return GetTexture("add_small"); } } |
||||||
|
public static Texture2D Delete { get { return GetTexture("delete"); } } |
||||||
|
public static Texture2D Down { get { return GetTexture("down"); } } |
||||||
|
public static Texture2D Duplicate { get { return GetTexture("duplicate"); } } |
||||||
|
public static Texture2D Up { get { return GetTexture("up"); } } |
||||||
|
public static Texture2D ChoiceNodeOff { get { return GetTexture("choice_node_off"); } } |
||||||
|
public static Texture2D ChoiceNodeOn { get { return GetTexture("choice_node_on"); } } |
||||||
|
public static Texture2D CommandBackground { get { return GetTexture("command_background"); } } |
||||||
|
public static Texture2D EventNodeOff { get { return GetTexture("event_node_off"); } } |
||||||
|
public static Texture2D EventNodeOn { get { return GetTexture("event_node_on"); } } |
||||||
|
public static Texture2D PlayBig { get { return GetTexture("play_big"); } } |
||||||
|
public static Texture2D PlaySmall { get { return GetTexture("play_small"); } } |
||||||
|
public static Texture2D ProcessNodeOff { get { return GetTexture("process_node_off"); } } |
||||||
|
public static Texture2D ProcessNodeOn { get { return GetTexture("process_node_on"); } } |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,12 @@ |
|||||||
|
fileFormatVersion: 2 |
||||||
|
guid: f5119f9bdde234916bed657bdc751f76 |
||||||
|
timeCreated: 1478502142 |
||||||
|
licenseType: Free |
||||||
|
MonoImporter: |
||||||
|
serializedVersion: 2 |
||||||
|
defaultReferences: [] |
||||||
|
executionOrder: 0 |
||||||
|
icon: {instanceID: 0} |
||||||
|
userData: |
||||||
|
assetBundleName: |
||||||
|
assetBundleVariant: |