public static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
        {
            var settings             = ProjectUtility.GetOrCreateProjectSettings <ActionGraphGlobalSettings>();
            var actionSchema         = ProjectUtility.GetOrCreateProjectAsset <ActionSchema>();
            var fieldOperationSchema = ProjectUtility.GetOrCreateProjectAsset <FieldOperationSchema>();

            foreach (var path in importedAssets.Where(importedAsset => importedAsset.EndsWith($".{ActionGraphGlobalSettings.Extension}")))
            {
                var    importer = AssetImporter.GetAtPath(path);
                var    userData = importer.userData;
                string artifactFile;
                if (string.IsNullOrWhiteSpace(userData))
                {
                    artifactFile = settings.CreateArtifactPath();
                }
                else
                {
                    artifactFile = AssetDatabase.GUIDToAssetPath(userData);
                    if (string.IsNullOrEmpty(artifactFile))
                    {
                        artifactFile = settings.CreateArtifactPath();
                    }
                }
                var actionAsset           = AssetDatabase.LoadAssetAtPath <ActionAsset>(path);
                var actionDefinitionAsset = ActionDefinitionAsset.Load(actionAsset.actionId);
                if (actionDefinitionAsset?.delegateType.IsCreated == true)
                {
                    var guid = (string)typeof(ActionGraphSerializer).GetMethod(nameof(ActionGraphSerializer.WriteArtifact), System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static)
                               .MakeGenericMethod(actionDefinitionAsset.delegateType)
                               .Invoke(null, new object[] {
                        artifactFile, actionSchema, fieldOperationSchema, actionAsset, actionDefinitionAsset
                    });
                    if (guid != importer.userData)
                    {
                        importer.userData = guid;
                        importer.SaveAndReimport();
                    }
                }
                else
                {
                    AssetDatabase.DeleteAsset(artifactFile);
                }
            }
            foreach (var path in deletedAssets.Where(deletedAsset => deletedAsset.EndsWith($".{ActionGraphGlobalSettings.Extension}")))
            {
                var userData = AssetImporter.GetAtPath(path).userData;
                if (!string.IsNullOrWhiteSpace(userData))
                {
                    var artifactPath = AssetDatabase.GUIDToAssetPath(userData);
                    if (!string.IsNullOrEmpty(artifactPath))
                    {
                        AssetDatabase.DeleteAsset(artifactPath);
                    }
                }
            }
            AssetDatabase.Refresh();
        }
示例#2
0
        public override VisualElement CreateInspectorGUI()
        {
            var rootElement = AssetDatabase.LoadAssetAtPath <VisualTreeAsset>(Uxml).CloneTree();
            var openButton  = rootElement.Q <Button>("open");

            openButton.clicked += () =>
            {
                if (serializedObject?.targetObject is ActionAsset asset)
                {
                    ActionGraphWindow.ShowWindow(asset);
                }
            };
            openButton.SetEnabled(((ActionAsset)serializedObject.targetObject).actionId.IsCreated);
            var id = rootElement.Q <ActionIdField>("id");

            if (settings != null)
            {
                if (serializedObject.targetObject is ActionAsset actionAsset)
                {
                    try {
                        id.value = actionAsset.actionId;
                    }
                    catch (Exception) {
                        Debug.LogError($"Error setting Action Id. Consider Reimporting {AssetDatabase.GetAssetPath(actionAsset)}");
                    }
                }

                id.RegisterValueChangedCallback(evt =>
                {
                    var previousInfo = evt.previousValue.IsCreated ? ActionDefinitionAsset.Load(evt.previousValue) : null;
                    var self         = (ActionIdField)evt.target;
                    var newInfo      = evt.newValue.IsCreated ? ActionDefinitionAsset.Load(evt.previousValue) : null;
                    var asset        = (ActionAsset)serializedObject.targetObject;
                    var model        = asset.CreateModel();
                    bool retainNodes = false;
                    if (previousInfo == null || model.nodes.Count == 0 || ConfirmActionTypeChange(previousInfo, newInfo, out retainNodes))
                    {
                        model.id = evt.newValue;
                        if (!retainNodes)
                        {
                            model.nodes.Clear();
                            model.masterNodeLayout = default;
                        }
                        asset.UpdateAsset(model);
                        openButton.SetEnabled(evt.newValue.IsCreated);
                    }
                    else
                    {
                        self.SetValueWithoutNotify(evt.previousValue);
                    }
                });
            }
            return(rootElement);
        }
示例#3
0
        public override VisualElement CreatePropertyGUI(SerializedProperty property)
        {
            var field    = new ActionAssetField();
            var attr     = fieldInfo.GetCustomAttribute <ActionTypeAttribute>();
            var settings = ProjectUtility.GetProjectAsset <ActionGraphGlobalSettings>();

            if (attr != null && ActionDefinitionAsset.Load(attr.type, out var info))
            {
                field.ActionId = info.id;
            }
            field.Label = property.displayName;
            field.BindProperty(property);
            return(field);
        }
示例#4
0
 private string FormatCell(ActionId actionId)
 {
     if (settings == null)
     {
         return(ActionId.UnknownActionName);
     }
     if (!actionId.IsCreated)
     {
         return(ActionId.NullActionName);
     }
     if (ActionDefinitionAsset.Load(actionId, out var info))
     {
         return(info.Name);
     }
     else
     {
         return(ActionId.UnknownActionName);
     }
 }