You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
5.0 KiB
C#
139 lines
5.0 KiB
C#
3 weeks ago
|
namespace Fusion.Editor {
|
||
|
|
||
|
using System;
|
||
|
using System.IO;
|
||
|
using System.Linq;
|
||
|
using UnityEditor;
|
||
|
using UnityEditor.AssetImporters;
|
||
|
using UnityEngine;
|
||
|
|
||
|
[CustomEditor(typeof(NetworkProjectConfigImporter))]
|
||
|
internal class NetworkProjectConfigImporterEditor : ScriptedImporterEditor {
|
||
|
|
||
|
private Exception _initializeException;
|
||
|
|
||
|
private static bool _versionExpanded;
|
||
|
private static string _version;
|
||
|
private static string _allVersionInfo;
|
||
|
|
||
|
public override bool showImportedObject => false;
|
||
|
|
||
|
protected override Type extraDataType => typeof(NetworkProjectConfigAsset);
|
||
|
|
||
|
public override void OnInspectorGUI() {
|
||
|
|
||
|
bool rebuildPrefabTable = false;
|
||
|
|
||
|
try {
|
||
|
if (_initializeException != null) {
|
||
|
EditorGUILayout.HelpBox(_initializeException.ToString(), MessageType.Error, true);
|
||
|
} else {
|
||
|
|
||
|
FusionEditorGUI.InjectScriptHeaderDrawer(extraDataSerializedObject);
|
||
|
FusionEditorGUI.ScriptPropertyField(extraDataSerializedObject);
|
||
|
|
||
|
VersionInfoGUI();
|
||
|
|
||
|
using (new EditorGUI.DisabledScope(HasModified())) {
|
||
|
rebuildPrefabTable = GUILayout.Button("Rebuild Prefab Table");
|
||
|
}
|
||
|
|
||
|
extraDataSerializedObject.Update();
|
||
|
EditorGUILayout.PropertyField(extraDataSerializedObject.FindPropertyOrThrow(nameof(NetworkProjectConfigAsset.Config)));
|
||
|
extraDataSerializedObject.ApplyModifiedProperties();
|
||
|
|
||
|
EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(NetworkProjectConfigImporter.PrefabOptions)));
|
||
|
|
||
|
EditorGUILayout.Space();
|
||
|
|
||
|
EditorGUILayout.Space();
|
||
|
EditorGUILayout.LabelField("Auto-Generated", EditorStyles.boldLabel);
|
||
|
|
||
|
if (GUILayout.Button("Show Network Prefabs Inspector")) {
|
||
|
NetworkPrefabsInspector.ShowWindow();
|
||
|
}
|
||
|
|
||
|
// WORKAROUND: during initial failed imports, this may be an instance of UnityEngine.DefaultAsset instead of the actual asset
|
||
|
if (assetSerializedObject?.targetObject.GetType() == typeof(NetworkProjectConfigAsset)) {
|
||
|
// this has the tendency to overwrite the global enabled flag, so let's make sure it's reset once the scope exists
|
||
|
using (new FusionEditorGUI.EnabledScope(GUI.enabled)) {
|
||
|
EditorGUILayout.PropertyField(assetSerializedObject.FindPropertyOrThrow(nameof(NetworkProjectConfigAsset.Prefabs)));
|
||
|
EditorGUILayout.PropertyField(assetSerializedObject.FindPropertyOrThrow(nameof(NetworkProjectConfigAsset.BehaviourMeta)));
|
||
|
}
|
||
|
} else {
|
||
|
EditorGUILayout.HelpBox("Asset failed to deserialize correctly. Please reimport.", MessageType.Warning);
|
||
|
}
|
||
|
}
|
||
|
} finally {
|
||
|
ApplyRevertGUI();
|
||
|
}
|
||
|
|
||
|
if (rebuildPrefabTable) {
|
||
|
NetworkProjectConfigUtilities.RebuildPrefabTable();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static void VersionInfoGUI() {
|
||
|
if (_allVersionInfo == null || _allVersionInfo == "") {
|
||
|
var asms = System.AppDomain.CurrentDomain.GetAssemblies();
|
||
|
for (int i = 0; i < asms.Length; ++i) {
|
||
|
var asm = asms[i];
|
||
|
var asmname = asm.FullName;
|
||
|
if (asmname.StartsWith("Fusion.Runtime,")) {
|
||
|
_version = NetworkRunner.BuildType + ": " + System.Diagnostics.FileVersionInfo.GetVersionInfo(asm.Location).ProductVersion;
|
||
|
}
|
||
|
if (asmname.StartsWith("Fusion.") || asmname.StartsWith("Fusion,")) {
|
||
|
string fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(asm.Location).ToString();
|
||
|
_allVersionInfo += asmname.Substring(0, asmname.IndexOf(",")) + ": " + fvi + " " + "\n";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
var r = EditorGUILayout.GetControlRect();
|
||
|
_versionExpanded = EditorGUI.Foldout(r, _versionExpanded, "");
|
||
|
EditorGUI.LabelField(r, "Fusion Version", _version);
|
||
|
|
||
|
if (_versionExpanded) {
|
||
|
EditorGUILayout.HelpBox(_allVersionInfo, MessageType.None);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected override void Apply() {
|
||
|
base.Apply();
|
||
|
|
||
|
if (targets != null) {
|
||
|
for (int i = 0; i < extraDataTargets.Length; ++i) {
|
||
|
var importer = GetImporter(i);
|
||
|
var wrapper = GetConfigWrapper(i);
|
||
|
|
||
|
EditorUtility.SetDirty(importer);
|
||
|
|
||
|
var json = EditorJsonUtility.ToJson(wrapper.Config, true);
|
||
|
File.WriteAllText(importer.assetPath, json);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected override void InitializeExtraDataInstance(UnityEngine.Object extraData, int targetIndex) {
|
||
|
try {
|
||
|
var importer = GetImporter(targetIndex);
|
||
|
var extra = (NetworkProjectConfigAsset)extraData;
|
||
|
|
||
|
extra.Config = NetworkProjectConfigImporter.LoadConfigFromFile(importer.assetPath);
|
||
|
|
||
|
_initializeException = null;
|
||
|
} catch (Exception ex) {
|
||
|
_initializeException = ex;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private NetworkProjectConfigImporter GetImporter(int i) {
|
||
|
return (NetworkProjectConfigImporter)targets[i];
|
||
|
}
|
||
|
|
||
|
private NetworkProjectConfigAsset GetConfigWrapper(int i) {
|
||
|
return (NetworkProjectConfigAsset)extraDataTargets[i];
|
||
|
}
|
||
|
}
|
||
|
}
|