Skip to content

Commit

Permalink
feat: dynamic labels (close: #47) (#48)
Browse files Browse the repository at this point in the history
* reformat code by auto-detection Rider

* Added field “dynamic labels”. If a dynamic label does not exist, it will be create in unity project and added to the addressable asset.

(+3 squashed commits)
Squashed commits:
[9294860] A dynamic label can be added using the regex syntax.
[b545228] If a dynamic label does not exist, it will be create and added to the addressable asset
[b662c11] add the field "dynamic labels"

* fix: AllowGroupCreation checkbox hidden when Odin is present (close #45)

* fix support odin inspector filter with dynamic labels path
  • Loading branch information
gtoto007 authored May 16, 2021
1 parent dcc2c13 commit 66f1e34
Show file tree
Hide file tree
Showing 10 changed files with 254 additions and 229 deletions.
59 changes: 36 additions & 23 deletions Editor/AddressableImportRule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,14 +56,6 @@ public class AddressableImportRule
[Tooltip("The group name in which the Addressable will be added. Leave blank for the default group.")]
public string groupName = string.Empty;

/// <summary>
/// Cleaned group name.
/// </summary>
string CleanedGroupName {
get {
return groupName.Trim().Replace('/', '-').Replace('\\', '-');
}
}

/// <summary>
/// Defines if labels will be added or replaced.
Expand All @@ -73,9 +65,12 @@ string CleanedGroupName {
/// <summary>
/// Label reference list.
/// </summary>
[Tooltip("The list of labels to be added to the Addressable Asset")]
[Tooltip("The list of addressable labels (already existing in your project) to be added to the Addressable Asset")]
public List<AssetLabelReference> labelRefs;

[Tooltip("The list of dynamic labels to be added to the Addressable Asset. If an addressable label doesn't exist, then it will be create in your unity project")]
public List<string> dynamicLabels;

/// <summary>
/// Group template to use. Default Group settings will be used if empty.
/// </summary>
Expand All @@ -102,7 +97,7 @@ string CleanedGroupName {
[ConditionalField("matchType", AddressableImportRuleMatchType.Regex, "simplified", false)]
public string addressReplacement = string.Empty;

public bool HasLabel
public bool HasLabelRefs
{
get
{
Expand Down Expand Up @@ -140,12 +135,30 @@ public bool Match(string assetPath)
/// </summary>
public string ParseGroupReplacement(string assetPath)
{
if (string.IsNullOrWhiteSpace(path) || string.IsNullOrWhiteSpace(groupName))
return ParseReplacement(assetPath, groupName);

}

/// <summary>
/// Parse assetPath and replace all elements that match this.path regex
/// with the <paramref name="name"/>
/// Returns null if this.path or <paramref name="name"/> is empty.
/// </summary>
/// <param name="assetPath"></param>
/// <param name="name"></param>
/// <returns></returns>
public string ParseReplacement(string assetPath, string name)
{
if (string.IsNullOrWhiteSpace(path) || string.IsNullOrWhiteSpace(name))
return null;

var cleanedName = name.Trim().Replace('/', '-').Replace('\\', '-');

// Parse path elements.
var replacement = AddressableImportRegex.ParsePath(assetPath, CleanedGroupName);
var replacement = AddressableImportRegex.ParsePath(assetPath, cleanedName);
// Parse this.path regex.
if (matchType == AddressableImportRuleMatchType.Regex) {
if (matchType == AddressableImportRuleMatchType.Regex)
{
string pathRegex = path;
replacement = Regex.Replace(assetPath, pathRegex, replacement);
}
Expand All @@ -172,21 +185,21 @@ public string ParseAddressReplacement(string assetPath)
// If the match type is Wildcard, the pattern will match and capture the entire path string.
string pathRegex =
simplified
? @"(?<path>.*[/\\])+(?<filename>.+?)(?<extension>\.[^.]*$|$)"
: (matchType == AddressableImportRuleMatchType.Wildcard
? @"(.*)"
: path);
? @"(?<path>.*[/\\])+(?<filename>.+?)(?<extension>\.[^.]*$|$)"
: (matchType == AddressableImportRuleMatchType.Wildcard
? @"(.*)"
: path);
replacement =
simplified
? @"${filename}"
: (matchType == AddressableImportRuleMatchType.Wildcard
? @"$1"
: replacement);
? @"${filename}"
: (matchType == AddressableImportRuleMatchType.Wildcard
? @"$1"
: replacement);
replacement = Regex.Replace(assetPath, pathRegex, replacement);
return replacement;
}

public IEnumerable<string> labels
public IEnumerable<string> labelsRefsEnum
{
get
{
Expand Down Expand Up @@ -264,4 +277,4 @@ static public string ParsePath(string assetPath, string replacement)
return finalPath;
}
}
}
}
26 changes: 19 additions & 7 deletions Editor/AddressableImporter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAsse
var isConfigurationPass =
(importedAssets.Length > 0 && importedAssets.All(x => x.StartsWith("Assets/AddressableAssetsData"))) &&
(deletedAssets.Length > 0 && deletedAssets.All(x => x.StartsWith("Assets/AddressableAssetsData")));
if (isConfigurationPass) {
if (isConfigurationPass)
{
return;
}
var settings = AddressableAssetSettingsDefaultObject.Settings;
Expand All @@ -32,7 +33,8 @@ static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAsse
return;
}
var importSettings = AddressableImportSettings.Instance;
if (importSettings == null) {
if (importSettings == null)
{
Debug.LogWarningFormat("[AddressableImporter] import settings file not found.\nPlease go to Assets/AddressableAssetsData folder, right click in the project window and choose 'Create > Addressable Assets > Import Settings'.");
return;
}
Expand Down Expand Up @@ -64,7 +66,8 @@ static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAsse

foreach (var deletedAsset in deletedAssets)
{
if (TryGetMatchedRule(deletedAsset, importSettings, out var matchedRule)) {
if (TryGetMatchedRule(deletedAsset, importSettings, out var matchedRule))
{
var guid = AssetDatabase.AssetPathToGUID(deletedAsset);
if (!string.IsNullOrEmpty(guid) && settings.RemoveAssetEntry(guid))
{
Expand All @@ -74,7 +77,8 @@ static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAsse
}
}

if (dirty) {
if (dirty)
{
AssetDatabase.SaveAssets();
}
}
Expand All @@ -97,7 +101,7 @@ static bool ApplyImportRule(
var entry = CreateOrUpdateAddressableAssetEntry(settings, importSettings, matchedRule, assetPath);
if (entry != null)
{
if (matchedRule.HasLabel)
if (matchedRule.HasLabelRefs)
Debug.LogFormat("[AddressableImporter] Entry created/updated for {0} with address {1} and labels {2}", assetPath, entry.address, string.Join(", ", entry.labels));
else
Debug.LogFormat("[AddressableImporter] Entry created/updated for {0} with address {1}", assetPath, entry.address);
Expand Down Expand Up @@ -171,10 +175,18 @@ static AddressableAssetEntry CreateOrUpdateAddressableAssetEntry(
// Add labels
if (rule.LabelMode == LabelWriteMode.Replace)
entry.labels.Clear();
foreach (var label in rule.labels)
foreach (var label in rule.labelsRefsEnum)
{
entry.labels.Add(label);
}

foreach (var dynamicLabel in rule.dynamicLabels)
{
var label = rule.ParseReplacement(assetPath, dynamicLabel);
settings.AddLabel(label);
entry.labels.Add(label);
}

}
return entry;
}
Expand Down Expand Up @@ -308,4 +320,4 @@ private static bool ValidateCheckFoldersFromSelection()
}


}
}
3 changes: 1 addition & 2 deletions Editor/Attributes/ButtonMethodAttribute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,4 @@ namespace UnityAddressableImporter.Helper
public class ButtonMethodAttribute : PropertyAttribute
{
}
}

}
86 changes: 43 additions & 43 deletions Editor/Helper/AddressableImportSettingsEditor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,58 +6,58 @@

namespace UnityAddressableImporter.Helper.Internal
{
using System;
using System.Collections.Generic;
using System.Reflection;
using Editor.Helper;
using UnityEditor;


[CustomEditor(typeof(AddressableImportSettings), true), CanEditMultipleObjects]
public class AddressableImportSettingsEditor : Editor
{
private List<MethodInfo> _methods;
private AddressableImportSettings _target;
private AddressableImporterOdinHandler _drawer;

private void OnEnable()
{
_target = target as AddressableImportSettings;
_drawer = _drawer ?? new AddressableImporterOdinHandler();
if (_target == null) return;
_drawer.Initialize(_target);
_methods = AddressableImporterMethodHandler.CollectValidMembers(_target.GetType());

}

private void OnDisable()
{
_drawer.Dispose();
}

public override void OnInspectorGUI()
{
DrawBaseEditor();
using System;
using System.Collections.Generic;
using System.Reflection;
using Editor.Helper;
using UnityEditor;


[CustomEditor(typeof(AddressableImportSettings), true), CanEditMultipleObjects]
public class AddressableImportSettingsEditor : Editor
{
private List<MethodInfo> _methods;
private AddressableImportSettings _target;
private AddressableImporterOdinHandler _drawer;


private void OnEnable()
{
_target = target as AddressableImportSettings;
_drawer = _drawer ?? new AddressableImporterOdinHandler();
if (_target == null) return;

_drawer.Initialize(_target);
_methods = AddressableImporterMethodHandler.CollectValidMembers(_target.GetType());

}

private void OnDisable()
{
_drawer.Dispose();
}

public override void OnInspectorGUI()
{
DrawBaseEditor();

#if !ODIN_INSPECTOR
if (_methods == null) return;
if (_methods == null) return;

AddressableImporterMethodHandler.OnInspectorGUI(_target, _methods);
AddressableImporterMethodHandler.OnInspectorGUI(_target, _methods);
#endif

serializedObject.ApplyModifiedProperties();
serializedObject.ApplyModifiedProperties();

}
}

private void DrawBaseEditor()
{
private void DrawBaseEditor()
{
#if ODIN_INSPECTOR
_drawer.Draw();
#else
base.OnInspectorGUI();
base.OnInspectorGUI();
#endif
}
}
}
}
}
2 changes: 1 addition & 1 deletion Editor/Helper/AddressableImporterMethodHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ private static string SplitCamelCase(string camelCaseString)
{
if (string.IsNullOrEmpty(camelCaseString)) return camelCaseString;

string camelCase = Regex.Replace(Regex.Replace(camelCaseString, @"(\P{Ll})(\P{Ll}\p{Ll})", "$1 $2"), @"(\p{Ll})(\P{Ll})", "$1 $2");
string camelCase = Regex.Replace(Regex.Replace(camelCaseString, @"(\P{Ll})(\P{Ll}\p{Ll})", "$1 $2"), @"(\p{Ll})(\P{Ll})", "$1 $2");
string firstLetter = camelCase.Substring(0, 1).ToUpper();

if (camelCaseString.Length > 1)
Expand Down
Loading

0 comments on commit 66f1e34

Please sign in to comment.