From 8db2a6dbf52169555ad2fa33ae83fc5b8d9745cf Mon Sep 17 00:00:00 2001 From: Guerra24 Date: Tue, 28 May 2024 16:17:17 -0600 Subject: [PATCH] Rework reward definition --- Assets/Editor/Actions.cs | 8 ++++ Assets/Rewards/Objects/Box/Box.asset | 19 ++++++++ Assets/Rewards/Objects/Box/Box.asset.meta | 8 ++++ Assets/Rewards/Objects/Box/Box.prefab | 5 +-- Assets/Rewards/Objects/Box/Box.prefab.meta | 2 +- Assets/Scenes/Main.unity | 18 ++++---- Assets/Scripts/ApplicationState.cs | 18 ++------ Assets/Scripts/RewardSpawner.cs | 2 +- Assets/Scripts/Startup.cs | 12 +++-- Assets/Scripts/UI/Items/ItemRewardListItem.cs | 2 +- .../UI/Items/RewardAssetBundleListItem.cs | 2 +- .../UI/Settings/RewardAssetBundlesPage.cs | 10 ++--- .../Editor/RewardAssetEditorWindow.cs | 44 ++++++++++++------- .../Runtime/RewardAsset.cs | 9 ++-- .../Runtime/RewardAssetInfo.cs | 17 +++++++ .../Runtime/RewardAssetInfo.cs.meta | 2 + 16 files changed, 112 insertions(+), 66 deletions(-) create mode 100644 Assets/Rewards/Objects/Box/Box.asset create mode 100644 Assets/Rewards/Objects/Box/Box.asset.meta create mode 100644 Packages/net.guerra24.avatarviewer.sdk/Runtime/RewardAssetInfo.cs create mode 100644 Packages/net.guerra24.avatarviewer.sdk/Runtime/RewardAssetInfo.cs.meta diff --git a/Assets/Editor/Actions.cs b/Assets/Editor/Actions.cs index 93c7da8..fafd020 100644 --- a/Assets/Editor/Actions.cs +++ b/Assets/Editor/Actions.cs @@ -1,3 +1,4 @@ +using AvatarViewer.SDK; using UnityEditor; namespace AvatarViewer.Editor @@ -7,6 +8,13 @@ public static class Actions [MenuItem("Avatar Viewer/Generate built-in rewards")] public static void BuildRewards() { + foreach (var asset in AssetDatabase.GetAssetPathsFromAssetBundle("builtin-rewards")) + { + var rewardAssetInfo = AssetDatabase.LoadAssetAtPath(asset); + rewardAssetInfo.Prefab.GetComponent().Info = rewardAssetInfo; + } + AssetDatabase.SaveAssets(); + BuildPipeline.BuildAssetBundles("Assets/StreamingAssets", BuildAssetBundleOptions.StrictMode | BuildAssetBundleOptions.ChunkBasedCompression, EditorUserBuildSettings.activeBuildTarget); } } diff --git a/Assets/Rewards/Objects/Box/Box.asset b/Assets/Rewards/Objects/Box/Box.asset new file mode 100644 index 0000000..2cedbbe --- /dev/null +++ b/Assets/Rewards/Objects/Box/Box.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8593682cb7a6dfd4b83ac783925009cb, type: 3} + m_Name: Box + m_EditorClassIdentifier: + Guid: + serializedGuid: 158dcd30-65e2-4947-84b1-6776a712a052 + AssetName: Box + DisablePhysicsOnCollision: 0 + Prefab: {fileID: 4635790230465575798, guid: 40e23b62cc9ebfe4a986b9d73665a741, type: 3} diff --git a/Assets/Rewards/Objects/Box/Box.asset.meta b/Assets/Rewards/Objects/Box/Box.asset.meta new file mode 100644 index 0000000..01953bb --- /dev/null +++ b/Assets/Rewards/Objects/Box/Box.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 84086667b95955b47b82d904da7e06a8 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: builtin-rewards + assetBundleVariant: diff --git a/Assets/Rewards/Objects/Box/Box.prefab b/Assets/Rewards/Objects/Box/Box.prefab index eaf63a6..c14d731 100644 --- a/Assets/Rewards/Objects/Box/Box.prefab +++ b/Assets/Rewards/Objects/Box/Box.prefab @@ -367,7 +367,4 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 19d64d4e41648a147ad98e67f6d7d0c4, type: 3} m_Name: m_EditorClassIdentifier: - Guid: - serializedGuid: 158dcd30-65e2-4947-84b1-6776a712a052 - Name: Box - DisablePhysicsOnCollision: 0 + Info: {fileID: 0} diff --git a/Assets/Rewards/Objects/Box/Box.prefab.meta b/Assets/Rewards/Objects/Box/Box.prefab.meta index 6dbf9f0..f70e1e4 100644 --- a/Assets/Rewards/Objects/Box/Box.prefab.meta +++ b/Assets/Rewards/Objects/Box/Box.prefab.meta @@ -3,5 +3,5 @@ guid: 40e23b62cc9ebfe4a986b9d73665a741 PrefabImporter: externalObjects: {} userData: - assetBundleName: builtin-rewards + assetBundleName: assetBundleVariant: diff --git a/Assets/Scenes/Main.unity b/Assets/Scenes/Main.unity index 358a990..110c851 100644 --- a/Assets/Scenes/Main.unity +++ b/Assets/Scenes/Main.unity @@ -1407,12 +1407,12 @@ PrefabInstance: - target: {fileID: 70972866194739485, guid: d2bf08666f6585c4fb2de39208019ae2, type: 3} propertyPath: m_LocalPosition.x - value: 0 + value: -250 objectReference: {fileID: 0} - target: {fileID: 70972866194739485, guid: d2bf08666f6585c4fb2de39208019ae2, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: -304 objectReference: {fileID: 0} - target: {fileID: 3183264326573952452, guid: d2bf08666f6585c4fb2de39208019ae2, type: 3} @@ -1602,12 +1602,12 @@ PrefabInstance: - target: {fileID: 4914328431171304639, guid: d2bf08666f6585c4fb2de39208019ae2, type: 3} propertyPath: m_LocalPosition.x - value: 0 + value: -250 objectReference: {fileID: 0} - target: {fileID: 4914328431171304639, guid: d2bf08666f6585c4fb2de39208019ae2, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: 304 objectReference: {fileID: 0} - target: {fileID: 6974992526447935581, guid: d2bf08666f6585c4fb2de39208019ae2, type: 3} @@ -1632,7 +1632,7 @@ PrefabInstance: - target: {fileID: 7071451658218752593, guid: d2bf08666f6585c4fb2de39208019ae2, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: 304 objectReference: {fileID: 0} - target: {fileID: 8211928304835922972, guid: d2bf08666f6585c4fb2de39208019ae2, type: 3} @@ -5886,7 +5886,7 @@ PrefabInstance: - target: {fileID: 70972866194739485, guid: d2bf08666f6585c4fb2de39208019ae2, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: -304 objectReference: {fileID: 0} - target: {fileID: 3183264326573952452, guid: d2bf08666f6585c4fb2de39208019ae2, type: 3} @@ -6076,7 +6076,7 @@ PrefabInstance: - target: {fileID: 4914328431171304639, guid: d2bf08666f6585c4fb2de39208019ae2, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: 304 objectReference: {fileID: 0} - target: {fileID: 6974992526447935581, guid: d2bf08666f6585c4fb2de39208019ae2, type: 3} @@ -6101,12 +6101,12 @@ PrefabInstance: - target: {fileID: 7071451658218752593, guid: d2bf08666f6585c4fb2de39208019ae2, type: 3} propertyPath: m_LocalPosition.x - value: 0 + value: 250 objectReference: {fileID: 0} - target: {fileID: 7071451658218752593, guid: d2bf08666f6585c4fb2de39208019ae2, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: 304 objectReference: {fileID: 0} - target: {fileID: 8211928304835922972, guid: d2bf08666f6585c4fb2de39208019ae2, type: 3} diff --git a/Assets/Scripts/ApplicationState.cs b/Assets/Scripts/ApplicationState.cs index c46373b..d5065fa 100644 --- a/Assets/Scripts/ApplicationState.cs +++ b/Assets/Scripts/ApplicationState.cs @@ -18,7 +18,7 @@ public static class ApplicationState public static Dictionary ExternalAudios { get; } = new(); - public static Dictionary RewardAssets { get; } = new(); + public static Dictionary RewardAssets { get; } = new(); public static Dictionary RewardBundles { get; } = new(); @@ -38,25 +38,13 @@ public LoadedAvatar(AssetBundle bundle, GameObject @object) } } - public class LoadedRewardAsset - { - public GameObject Object { get; } - public RewardAsset RewardAsset { get; } - - public LoadedRewardAsset(GameObject @object, RewardAsset rewardAsset) - { - Object = @object; - RewardAsset = rewardAsset; - } - } - public class LoadedRewardAssetsBundle { public AssetBundle Bundle { get; } - public Dictionary RewardAssets { get; } + public Dictionary RewardAssets { get; } - public LoadedRewardAssetsBundle(AssetBundle bundle, Dictionary rewardAssets) + public LoadedRewardAssetsBundle(AssetBundle bundle, Dictionary rewardAssets) { Bundle = bundle; RewardAssets = rewardAssets; diff --git a/Assets/Scripts/RewardSpawner.cs b/Assets/Scripts/RewardSpawner.cs index adb5fac..bfe06c2 100644 --- a/Assets/Scripts/RewardSpawner.cs +++ b/Assets/Scripts/RewardSpawner.cs @@ -37,7 +37,7 @@ private async UniTaskVoid UpdateAsync() { var spawnPoint = GetSpawn(reward.SpawnPoint); if (ApplicationState.RewardAssets.TryGetValue(reward.RewardAsset, out var asset)) - SetupReward(Instantiate(asset.Object, spawnPoint.position, spawnPoint.rotation * asset.Object.transform.rotation), spawnPoint, reward); + SetupReward(Instantiate(asset.Prefab, spawnPoint.position, spawnPoint.rotation * asset.Prefab.transform.rotation), spawnPoint, reward); await UniTask.Delay(200); } _processingRewards = false; diff --git a/Assets/Scripts/Startup.cs b/Assets/Scripts/Startup.cs index 86fbab4..e46fc58 100644 --- a/Assets/Scripts/Startup.cs +++ b/Assets/Scripts/Startup.cs @@ -144,16 +144,14 @@ await assetBundle.LoadAssetAsync("VSFAvatar").ToUniTask().ContinueWi foreach (var kvp in bundles.Union(new Dictionary() { { Guid.Empty, new RewardAssetsBundle(Path.Combine(Application.streamingAssetsPath, "builtin-rewards")) } }).ToDictionary(k => k.Key, v => v.Value)) { var bundle = await AssetBundle.LoadFromFileAsync(kvp.Value.Path); - var request = bundle.LoadAllAssetsAsync(); + var request = bundle.LoadAllAssetsAsync(); await request; - var rewardAssets = new Dictionary(); + var rewardAssets = new Dictionary(); foreach (var @object in request.allAssets) { - var reward = @object as GameObject; - var rewardAsset = reward.GetComponent(); - var lra = new LoadedRewardAsset(reward, rewardAsset); - ApplicationState.RewardAssets.Add(rewardAsset.Guid, lra); - rewardAssets.Add(rewardAsset.Guid, lra); + var reward = @object as RewardAssetInfo; + ApplicationState.RewardAssets.Add(reward.Guid, reward); + rewardAssets.Add(reward.Guid, reward); } ApplicationState.RewardBundles.Add(kvp.Key, new LoadedRewardAssetsBundle(bundle, rewardAssets)); } diff --git a/Assets/Scripts/UI/Items/ItemRewardListItem.cs b/Assets/Scripts/UI/Items/ItemRewardListItem.cs index 355c414..6d849ad 100644 --- a/Assets/Scripts/UI/Items/ItemRewardListItem.cs +++ b/Assets/Scripts/UI/Items/ItemRewardListItem.cs @@ -23,7 +23,7 @@ protected override void Awake() base.Awake(); SpawnPoint.AddOptions(Enum.GetNames(typeof(ItemRewardSpawnPoint)).ToList()); foreach (var rewardAsset in ApplicationState.RewardAssets) - RewardAsset.options.Add(new GuidDropdownData(rewardAsset.Value.RewardAsset.Name, rewardAsset.Key)); + RewardAsset.options.Add(new GuidDropdownData(rewardAsset.Value.AssetName, rewardAsset.Key)); RewardAsset.RefreshShownValue(); Volume.SetupSlider((value) => Reward.Volume = value); diff --git a/Assets/Scripts/UI/Items/RewardAssetBundleListItem.cs b/Assets/Scripts/UI/Items/RewardAssetBundleListItem.cs index 8c90f31..cc85176 100644 --- a/Assets/Scripts/UI/Items/RewardAssetBundleListItem.cs +++ b/Assets/Scripts/UI/Items/RewardAssetBundleListItem.cs @@ -44,7 +44,7 @@ private async UniTaskVoid RemoveBundle() var tcs = new UniTaskCompletionSource(); _dialog.CreateDialog( title, - content.AsFormat(rewardAsset.RewardAsset.Name, itemReward.Title), + content.AsFormat(rewardAsset.AssetName, itemReward.Title), () => { itemReward.RewardAsset = Guid.Parse("158dcd30-65e2-4947-84b1-6776a712a052"); tcs.TrySetResult(false); }, () => tcs.TrySetResult(true)); if (await tcs.Task) diff --git a/Assets/Scripts/UI/Settings/RewardAssetBundlesPage.cs b/Assets/Scripts/UI/Settings/RewardAssetBundlesPage.cs index 3ef4e95..12107f2 100644 --- a/Assets/Scripts/UI/Settings/RewardAssetBundlesPage.cs +++ b/Assets/Scripts/UI/Settings/RewardAssetBundlesPage.cs @@ -40,14 +40,12 @@ private async UniTaskVoid AddBundle(string path) var bundle = await AssetBundle.LoadFromFileAsync(path); var request = bundle.LoadAllAssetsAsync(); await request; - var rewardAssets = new Dictionary(); + var rewardAssets = new Dictionary(); foreach (var @object in request.allAssets) { - var reward = @object as GameObject; - var rewardAsset = reward.GetComponent(); - var lra = new LoadedRewardAsset(reward, rewardAsset); - ApplicationState.RewardAssets.Add(rewardAsset.Guid, lra); - rewardAssets.Add(rewardAsset.Guid, lra); + var reward = @object as RewardAssetInfo; + ApplicationState.RewardAssets.Add(reward.Guid, reward); + rewardAssets.Add(reward.Guid, reward); } var rab = new RewardAssetsBundle(path); var guid = Guid.NewGuid(); diff --git a/Packages/net.guerra24.avatarviewer.sdk/Editor/RewardAssetEditorWindow.cs b/Packages/net.guerra24.avatarviewer.sdk/Editor/RewardAssetEditorWindow.cs index b3968a9..3649b51 100644 --- a/Packages/net.guerra24.avatarviewer.sdk/Editor/RewardAssetEditorWindow.cs +++ b/Packages/net.guerra24.avatarviewer.sdk/Editor/RewardAssetEditorWindow.cs @@ -41,25 +41,39 @@ private void OnGUI() bool valid = true; foreach (var asset in assets) { - var gameObject = AssetDatabase.LoadAssetAtPath(asset); - var hasRewardAsset = gameObject.TryGetComponent(out var rewardAsset); - var hasRigidBody = gameObject.TryGetComponent(out var rigidbody); - var hasComponents = hasRewardAsset && hasRigidBody; - if (!hasComponents) - valid = false; - - if (EditorGUILayout.Foldout(true, hasRewardAsset ? rewardAsset.Name : gameObject.name)) + var rewardAssetInfo = AssetDatabase.LoadAssetAtPath(asset); + if (EditorGUILayout.Foldout(true, rewardAssetInfo.AssetName)) { EditorGUILayout.BeginHorizontal(); GUILayout.Space(16f); EditorGUILayout.BeginVertical(); - EditorGUILayout.ObjectField(gameObject, typeof(GameObject), false); - if (!hasRewardAsset) - GUILayout.Label("Missing RewardAsset component"); - if (!hasRigidBody) - GUILayout.Label("Missing RigidBody component"); - if (hasComponents) - GUILayout.Label("Reward valid"); + if (rewardAssetInfo.Prefab != null) + { + var hasRewardAsset = rewardAssetInfo.Prefab.TryGetComponent(out var rewardAsset); + var hasRigidBody = rewardAssetInfo.Prefab.TryGetComponent(out var rigidbody); + var hasComponents = hasRewardAsset && hasRigidBody; + if (!hasComponents) + valid = false; + + if (rewardAsset.Info != rewardAssetInfo) + { + rewardAsset.Info = rewardAssetInfo; + AssetDatabase.SaveAssets(); + } + + UnityEditor.Editor.CreateEditor(rewardAssetInfo).OnInspectorGUI(); + if (!hasRewardAsset) + GUILayout.Label("Missing RewardAsset component"); + if (!hasRigidBody) + GUILayout.Label("Missing RigidBody component"); + if (hasComponents) + GUILayout.Label("Reward valid"); + } + else + { + valid = false; + GUILayout.Label("Missing Prefab"); + } EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); } diff --git a/Packages/net.guerra24.avatarviewer.sdk/Runtime/RewardAsset.cs b/Packages/net.guerra24.avatarviewer.sdk/Runtime/RewardAsset.cs index a9afea2..59a3792 100644 --- a/Packages/net.guerra24.avatarviewer.sdk/Runtime/RewardAsset.cs +++ b/Packages/net.guerra24.avatarviewer.sdk/Runtime/RewardAsset.cs @@ -4,11 +4,8 @@ namespace AvatarViewer.SDK { public class RewardAsset : MonoBehaviour { - public SerializableGuid Guid; - - public string Name; - - public bool DisablePhysicsOnCollision; + [HideInInspector] + public RewardAssetInfo Info; private Rigidbody Rigidbody; private AudioSource AudioSource; @@ -21,7 +18,7 @@ private void Start() private void OnCollisionEnter(Collision collision) { - if (DisablePhysicsOnCollision) + if (Info.DisablePhysicsOnCollision) { Rigidbody.isKinematic = true; Rigidbody.detectCollisions = false; diff --git a/Packages/net.guerra24.avatarviewer.sdk/Runtime/RewardAssetInfo.cs b/Packages/net.guerra24.avatarviewer.sdk/Runtime/RewardAssetInfo.cs new file mode 100644 index 0000000..cf7dd03 --- /dev/null +++ b/Packages/net.guerra24.avatarviewer.sdk/Runtime/RewardAssetInfo.cs @@ -0,0 +1,17 @@ +using UnityEngine; + +namespace AvatarViewer.SDK +{ + [CreateAssetMenu(fileName = "RewardAssetInfo", menuName = "Avatar Viewer/RewardAssetInfo")] + public class RewardAssetInfo : ScriptableObject + { + public SerializableGuid Guid; + + public string AssetName; + + public bool DisablePhysicsOnCollision; + + public GameObject Prefab; + + } +} diff --git a/Packages/net.guerra24.avatarviewer.sdk/Runtime/RewardAssetInfo.cs.meta b/Packages/net.guerra24.avatarviewer.sdk/Runtime/RewardAssetInfo.cs.meta new file mode 100644 index 0000000..2231f09 --- /dev/null +++ b/Packages/net.guerra24.avatarviewer.sdk/Runtime/RewardAssetInfo.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8593682cb7a6dfd4b83ac783925009cb \ No newline at end of file