Add automatic Rive asset refresh workflow

This commit is contained in:
pelpanagiotis
2026-09-20 10:01:38 +03:00
parent d04ff998cb
commit c674d76549
45 changed files with 226275 additions and 248678 deletions
@@ -0,0 +1,74 @@
#if UNITY_EDITOR
using System;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.SceneManagement;
public class RiveAssetAutoRefresh: AssetPostprocessor
{
private static bool refreshQueued;
private static void OnPostprocessAllAssets(
string[] importedAssets,
string[] deletedAssets,
string[] movedAssets,
string[] movedFromAssetPaths)
{
foreach (string assetPath in importedAssets)
{
if (!assetPath.EndsWith(".riv", StringComparison.OrdinalIgnoreCase))
continue;
QueueSceneReload();
return;
}
}
private static void QueueSceneReload()
{
if (refreshQueued)
return;
refreshQueued = true;
EditorApplication.delayCall += ReloadSceneAfterImport;
}
private static void ReloadSceneAfterImport()
{
refreshQueued = false;
if (EditorApplication.isPlaying)
{
Debug.Log("A Rive asset changed. Scene reload skipped because Play Mode is active.");
return;
}
Scene activeScene = SceneManager.GetActiveScene();
if (!activeScene.IsValid() || string.IsNullOrEmpty(activeScene.path))
{
Debug.LogWarning("A Rive asset changed, but the active scene has not been saved yet.");
return;
}
bool saved = EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo();
if (!saved)
{
Debug.LogWarning("Rive scene refresh cancelled because the scene was not saved.");
return;
}
EditorSceneManager.OpenScene(
activeScene.path,
OpenSceneMode.Single);
Debug.Log("Rive asset changed. THe active scene was reloaded automatically.");
}
}
#endif
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 69d5148788a7cf54495d98a1a6e11d59
@@ -0,0 +1,67 @@
#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.SceneManagement;
public static class RiveAssetRefreshMenu
{
private const string LoginRiveAssetPath = "Assets/UI/Login UI.riv";
[MenuItem("Tools/Rive/Reimport Login UI")]
private static void ReimportLoginUI()
{
if (EditorApplication.isPlaying)
{
Debug.LogWarning("Stop Play Mode before reimporting the Rive asset.");
return;
}
Scene activeScene = SceneManager.GetActiveScene();
if (!activeScene.IsValid() || string.IsNullOrEmpty(activeScene.path))
{
Debug.LogError("Rive refresh failed: the active scene has not been saved.");
return;
}
bool saved = EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo();
if (!saved)
{
Debug.LogWarning("Rive refresh cancelled because the scene was not saved.");
return;
}
AssetDatabase.ImportAsset(
LoginRiveAssetPath,
ImportAssetOptions.ForceUpdate |
ImportAssetOptions.ForceSynchronousImport);
AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
string scenePath = activeScene.path;
EditorApplication.delayCall += () =>
{
if (EditorApplication.isPlaying)
return;
EditorSceneManager.OpenScene(
scenePath,
OpenSceneMode.Single);
Debug.Log($"Reimported {LoginRiveAssetPath} and reloaded {scenePath}.");
};
}
[MenuItem("Tools/Rive/Reimport Login UI", validate = true)]
private static bool ValidateReimportLoginUI()
{
return AssetDatabase.AssetPathToGUID(LoginRiveAssetPath) != string.Empty;
}
}
#endif
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 867b04f7b3f14254598149f4cb04a1c8
+37 -5
View File
@@ -45,6 +45,7 @@ namespace ProceduralEditor
SetupPanel(faceMaterial);
SetupFog();
SetupPostProcessVolume();
RemoveLegacyLogo();
SetupFadeCanvas();
EditorSceneManager.MarkSceneDirty(scene);
@@ -178,12 +179,46 @@ namespace ProceduralEditor
RenderSettings.fog = false;
}
static void RemoveLegacyLogo()
{
var legacyLogo = GameObject.Find("NetCode Logo");
if (legacyLogo != null)
Object.DestroyImmediate(legacyLogo);
}
static void SetupFadeCanvas()
{
var existing = GameObject.Find("Fade Canvas");
if (existing != null) Object.DestroyImmediate(existing);
if (existing != null)
{
existing.SetActive(true);
existing.transform.localScale = Vector3.one;
var existingImage = existing.transform.Find("Fade Image");
if (existingImage != null)
{
existingImage.gameObject.SetActive(true);
var existingFadeIn = existingImage.GetComponent<MenuFadeIn>();
if (existingFadeIn == null)
existingFadeIn = existingImage.gameObject.AddComponent<MenuFadeIn>();
existingFadeIn.delay = 2.5f;
existingFadeIn.duration = 3.5f;
existingFadeIn.enabled = true;
var existingGroup = existingImage.GetComponent<CanvasGroup>();
if (existingGroup != null)
{
existingGroup.alpha = 1f;
existingGroup.blocksRaycasts = true;
existingGroup.interactable = true;
}
return;
}
}
var canvasGo = new GameObject("Fade Canvas", typeof(Canvas), typeof(CanvasScaler), typeof(GraphicRaycaster));
canvasGo.transform.localScale = Vector3.one;
var canvas = canvasGo.GetComponent<Canvas>();
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
// Ensure fade canvas draws on top of other UI canvases
@@ -204,11 +239,8 @@ namespace ProceduralEditor
rect.offsetMax = Vector2.zero;
var fadeIn = imageGo.AddComponent<MenuFadeIn>();
fadeIn.delay = 0.3f;
fadeIn.delay = 2.5f;
fadeIn.duration = 3.5f;
// Disable automatic fade-on-start so the debug toggle controls opacity predictably.
// If you prefer the automatic fade, remove this line.
fadeIn.enabled = false;
// Make sure the image initially is fully opaque so the menu starts covered by the backdrop
var initColor = image.color;