Files
ZHGD_Web/Assets/Quixel/Scripts/BridgeImporter/MegascansBridgeLink.cs

168 lines
6.3 KiB
C#
Raw Permalink Normal View History

2025-07-13 23:16:20 +08:00
#if UNITY_EDITOR
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEditor;
using UnityEngine;
namespace Quixel {
public class QXLServer {
private TcpListener tcpListener;
private Thread tcpListenerThread;
private TcpClient connectedTcpClient;
private bool isRunning;
public List<string> jsonData = new List<string> ();
// Use this for initialization
public void StartServer () {
if(!isRunning)
{
// Start TcpServer background thread
tcpListenerThread = new Thread(new ThreadStart(ListenForIncommingRequests));
tcpListenerThread.IsBackground = true;
tcpListenerThread.Start();
isRunning = true;
}
}
public void EndServer () {
isRunning = false;
tcpListener.Stop ();
tcpListenerThread.Abort();
Debug.Log ("Quixel Bridge Plugin - Status: Disabled.");
}
private void ListenForIncommingRequests () {
try {
tcpListener = new TcpListener (IPAddress.Parse ("127.0.0.1"), 13081);
tcpListener.Start ();
Debug.Log ("Quixel Bridge Plugin - Status: Enabled.");
Byte[] bytes = new Byte[4096];
while (true) {
using (connectedTcpClient = tcpListener.AcceptTcpClient ()) {
using (NetworkStream stream = connectedTcpClient.GetStream ()) {
int length;
string clientMessage = "";
while ((length = stream.Read (bytes, 0, bytes.Length)) != 0) {
try {
byte[] incommingData = new byte[length];
Array.Copy(bytes, 0, incommingData, 0, length);
UTF8Encoding encodingUnicode = new UTF8Encoding();
clientMessage += encodingUnicode.GetString(incommingData);
} catch (Exception ex)
{
Debug.Log("Bridge Plugin Exception::Error::Encoding json data.");
Debug.Log("Exception: " + ex.ToString());
}
}
jsonData.Add (clientMessage);
}
}
}
} catch (SocketException socketException) {
Debug.Log ("Bridge Plugin - Status: Stopped.");
Debug.Log ("SocketException " + socketException.ToString ());
}
}
}
[InitializeOnLoad]
[ExecuteInEditMode]
public class MegascansBridgeLink {
static private bool isRunning = false;
static private QXLServer listener;
static private MegascansImporter mi;
static MegascansBridgeLink () {
listener = new QXLServer ();
EditorApplication.update += ImportTheThing;
mi = ScriptableObject.CreateInstance<MegascansImporter> ();
}
public static void ToggleServer(bool runServer = true)
{
if(runServer) //Start server
{
if (isRunning)
{
try
{
if (isRunning)
{
listener.EndServer();
isRunning = false;
}
}
catch (Exception ex)
{
Debug.Log(ex.ToString());
}
}
isRunning = true;
listener.StartServer();
}
else //Stop server
{
try
{
if (isRunning)
{
listener.EndServer();
isRunning = false;
}
}
catch (Exception ex)
{
Debug.Log(ex.ToString());
}
}
}
static void ImportTheThing () {
if (listener != null && isRunning) {
if (listener.jsonData.Count > 0) {
try {
string jArray = listener.jsonData[0];
Newtonsoft.Json.Linq.JArray testArray = Newtonsoft.Json.Linq.JArray.Parse(jArray);
List<Newtonsoft.Json.Linq.JObject> objectList = new List<Newtonsoft.Json.Linq.JObject>();
for (int i = 0; i < testArray.Count; ++i)
{
JObject assetObj = testArray[i].ToObject<Newtonsoft.Json.Linq.JObject>();
objectList.Add(assetObj);
}
string lastFolderPath = null;
for (int i = 0; i < objectList.Count; ++i)
{
Debug.Log(objectList[i]);
lastFolderPath = mi.ImportMegascansAssets(objectList[i]);
}
//Highlight the last imported asset at the end of the import operation.
if (lastFolderPath != null)
{
UnityEngine.Object folder = AssetDatabase.LoadAssetAtPath(lastFolderPath, typeof(UnityEngine.Object));
Selection.activeObject = folder;
EditorGUIUtility.PingObject(folder);
}
listener.jsonData.RemoveAt(0);
}
catch (Exception ex)
{
Debug.Log("Bridge Plugin Exception::Error::Parsing json data.");
Debug.Log("Bridge Plugin::Data::Received JSON Data: " + listener.jsonData);
Debug.Log("Exception: " + ex.ToString());
listener.jsonData.RemoveAt(0);
}
}
}
}
}
}
#endif