MirzkisD1Ex0 6 月之前
父節點
當前提交
0080cd9805
共有 100 個文件被更改,包括 2174 次插入286 次删除
  1. 二進制
      Materials/2D/tile设置.png
  2. 316 69
      Materials/Backend & Upload/Upload2ZCManager.cs
  3. 0 0
      Materials/DG/Tools/CanvasGroupMaster.cs
  4. 0 0
      Materials/DG/Tools/UIStageManager.cs
  5. 915 0
      Materials/MediaPipe/FaceDetation/Scenes/00.unity
  6. 87 0
      Materials/MediaPipe/FaceDetation/Scripts/FaceDetectorManager.cs
  7. 18 0
      Materials/MediaPipe/FaceDetation/Scripts/Tester.cs
  8. 43 0
      Materials/MediaPipe/FaceDetation/Scripts/ToneTuneToolkit/SingletonMaster.cs
  9. 二進制
      Materials/ScrollView/屏幕截图 2025-06-13 111409.png
  10. 111 0
      Materials/TCP/TCPClient.cs
  11. 117 0
      Materials/TCP/TCPServer.cs
  12. 50 0
      Materials/TCP/UnityMainThreadDispatcher.cs
  13. 0 0
      Materials/UI/ClickListener.cs
  14. 187 139
      ToneTuneToolkit/Assets/ToneTuneToolkit/README.md
  15. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Common/EventListener.cs
  16. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Common/PathChecker.cs
  17. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Common/SingletonMaster.cs
  18. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Common/TTTDebug.cs
  19. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Common/ToolkitManager.cs
  20. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Data/DataConverter.cs
  21. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Data/DataProcessor.cs
  22. 7 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Data/ImageLoader.cs
  23. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Data/JsonManager.cs
  24. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Data/LitJsonManager.cs
  25. 4 2
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Data/SensitiveWordUtility.cs
  26. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Data/TextLoader.cs
  27. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Data/TimestampCapturer.cs
  28. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Editor/CreateAssetBundles.cs
  29. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Editor/EditorStorage.cs
  30. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Editor/RenameFolders.cs
  31. 5 3
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Editor/UpdateCopyrights.cs
  32. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Funny/BubbleSort.cs
  33. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/IO/FTPMaster.cs
  34. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/IO/FileCapturer.cs
  35. 78 0
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/IO/NewFileAlerter.cs
  36. 11 0
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/IO/NewFileAlerter.cs.meta
  37. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Media/FullAngleScreenshotTool.cs
  38. 4 2
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Media/ScreenshotMaster.cs
  39. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Media/TextureProcessor.cs
  40. 4 2
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Media/WebCamHandler.cs
  41. 4 2
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Media/WebCamManager.cs
  42. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Mobile/ObjectRotateAndScale.cs
  43. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/MultimediaExhibitionHall/LED/LEDCommandCenter.cs
  44. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/MultimediaExhibitionHall/LED/LEDCommandHub.cs
  45. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/MultimediaExhibitionHall/LED/LEDHandler.cs
  46. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/MultimediaExhibitionHall/LED/LEDNuclearShow.cs
  47. 7 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Networking/JsonUploadManager.cs
  48. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Object/CorrectLookAtCamera.cs
  49. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Object/NeonLight.cs
  50. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Object/ObjectDragMove.cs
  51. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Object/ObjectDragRotate.cs
  52. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Object/ObjectFloating.cs
  53. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Object/ObjectSearcher.cs
  54. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Object/TraverseObejctChangeColor.cs
  55. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Other/AsyncLoadingWithProcessBar.cs
  56. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Other/CMDLauncher.cs
  57. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Other/KeyPressSimulator.cs
  58. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Other/LongTimeNoOperationDetector.cs
  59. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Other/QRCodeMaster.cs
  60. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/UDP/UDPCommunicator.cs
  61. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/UDP/UDPCommunicatorLite.cs
  62. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/UDP/UDPCommunicatorServer.cs
  63. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/UDP/UDPHandler.cs
  64. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/UDP/UDPResponder.cs
  65. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/UI/Parallax.cs
  66. 29 8
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/UI/ScrollViewHandler.cs
  67. 7 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/UI/SequenceFrameHandler.cs
  68. 7 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/UI/SequenceFrameManager.cs
  69. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/UI/TextFlick.cs
  70. 4 2
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/UI/UICurved.cs
  71. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Verification/AntiVerifier.cs
  72. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Verification/Verifier.cs
  73. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Verification/VerifierHandler.cs
  74. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Video/VideoMaster.cs
  75. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/View/CameraFocusObject.cs
  76. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/View/CameraLookAround.cs
  77. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/View/CameraSimpleMove.cs
  78. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/View/CameraZoom.cs
  79. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/WakeOnLan/WakeOnLan.cs
  80. 3 1
      ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/WakeOnLan/WakeOnLanHandler.cs
  81. 0 0
      ToneTuneToolkit/Assets/ToneTuneToolkit/Storage.meta
  82. 0 0
      ToneTuneToolkit/Assets/ToneTuneToolkit/Storage/Materials.meta
  83. 0 0
      ToneTuneToolkit/Assets/ToneTuneToolkit/Storage/Materials/panoramamaterials.mat
  84. 0 0
      ToneTuneToolkit/Assets/ToneTuneToolkit/Storage/Materials/panoramamaterials.mat.meta
  85. 0 0
      ToneTuneToolkit/Assets/ToneTuneToolkit/Storage/Textures.meta
  86. 0 0
      ToneTuneToolkit/Assets/ToneTuneToolkit/Storage/Textures/panoramajpg.jpg
  87. 0 0
      ToneTuneToolkit/Assets/ToneTuneToolkit/Storage/Textures/panoramajpg.jpg.meta
  88. 0 0
      ToneTuneToolkit/Assets/Tutorial.meta
  89. 0 0
      ToneTuneToolkit/Assets/Tutorial/001_FileNameCapturer.meta
  90. 0 0
      ToneTuneToolkit/Assets/Tutorial/001_FileNameCapturer/Scenes.meta
  91. 0 0
      ToneTuneToolkit/Assets/Tutorial/001_FileNameCapturer/Scenes/Example.unity
  92. 0 0
      ToneTuneToolkit/Assets/Tutorial/001_FileNameCapturer/Scenes/Example.unity.meta
  93. 0 0
      ToneTuneToolkit/Assets/Tutorial/001_FileNameCapturer/Scripts.meta
  94. 0 0
      ToneTuneToolkit/Assets/Tutorial/001_FileNameCapturer/Scripts/FNC.cs
  95. 0 0
      ToneTuneToolkit/Assets/Tutorial/001_FileNameCapturer/Scripts/FNC.cs.meta
  96. 0 0
      ToneTuneToolkit/Assets/Tutorial/002_TimestampCapturer.meta
  97. 0 0
      ToneTuneToolkit/Assets/Tutorial/002_TimestampCapturer/Scenes.meta
  98. 0 0
      ToneTuneToolkit/Assets/Tutorial/002_TimestampCapturer/Scenes/Example.unity
  99. 0 0
      ToneTuneToolkit/Assets/Tutorial/002_TimestampCapturer/Scenes/Example.unity.meta
  100. 0 0
      ToneTuneToolkit/Assets/Tutorial/002_TimestampCapturer/Scripts.meta

二進制
Materials/2D/tile设置.png


+ 316 - 69
Materials/Backend & Upload/Upload2ZCManager.cs

@@ -7,6 +7,7 @@ using UnityEngine.Events;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Linq;
 using System;
+using System.Text;
 
 /// <summary>
 /// 对志城综合法宝
@@ -15,22 +16,34 @@ public class Upload2ZCManager : SingletonMaster<Upload2ZCManager>
 {
 
   // ==================================================
-  #region 2025.04 Nike ADT
+  #region 2025.6 VWAIPhoto
+
+  public static UnityAction<Texture2D, bool> OnVWAvatarFinished;
+
+  private const string VWSUBMITURL = @"https://vw-v-space.studiocapsule.cn/api/device/submitTask";
+
+  public void UpgradeVWUserData(string gender, string car, string address, Texture2D file)
+  {
+    uVWUD.gender = gender;
+    uVWUD.car = car;
+    uVWUD.address = address;
+    uVWUD.file = file.EncodeToPNG();
+    return;
+  }
 
-  private const string USERINFOREQUESTURL = @"https://nike-adt.studiocapsule.cn/api/device/scanQr";
-  public static UnityAction<UserInfo> OnUserInfoDownloaded;
+  // ==================================================
+  // 提交生成任务
 
-  /// <summary>
-  /// 获取用户信息
-  /// </summary>
-  /// <param name="url"></param>
-  public void GetUserInfo(string url) => StartCoroutine(nameof(GetUserInfoAction), url);
-  private IEnumerator GetUserInfoAction(string url)
+  public void SubmitVWUserPhoto() => StartCoroutine(nameof(SubmitVWUserPhotoAction));
+  private IEnumerator SubmitVWUserPhotoAction()
   {
     WWWForm wwwForm = new WWWForm();
-    wwwForm.AddField("qr_content", url);
+    wwwForm.AddField("gender", uVWUD.gender);
+    wwwForm.AddField("car", uVWUD.car);
+    wwwForm.AddField("address", uVWUD.address);
+    wwwForm.AddBinaryData("file", uVWUD.file);
 
-    using (UnityWebRequest www = UnityWebRequest.Post(USERINFOREQUESTURL, wwwForm))
+    using (UnityWebRequest www = UnityWebRequest.Post(VWSUBMITURL, wwwForm))
     {
       www.downloadHandler = new DownloadHandlerBuffer();
       yield return www.SendWebRequest();
@@ -44,80 +57,166 @@ public class Upload2ZCManager : SingletonMaster<Upload2ZCManager>
       Debug.Log($"[U2ZCM] {www.downloadHandler.text}");
       try
       {
-        uird = JsonConvert.DeserializeObject<Respon_UserInfoData>(www.downloadHandler.text);
+        rVWUD = JsonConvert.DeserializeObject<Respon_VWUserData>(www.downloadHandler.text);
+      }
+      catch
+      {
+        OnVWAvatarFinished?.Invoke(null, false);
       }
-      catch (Exception)
+      if (rVWUD.code != 0)
       {
-        Debug.Log($"[U2ZCM] 解析错误");
+        Debug.Log($"[U2ZCM] Code Error");
         yield break;
       }
 
-      if (uird.code != 0)
+      StartQueryTask(); // 轮询直到出答案
+    }
+    yield break;
+  }
+
+
+
+  private Upload_VWUserData uVWUD = new Upload_VWUserData();
+  [SerializeField] private Respon_VWUserData rVWUD = new Respon_VWUserData();
+
+  [Serializable]
+  public class Upload_VWUserData
+  {
+    public string gender;
+    public string car;
+    public string address;
+    public byte[] file;
+  }
+
+  [Serializable]
+  public class Respon_VWUserData
+  {
+    public int code;
+    public Respon_VWUserDataData data;
+  }
+
+  [Serializable]
+  public class Respon_VWUserDataData
+  {
+    public string task_code;
+  }
+
+  // ==================================================
+  // 轮询
+
+  private int queryCount = 0;
+  private const string VWQUERYURL = @"https://vw-v-space.studiocapsule.cn/api/device/queryTask";
+
+  public void StartQueryTask() { StartCoroutine(nameof(QueryTaskAction)); }
+  public void StopQueryTask() { StopCoroutine(nameof(QueryTaskAction)); }
+  private IEnumerator QueryTaskAction()
+  {
+    yield return new WaitForSeconds(5f); // 先等5秒
+    while (true)
+    {
+      queryCount++;
+
+      if (queryCount > 12)
       {
-        if (OnUserInfoDownloaded != null)
-        {
-          OnUserInfoDownloaded(null);
-        }
+        Debug.Log($"[U2ZCM] 轮询次数过多,停止查询");
+        OnVWAvatarFinished?.Invoke(null, false);
         yield break;
       }
 
-      if (OnUserInfoDownloaded != null)
+      WWWForm wwwForm = new WWWForm();
+      wwwForm.AddField("task_code", rVWUD.data.task_code);
+      using (UnityWebRequest www = UnityWebRequest.Post(VWQUERYURL, wwwForm))
       {
-        UserInfo ui = new UserInfo();
-        ui.name = uird.data.name;
-        ui.code = uird.data.code;
-        ui.save_car = uird.data.save_car;
-        ui.can_play = uird.data.can_play;
-        OnUserInfoDownloaded(ui);
+        www.downloadHandler = new DownloadHandlerBuffer();
+        yield return www.SendWebRequest();
+
+        if (www.result != UnityWebRequest.Result.Success)
+        {
+          Debug.Log($"[U2ZCM] {www.error}");
+          yield break;
+        }
+
+        Debug.Log($"[U2ZCM] {www.downloadHandler.text}");
+        rVWAD = JsonConvert.DeserializeObject<Respon_VWAvatarData>(www.downloadHandler.text);
+
+        if (rVWUD.code != 0)
+        {
+          Debug.Log($"[U2ZCM] Code Error");
+          OnVWAvatarFinished?.Invoke(null, false);
+          yield break;
+        }
+
+        switch (rVWAD.data.status)
+        {
+          default: break;
+          case 3:
+            queryCount = 0;
+            Debug.Log("[U2ZCM] 开始下载图片");
+            StartCoroutine(nameof(DownloadAvatarAction), rVWAD.data.avatar_url); // 下载图片
+            yield break;
+          case 4:
+            OnVWAvatarFinished?.Invoke(null, false);
+            break;
+        }
+
+        yield return new WaitForSeconds(5f);
       }
     }
-    yield break;
   }
 
-  [SerializeField] private Respon_UserInfoData uird = new Respon_UserInfoData();
+
+
+  [SerializeField] private Respon_VWAvatarData rVWAD = new Respon_VWAvatarData();
 
   [Serializable]
-  public class Respon_UserInfoData
+  public class Respon_VWAvatarData
   {
     public int code;
     public string message;
-    public UserInfo data;
+    public Respon_VWAvatarDataData data;
   }
 
   [Serializable]
-  public class UserInfo
+  public class Respon_VWAvatarDataData
   {
-    public string name;
-    public string code;
-    public string save_car;
-    public string can_play;
+    public string avatar_url;
+    public int status;
+    public string status_text;
   }
 
   // ==================================================
+  // 获取图片
 
-  private const string USERIMAGEUPLOADURL = @"https://nike-adt.studiocapsule.cn/api/device/upload";
-
-  public static UnityAction<string> OnUserImageUploaded;
-
-  [SerializeField] private Upload_UserImageData uUID;
-  public void UpdateUserImageData(string user_code, Texture2D t2dPhoto)
+  private IEnumerator DownloadAvatarAction(string url)
   {
-    uUID = new Upload_UserImageData();
-    uUID.user_code = user_code;
+    using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(url))
+    {
+      yield return www.SendWebRequest();
+      if (www.result != UnityWebRequest.Result.Success)
+      {
+        Debug.Log($"[U2ZCM] {www.error}");
+        yield break;
+      }
 
-    byte[] fileBytes = t2dPhoto.EncodeToPNG();
-    uUID.file = fileBytes;
-    return;
+      debug_peekQRCode = DownloadHandlerTexture.GetContent(www); // DEBUG
+      OnVWAvatarFinished?.Invoke(DownloadHandlerTexture.GetContent(www), true);
+    }
+    yield break;
   }
 
-  public void UploadUserImage() => StartCoroutine(nameof(UploadUserImageAction));
-  private IEnumerator UploadUserImageAction()
+  // ==================================================
+  // 上传图片并获取二维码地址
+
+  private const string VWUPLOADURL = @"https://vw-v-space.studiocapsule.cn/api/device/finalUpload";
+
+  public void UploadVWResult(Texture2D value) => StartCoroutine(nameof(UploadVWResultAction), value);
+  private IEnumerator UploadVWResultAction(Texture2D t2dResult)
   {
     WWWForm wwwForm = new WWWForm();
-    wwwForm.AddField("user_code", uUID.user_code);
-    wwwForm.AddBinaryData("file", uUID.file);
+    wwwForm.AddField("task_code", rVWUD.data.task_code);
+    wwwForm.AddBinaryData("file", t2dResult.EncodeToJPG(), "t2d.jpg", "image/jpeg");
 
-    using (UnityWebRequest www = UnityWebRequest.Post(USERIMAGEUPLOADURL, wwwForm))
+    using (UnityWebRequest www = UnityWebRequest.Post(VWUPLOADURL, wwwForm))
     {
       www.downloadHandler = new DownloadHandlerBuffer();
       yield return www.SendWebRequest();
@@ -129,43 +228,42 @@ public class Upload2ZCManager : SingletonMaster<Upload2ZCManager>
       }
 
       Debug.Log($"[U2ZCM] {www.downloadHandler.text}");
-      rUID = JsonConvert.DeserializeObject<Respon_UserImageData>(www.downloadHandler.text);
 
-      if (rUID.code != 0)
+      rVWRD = JsonConvert.DeserializeObject<Respon_VWResultData>(www.downloadHandler.text);
+
+      if (rVWRD.code != 0)
       {
         Debug.Log($"[U2ZCM] Code Error");
         yield break;
       }
 
-      DownloadQRCode(rUID.data.qr_url); // 搞图
+      DownloadQRCode(rVWRD.data.qr_url);
     }
     yield break;
   }
 
-  public class Upload_UserImageData
-  {
-    public string user_code;
-    public byte[] file;
-  }
 
-  [SerializeField] private Respon_UserImageData rUID = new Respon_UserImageData();
+
+  [SerializeField] private Respon_VWResultData rVWRD = new Respon_VWResultData();
 
   [Serializable]
-  public class Respon_UserImageData
+  public class Respon_VWResultData
   {
     public int code;
     public string message;
-    public Respon_UserImageDataData data;
+    public Respon_VWResultDataData data;
   }
-
   [Serializable]
-  public class Respon_UserImageDataData
+  public class Respon_VWResultDataData
   {
     public string qr_url;
+    public string file_url;
   }
 
   #endregion
   // ==================================================
+  // ==================================================
+  // ==================================================
   #region 获取QR图片
 
   public static UnityAction<Texture2D> OnQRImageDownloaded;
@@ -185,11 +283,7 @@ public class Upload2ZCManager : SingletonMaster<Upload2ZCManager>
       }
 
       debug_peekQRCode = DownloadHandlerTexture.GetContent(www); // DEBUG
-
-      if (OnQRImageDownloaded != null)
-      {
-        OnQRImageDownloaded(DownloadHandlerTexture.GetContent(www));
-      }
+      OnQRImageDownloaded?.Invoke(DownloadHandlerTexture.GetContent(www));
     }
     yield break;
   }
@@ -247,4 +341,157 @@ public class Upload2ZCManager : SingletonMaster<Upload2ZCManager>
     public string message;
     public object data;
   }
+
+
+
+  #region 2025.04 Nike ADT
+
+  // private const string USERINFOREQUESTURL = @"https://nike-adt.studiocapsule.cn/api/device/scanQr";
+  // public static UnityAction<UserInfo> OnUserInfoDownloaded;
+
+  // /// <summary>
+  // /// 获取用户信息
+  // /// </summary>
+  // /// <param name="url"></param>
+  // public void GetUserInfo(string url) => StartCoroutine(nameof(GetUserInfoAction), url);
+  // private IEnumerator GetUserInfoAction(string url)
+  // {
+  //   WWWForm wwwForm = new WWWForm();
+  //   wwwForm.AddField("qr_content", url);
+
+  //   using (UnityWebRequest www = UnityWebRequest.Post(USERINFOREQUESTURL, wwwForm))
+  //   {
+  //     www.downloadHandler = new DownloadHandlerBuffer();
+  //     yield return www.SendWebRequest();
+
+  //     if (www.result != UnityWebRequest.Result.Success)
+  //     {
+  //       Debug.Log($"[U2ZCM] {www.error}");
+  //       yield break;
+  //     }
+
+  //     Debug.Log($"[U2ZCM] {www.downloadHandler.text}");
+  //     try
+  //     {
+  //       uird = JsonConvert.DeserializeObject<Respon_UserInfoData>(www.downloadHandler.text);
+  //     }
+  //     catch (Exception)
+  //     {
+  //       Debug.Log($"[U2ZCM] 解析错误");
+  //       yield break;
+  //     }
+
+  //     if (uird.code != 0)
+  //     {
+  //       if (OnUserInfoDownloaded != null)
+  //       {
+  //         OnUserInfoDownloaded(null);
+  //       }
+  //       yield break;
+  //     }
+
+  //     if (OnUserInfoDownloaded != null)
+  //     {
+  //       UserInfo ui = new UserInfo();
+  //       ui.name = uird.data.name;
+  //       ui.code = uird.data.code;
+  //       ui.save_car = uird.data.save_car;
+  //       ui.can_play = uird.data.can_play;
+  //       OnUserInfoDownloaded(ui);
+  //     }
+  //   }
+  //   yield break;
+  // }
+
+  // private Respon_UserInfoData uird = new Respon_UserInfoData();
+
+  // [Serializable]
+  // public class Respon_UserInfoData
+  // {
+  //   public int code;
+  //   public string message;
+  //   public UserInfo data;
+  // }
+
+  // [Serializable]
+  // public class UserInfo
+  // {
+  //   public string name;
+  //   public string code;
+  //   public string save_car;
+  //   public string can_play;
+  // }
+
+  // // ==================================================
+
+  // private const string USERIMAGEUPLOADURL = @"https://nike-adt.studiocapsule.cn/api/device/upload";
+
+  // public static UnityAction<string> OnUserImageUploaded;
+
+  // [SerializeField] private Upload_UserImageData uUID;
+  // public void UpdateUserImageData(string user_code, Texture2D t2dPhoto)
+  // {
+  //   uUID = new Upload_UserImageData();
+  //   uUID.user_code = user_code;
+
+  //   byte[] fileBytes = t2dPhoto.EncodeToPNG();
+  //   uUID.file = fileBytes;
+  //   return;
+  // }
+
+  // public void UploadUserImage() => StartCoroutine(nameof(UploadUserImageAction));
+  // private IEnumerator UploadUserImageAction()
+  // {
+  //   WWWForm wwwForm = new WWWForm();
+  //   wwwForm.AddField("user_code", uUID.user_code);
+  //   wwwForm.AddBinaryData("file", uUID.file);
+
+  //   using (UnityWebRequest www = UnityWebRequest.Post(USERIMAGEUPLOADURL, wwwForm))
+  //   {
+  //     www.downloadHandler = new DownloadHandlerBuffer();
+  //     yield return www.SendWebRequest();
+
+  //     if (www.result != UnityWebRequest.Result.Success)
+  //     {
+  //       Debug.Log($"[U2ZCM] {www.error}");
+  //       yield break;
+  //     }
+
+  //     Debug.Log($"[U2ZCM] {www.downloadHandler.text}");
+  //     rUID = JsonConvert.DeserializeObject<Respon_UserImageData>(www.downloadHandler.text);
+
+  //     if (rUID.code != 0)
+  //     {
+  //       Debug.Log($"[U2ZCM] Code Error");
+  //       yield break;
+  //     }
+
+  //     DownloadQRCode(rUID.data.qr_url); // 搞图
+  //   }
+  //   yield break;
+  // }
+
+  // public class Upload_UserImageData
+  // {
+  //   public string user_code;
+  //   public byte[] file;
+  // }
+
+  // private Respon_UserImageData rUID = new Respon_UserImageData();
+
+  // [Serializable]
+  // public class Respon_UserImageData
+  // {
+  //   public int code;
+  //   public string message;
+  //   public Respon_UserImageDataData data;
+  // }
+
+  // [Serializable]
+  // public class Respon_UserImageDataData
+  // {
+  //   public string qr_url;
+  // }
+
+  #endregion
 }

+ 0 - 0
Materials/CanvasGroup_DG/Tools/CanvasGroupMaster.cs → Materials/DG/Tools/CanvasGroupMaster.cs


+ 0 - 0
Materials/CanvasGroup_DG/Tools/UIStageManager.cs → Materials/DG/Tools/UIStageManager.cs


+ 915 - 0
Materials/MediaPipe/FaceDetation/Scenes/00.unity

@@ -0,0 +1,915 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_OcclusionBakeSettings:
+    smallestOccluder: 5
+    smallestHole: 0.25
+    backfaceThreshold: 100
+  m_SceneGUID: 00000000000000000000000000000000
+  m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 9
+  m_Fog: 0
+  m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+  m_FogMode: 3
+  m_FogDensity: 0.01
+  m_LinearFogStart: 0
+  m_LinearFogEnd: 300
+  m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+  m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+  m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+  m_AmbientIntensity: 1
+  m_AmbientMode: 0
+  m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+  m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+  m_HaloStrength: 0.5
+  m_FlareStrength: 1
+  m_FlareFadeSpeed: 3
+  m_HaloTexture: {fileID: 0}
+  m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+  m_DefaultReflectionMode: 0
+  m_DefaultReflectionResolution: 128
+  m_ReflectionBounces: 1
+  m_ReflectionIntensity: 1
+  m_CustomReflection: {fileID: 0}
+  m_Sun: {fileID: 0}
+  m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 12
+  m_GIWorkflowMode: 1
+  m_GISettings:
+    serializedVersion: 2
+    m_BounceScale: 1
+    m_IndirectOutputScale: 1
+    m_AlbedoBoost: 1
+    m_EnvironmentLightingMode: 0
+    m_EnableBakedLightmaps: 1
+    m_EnableRealtimeLightmaps: 0
+  m_LightmapEditorSettings:
+    serializedVersion: 12
+    m_Resolution: 2
+    m_BakeResolution: 40
+    m_AtlasSize: 1024
+    m_AO: 0
+    m_AOMaxDistance: 1
+    m_CompAOExponent: 1
+    m_CompAOExponentDirect: 0
+    m_ExtractAmbientOcclusion: 0
+    m_Padding: 2
+    m_LightmapParameters: {fileID: 0}
+    m_LightmapsBakeMode: 1
+    m_TextureCompression: 1
+    m_FinalGather: 0
+    m_FinalGatherFiltering: 1
+    m_FinalGatherRayCount: 256
+    m_ReflectionCompression: 2
+    m_MixedBakeMode: 2
+    m_BakeBackend: 1
+    m_PVRSampling: 1
+    m_PVRDirectSampleCount: 32
+    m_PVRSampleCount: 512
+    m_PVRBounces: 2
+    m_PVREnvironmentSampleCount: 256
+    m_PVREnvironmentReferencePointCount: 2048
+    m_PVRFilteringMode: 1
+    m_PVRDenoiserTypeDirect: 1
+    m_PVRDenoiserTypeIndirect: 1
+    m_PVRDenoiserTypeAO: 1
+    m_PVRFilterTypeDirect: 0
+    m_PVRFilterTypeIndirect: 0
+    m_PVRFilterTypeAO: 0
+    m_PVREnvironmentMIS: 1
+    m_PVRCulling: 1
+    m_PVRFilteringGaussRadiusDirect: 1
+    m_PVRFilteringGaussRadiusIndirect: 5
+    m_PVRFilteringGaussRadiusAO: 2
+    m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+    m_PVRFilteringAtrousPositionSigmaIndirect: 2
+    m_PVRFilteringAtrousPositionSigmaAO: 1
+    m_ExportTrainingData: 0
+    m_TrainingDataDestination: TrainingData
+    m_LightProbeSampleCountMultiplier: 4
+  m_LightingDataAsset: {fileID: 0}
+  m_LightingSettings: {fileID: 0}
+--- !u!196 &4
+NavMeshSettings:
+  serializedVersion: 2
+  m_ObjectHideFlags: 0
+  m_BuildSettings:
+    serializedVersion: 3
+    agentTypeID: 0
+    agentRadius: 0.5
+    agentHeight: 2
+    agentSlope: 45
+    agentClimb: 0.4
+    ledgeDropHeight: 0
+    maxJumpAcrossDistance: 0
+    minRegionArea: 2
+    manualCellSize: 0
+    cellSize: 0.16666667
+    manualTileSize: 0
+    tileSize: 256
+    buildHeightMesh: 0
+    maxJobWorkers: 0
+    preserveTilesOutsideBounds: 0
+    debug:
+      m_Flags: 0
+  m_NavMeshData: {fileID: 0}
+--- !u!1001 &338992141
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 1006057041}
+    m_Modifications:
+    - target: {fileID: 5535674424067552597, guid: 26114bc9cccb92454a468ea4d41f400a, type: 3}
+      propertyPath: m_RootOrder
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 5535674424067552597, guid: 26114bc9cccb92454a468ea4d41f400a, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 5535674424067552597, guid: 26114bc9cccb92454a468ea4d41f400a, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 5535674424067552597, guid: 26114bc9cccb92454a468ea4d41f400a, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 5535674424067552597, guid: 26114bc9cccb92454a468ea4d41f400a, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 5535674424067552597, guid: 26114bc9cccb92454a468ea4d41f400a, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 5535674424067552597, guid: 26114bc9cccb92454a468ea4d41f400a, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 5535674424067552597, guid: 26114bc9cccb92454a468ea4d41f400a, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 5535674424067552597, guid: 26114bc9cccb92454a468ea4d41f400a, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 5535674424067552597, guid: 26114bc9cccb92454a468ea4d41f400a, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 5535674424067552597, guid: 26114bc9cccb92454a468ea4d41f400a, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 6320745076577806712, guid: 26114bc9cccb92454a468ea4d41f400a, type: 3}
+      propertyPath: m_Name
+      value: FaceDetections Annotation
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: 26114bc9cccb92454a468ea4d41f400a, type: 3}
+--- !u!114 &338992142 stripped
+MonoBehaviour:
+  m_CorrespondingSourceObject: {fileID: -6338546567352850726, guid: 26114bc9cccb92454a468ea4d41f400a, type: 3}
+  m_PrefabInstance: {fileID: 338992141}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: d433cdb024dfd584696eeb11efb71102, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!4 &338992143 stripped
+Transform:
+  m_CorrespondingSourceObject: {fileID: 5535674424067552597, guid: 26114bc9cccb92454a468ea4d41f400a, type: 3}
+  m_PrefabInstance: {fileID: 338992141}
+  m_PrefabAsset: {fileID: 0}
+--- !u!1 &381049740
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 381049744}
+  - component: {fileID: 381049743}
+  - component: {fileID: 381049742}
+  - component: {fileID: 381049741}
+  m_Layer: 5
+  m_Name: Main Canvas
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &381049741
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 381049740}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_IgnoreReversedGraphics: 1
+  m_BlockingObjects: 0
+  m_BlockingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+--- !u!114 &381049742
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 381049740}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_UiScaleMode: 1
+  m_ReferencePixelsPerUnit: 100
+  m_ScaleFactor: 1
+  m_ReferenceResolution: {x: 2436, y: 1125}
+  m_ScreenMatchMode: 1
+  m_MatchWidthOrHeight: 0
+  m_PhysicalUnit: 3
+  m_FallbackScreenDPI: 96
+  m_DefaultSpriteDPI: 96
+  m_DynamicPixelsPerUnit: 1
+  m_PresetInfoIsWorld: 0
+--- !u!223 &381049743
+Canvas:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 381049740}
+  m_Enabled: 1
+  serializedVersion: 3
+  m_RenderMode: 1
+  m_Camera: {fileID: 1969388816}
+  m_PlaneDistance: 100
+  m_PixelPerfect: 0
+  m_ReceivesEvents: 1
+  m_OverrideSorting: 0
+  m_OverridePixelPerfect: 0
+  m_SortingBucketNormalizedSize: 0
+  m_VertexColorAlwaysGammaSpace: 0
+  m_AdditionalShaderChannelsFlag: 0
+  m_UpdateRectTransformForStandalone: 0
+  m_SortingLayerID: 0
+  m_SortingOrder: 0
+  m_TargetDisplay: 0
+--- !u!224 &381049744
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 381049740}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0, y: 0, z: 0}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 1106980025}
+  - {fileID: 1006057044}
+  m_Father: {fileID: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0, y: 0}
+--- !u!1 &420786853
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 420786856}
+  - component: {fileID: 420786855}
+  - component: {fileID: 420786854}
+  m_Layer: 0
+  m_Name: EventSystem
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &420786854
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 420786853}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_SendPointerHoverToParent: 1
+  m_HorizontalAxis: Horizontal
+  m_VerticalAxis: Vertical
+  m_SubmitButton: Submit
+  m_CancelButton: Cancel
+  m_InputActionsPerSecond: 10
+  m_RepeatDelay: 0.5
+  m_ForceModuleActive: 0
+--- !u!114 &420786855
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 420786853}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_FirstSelected: {fileID: 0}
+  m_sendNavigationEvents: 1
+  m_DragThreshold: 10
+--- !u!4 &420786856
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 420786853}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &731190175
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 731190177}
+  - component: {fileID: 731190176}
+  m_Layer: 0
+  m_Name: Face Detector Manager
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &731190176
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 731190175}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1794b9326ff8eac4da3f283707110a6a, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  runner: {fileID: 1064799468}
+--- !u!4 &731190177
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 731190175}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: -81.4295, y: -17.092503, z: 89.29714}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1001 &1006057040
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 381049744}
+    m_Modifications:
+    - target: {fileID: 3259285889726014650, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      propertyPath: m_Pivot.x
+      value: 0.5
+      objectReference: {fileID: 0}
+    - target: {fileID: 3259285889726014650, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      propertyPath: m_Pivot.y
+      value: 0.5
+      objectReference: {fileID: 0}
+    - target: {fileID: 3259285889726014650, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      propertyPath: m_RootOrder
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 3259285889726014650, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      propertyPath: m_AnchorMax.x
+      value: 0.5
+      objectReference: {fileID: 0}
+    - target: {fileID: 3259285889726014650, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      propertyPath: m_AnchorMax.y
+      value: 0.5
+      objectReference: {fileID: 0}
+    - target: {fileID: 3259285889726014650, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      propertyPath: m_AnchorMin.x
+      value: 0.5
+      objectReference: {fileID: 0}
+    - target: {fileID: 3259285889726014650, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      propertyPath: m_AnchorMin.y
+      value: 0.5
+      objectReference: {fileID: 0}
+    - target: {fileID: 3259285889726014650, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      propertyPath: m_SizeDelta.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 3259285889726014650, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      propertyPath: m_SizeDelta.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 3259285889726014650, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 3259285889726014650, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 3259285889726014650, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 3259285889726014650, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 3259285889726014650, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: -0
+      objectReference: {fileID: 0}
+    - target: {fileID: 3259285889726014650, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: -0
+      objectReference: {fileID: 0}
+    - target: {fileID: 3259285889726014650, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: -0
+      objectReference: {fileID: 0}
+    - target: {fileID: 3259285889726014650, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      propertyPath: m_AnchoredPosition.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 3259285889726014650, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      propertyPath: m_AnchoredPosition.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 3259285889726014650, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 3259285889726014650, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 3259285889726014650, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 3259285889726014651, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      propertyPath: m_Name
+      value: Annotatable Screen
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects:
+    - targetCorrespondingSourceObject: {fileID: 7074087083388479136, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      insertIndex: -1
+      addedObject: {fileID: 338992143}
+    m_AddedComponents:
+    - targetCorrespondingSourceObject: {fileID: 8798066379235852099, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+      insertIndex: -1
+      addedObject: {fileID: 1006057045}
+  m_SourcePrefab: {fileID: 100100000, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+--- !u!4 &1006057041 stripped
+Transform:
+  m_CorrespondingSourceObject: {fileID: 7074087083388479136, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+  m_PrefabInstance: {fileID: 1006057040}
+  m_PrefabAsset: {fileID: 0}
+--- !u!1 &1006057042 stripped
+GameObject:
+  m_CorrespondingSourceObject: {fileID: 8798066379235852099, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+  m_PrefabInstance: {fileID: 1006057040}
+  m_PrefabAsset: {fileID: 0}
+--- !u!114 &1006057043 stripped
+MonoBehaviour:
+  m_CorrespondingSourceObject: {fileID: 2020366215714292840, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+  m_PrefabInstance: {fileID: 1006057040}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 827c4431af677e057aa6f14170d0785c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!224 &1006057044 stripped
+RectTransform:
+  m_CorrespondingSourceObject: {fileID: 3259285889726014650, guid: 5713b959e3c77a58fb258133fc8e4aef, type: 3}
+  m_PrefabInstance: {fileID: 1006057040}
+  m_PrefabAsset: {fileID: 0}
+--- !u!114 &1006057045
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1006057042}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 3495500f1386ce3ee9a87dc859112641, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  annotation: {fileID: 338992142}
+  _threshold: 0
+--- !u!1 &1064799459
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1064799461}
+  - component: {fileID: 1064799468}
+  m_Layer: 0
+  m_Name: Solution
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1064799461
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1064799459}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: -1}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1064799468
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1064799459}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0b86ba34db2c888778bdb2f439fd1c76, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  _bootstrapPrefab: {fileID: 968918444066301895, guid: 1146a9de09159a948b683e94fb3d3c95, type: 3}
+  screen: {fileID: 1006057043}
+  runningMode: 0
+  _detectionResultAnnotationController: {fileID: 1006057045}
+--- !u!1 &1106980024
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1106980025}
+  - component: {fileID: 1106980027}
+  - component: {fileID: 1106980026}
+  m_Layer: 5
+  m_Name: Image - Background
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1106980025
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1106980024}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 381049744}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1106980026
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1106980024}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.21960784, g: 0.21960784, b: 0.21960784, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 0}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1106980027
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1106980024}
+  m_CullTransparentMesh: 1
+--- !u!1 &1784242771
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1784242772}
+  m_Layer: 0
+  m_Name: // ==================================================
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1784242772
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1784242771}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1806680259
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1806680261}
+  - component: {fileID: 1806680260}
+  m_Layer: 0
+  m_Name: Directional Light
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!108 &1806680260
+Light:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1806680259}
+  m_Enabled: 1
+  serializedVersion: 10
+  m_Type: 1
+  m_Shape: 0
+  m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
+  m_Intensity: 1
+  m_Range: 10
+  m_SpotAngle: 30
+  m_InnerSpotAngle: 21.80208
+  m_CookieSize: 10
+  m_Shadows:
+    m_Type: 2
+    m_Resolution: -1
+    m_CustomResolution: -1
+    m_Strength: 1
+    m_Bias: 0.05
+    m_NormalBias: 0.4
+    m_NearPlane: 0.2
+    m_CullingMatrixOverride:
+      e00: 1
+      e01: 0
+      e02: 0
+      e03: 0
+      e10: 0
+      e11: 1
+      e12: 0
+      e13: 0
+      e20: 0
+      e21: 0
+      e22: 1
+      e23: 0
+      e30: 0
+      e31: 0
+      e32: 0
+      e33: 1
+    m_UseCullingMatrixOverride: 0
+  m_Cookie: {fileID: 0}
+  m_DrawHalo: 0
+  m_Flare: {fileID: 0}
+  m_RenderMode: 0
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_RenderingLayerMask: 1
+  m_Lightmapping: 4
+  m_LightShadowCasterMode: 0
+  m_AreaSize: {x: 1, y: 1}
+  m_BounceIntensity: 1
+  m_ColorTemperature: 6570
+  m_UseColorTemperature: 0
+  m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
+  m_UseBoundingSphereOverride: 0
+  m_UseViewFrustumForShadowCasterCull: 1
+  m_ShadowRadius: 0
+  m_ShadowAngle: 0
+--- !u!4 &1806680261
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1806680259}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
+  m_LocalPosition: {x: 0, y: 3, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
+--- !u!1 &1969388814
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1969388817}
+  - component: {fileID: 1969388816}
+  - component: {fileID: 1969388815}
+  m_Layer: 0
+  m_Name: Main Camera
+  m_TagString: MainCamera
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!81 &1969388815
+AudioListener:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1969388814}
+  m_Enabled: 1
+--- !u!20 &1969388816
+Camera:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1969388814}
+  m_Enabled: 1
+  serializedVersion: 2
+  m_ClearFlags: 1
+  m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+  m_projectionMatrixMode: 1
+  m_GateFitMode: 2
+  m_FOVAxisMode: 0
+  m_Iso: 200
+  m_ShutterSpeed: 0.005
+  m_Aperture: 16
+  m_FocusDistance: 10
+  m_FocalLength: 50
+  m_BladeCount: 5
+  m_Curvature: {x: 2, y: 11}
+  m_BarrelClipping: 0.25
+  m_Anamorphism: 0
+  m_SensorSize: {x: 36, y: 24}
+  m_LensShift: {x: 0, y: 0}
+  m_NormalizedViewPortRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  near clip plane: 0.3
+  far clip plane: 1000
+  field of view: 60
+  orthographic: 0
+  orthographic size: 5
+  m_Depth: -1
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_RenderingPath: -1
+  m_TargetTexture: {fileID: 0}
+  m_TargetDisplay: 0
+  m_TargetEye: 3
+  m_HDR: 1
+  m_AllowMSAA: 1
+  m_AllowDynamicResolution: 0
+  m_ForceIntoRT: 0
+  m_OcclusionCulling: 1
+  m_StereoConvergence: 10
+  m_StereoSeparation: 0.022
+--- !u!4 &1969388817
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1969388814}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 1, z: -10}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1660057539 &9223372036854775807
+SceneRoots:
+  m_ObjectHideFlags: 0
+  m_Roots:
+  - {fileID: 1969388817}
+  - {fileID: 1806680261}
+  - {fileID: 420786856}
+  - {fileID: 1784242772}
+  - {fileID: 1064799461}
+  - {fileID: 731190177}
+  - {fileID: 381049744}

+ 87 - 0
Materials/MediaPipe/FaceDetation/Scripts/FaceDetectorManager.cs

@@ -0,0 +1,87 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using ToneTuneToolkit.Common;
+
+using Mediapipe.Tasks.Core;
+using Mediapipe.Unity;
+using Mediapipe.Unity.Sample;
+using Mediapipe.Unity.Sample.FaceDetection;
+
+/// <summary>
+/// 面部检测工具管理器
+/// 延后初始化
+/// 
+/// 基本配置文件
+/// ..\MediaPipeUnity\Samples\Scenes\AppSettings.asset
+/// </summary>
+public class FaceDetectorManager : SingletonMaster<FaceDetectorManager>
+{
+  [SerializeField] private FaceDetectorRunner runner;
+
+  // ==================================================
+
+  private void Start() => Init();
+
+  // ==================================================
+
+  private void Init() => StartCoroutine(nameof(DelayInit));
+  private IEnumerator DelayInit()
+  {
+    yield return new WaitForSeconds(3f);
+    InitImageSource();
+    InitRunnerConfig();
+    runner.Play();
+  }
+
+  // ==================================================
+  #region 面部检测状态控制
+
+  /// <summary>
+  /// 开关暂停恢复检测
+  /// </summary>
+  /// <param name="value"></param>
+  public void SwitchFaceDetector(FaceDetectorState value)
+  {
+    switch (value)
+    {
+      default: break;
+      case FaceDetectorState.Play: runner.Play(); break;
+      case FaceDetectorState.Stop: runner.Stop(); break;
+      case FaceDetectorState.Pause: runner.Pause(); break;
+      case FaceDetectorState.Resume: runner.Resume(); break;
+    }
+  }
+
+  public enum FaceDetectorState
+  {
+    Play = 0, // 具备Reload功能
+    Stop = 1, Pause = 2, Resume = 3
+  }
+
+  #endregion
+  // ==================================================
+  #region 画面源、面部检测参数初始化
+
+  private void InitImageSource()
+  {
+    ImageSourceProvider.Switch(ImageSourceType.WebCamera);
+    ImageSource imageSource = ImageSourceProvider.ImageSource;
+    imageSource.SelectSource(0); // 0:BRIO 1:USBHD
+    imageSource.SelectResolution(7); // 1280x720 30fps
+    imageSource.isHorizontallyFlipped = false;
+  }
+
+  private void InitRunnerConfig()
+  {
+    runner.config.Delegate = BaseOptions.Delegate.CPU;
+    runner.config.ImageReadMode = ImageReadMode.CPUAsync;
+    runner.config.Model = ModelType.BlazeFaceShortRange;
+    runner.config.RunningMode = Mediapipe.Tasks.Vision.Core.RunningMode.LIVE_STREAM;
+    runner.config.MinDetectionConfidence = 0.4f; // 0.0 - 1.0 // 越高越不容易误检
+    runner.config.MinSuppressionThreshold = 0.3f; // 0.0 - 1.0
+    runner.config.NumFaces = 3; // 1-3
+  }
+
+  #endregion
+}

+ 18 - 0
Materials/MediaPipe/FaceDetation/Scripts/Tester.cs

@@ -0,0 +1,18 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class Tester : MonoBehaviour
+{
+  private void Update()
+  {
+    if (Input.GetKeyDown(KeyCode.Q))
+    {
+      FaceDetectorManager.Instance.SwitchFaceDetector(FaceDetectorManager.FaceDetectorState.Play);
+    }
+    if (Input.GetKeyDown(KeyCode.W))
+    {
+      FaceDetectorManager.Instance.SwitchFaceDetector(FaceDetectorManager.FaceDetectorState.Stop);
+    }
+  }
+}

+ 43 - 0
Materials/MediaPipe/FaceDetation/Scripts/ToneTuneToolkit/SingletonMaster.cs

@@ -0,0 +1,43 @@
+/// <summary>
+/// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
+/// Code Version 1.4.20
+/// </summary>
+
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace ToneTuneToolkit.Common
+{
+  /// <summary>
+  /// 单例大师基类
+  /// 你值得拥有
+  /// ScreenshotMaster : SingletonMaster<ScreenshotMaster>
+  /// private new void Awake()
+  /// </summary>
+  /// <typeparam name="T"></typeparam>
+  public class SingletonMaster<T> : MonoBehaviour where T : SingletonMaster<T>, new()
+  {
+    private static T _instance;
+    public static T Instance
+    {
+      get
+      {
+        _instance = FindObjectOfType<T>();
+        if (_instance == null)
+        {
+          _instance = new T();
+        }
+        return _instance;
+      }
+    }
+
+    private void Awake()
+    {
+      if (_instance == null)
+      {
+        _instance = this as T;
+      }
+    }
+  }
+}

二進制
Materials/ScrollView/屏幕截图 2025-06-13 111409.png


+ 111 - 0
Materials/TCP/TCPClient.cs

@@ -0,0 +1,111 @@
+using UnityEngine;
+using System.Net.Sockets;
+using System.Text;
+using ToneTuneToolkit.Common;
+
+/// <summary>
+/// TCP发图片和文本
+/// </summary>
+public class TCPClient : SingletonMaster<TCPClient>
+{
+  public string serverIP = "192.168.1.100"; // Windows服务器的IP地址
+  public int serverPort = 1006;
+
+  private TcpClient client;
+  private NetworkStream stream;
+
+  // ==================================================
+
+  private void Start() => Init();
+  private void OnDestroy() => UnInit();
+
+  // ==================================================
+
+  private void Init()
+  {
+    // Connect();
+  }
+
+  private void UnInit()
+  {
+    Disconnect();
+  }
+
+  // ==================================================
+
+  public void SetServerIP(string value) => serverIP = value;
+  public void SetServerPort(string value) => serverPort = int.Parse(value);
+
+  // ==================================================
+
+  // 连接到服务器
+  public void Connect()
+  {
+    try
+    {
+      client = new TcpClient();
+      client.Connect(serverIP, serverPort);
+      stream = client.GetStream();
+      Debug.Log("[TCP]Connected to server");
+    }
+    catch (System.Exception e)
+    {
+      Debug.LogError("[TCP]Connection error: " + e.Message);
+    }
+  }
+
+  // 断开连接
+  public void Disconnect()
+  {
+    if (stream != null) { stream.Close(); }
+    if (client != null) { client.Close(); }
+    Debug.Log("[TCP]Disconnected from server");
+  }
+
+
+
+  // 发送文本消息
+  public void SendText(string message)
+  {
+    if (client == null || !client.Connected) { return; }
+
+    try
+    {
+      byte[] textBytes = Encoding.UTF8.GetBytes(message);
+      byte[] lengthBytes = System.BitConverter.GetBytes(textBytes.Length);
+      byte[] dataType = new byte[] { 0 }; // 0 = text
+
+      stream.Write(lengthBytes, 0, 4);
+      stream.Write(dataType, 0, 1);
+      stream.Write(textBytes, 0, textBytes.Length);
+      Debug.Log("[TCP]Sent text: " + message);
+    }
+    catch (System.Exception e)
+    {
+      Debug.LogError("[TCP]Send text error: " + e.Message);
+    }
+  }
+
+  // 发送图片
+  public void SendImage(Texture2D texture)
+  {
+    if (client == null || !client.Connected) { Debug.LogWarning("Not connected to server"); return; }
+
+    try
+    {
+      byte[] imageBytes = texture.EncodeToPNG();
+      byte[] lengthBytes = System.BitConverter.GetBytes(imageBytes.Length);
+      byte[] dataType = new byte[] { 1 }; // 1 = image
+
+      stream.Write(lengthBytes, 0, 4);
+      stream.Write(dataType, 0, 1);
+      stream.Write(imageBytes, 0, imageBytes.Length);
+      Debug.Log("[TCP]Sent image with size: " + texture.width + "x" + texture.height);
+    }
+    catch (System.Exception e)
+    {
+      Debug.LogError("[TCP]Send image error: " + e.Message);
+      Disconnect();
+    }
+  }
+}

+ 117 - 0
Materials/TCP/TCPServer.cs

@@ -0,0 +1,117 @@
+using UnityEngine;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading;
+using ToneTuneToolkit.Common;
+
+public class TCPServer : SingletonMaster<TCPServer>
+{
+  private Thread serverThread;
+  private TcpListener tcpListener;
+  private bool isRunning = false;
+  public int port = 1006;
+
+  public delegate void TextReceivedHandler(string text);
+  public delegate void ImageReceivedHandler(byte[] imageData);
+  public event TextReceivedHandler OnTextReceived;
+  public event ImageReceivedHandler OnImageReceived;
+
+  // ==================================================
+
+  private void Start() => Init();
+  private void OnDestroy() => UnInit();
+
+  // ==================================================
+
+  private void Init()
+  {
+    StartServer();
+  }
+
+  private void UnInit()
+  {
+    StopServer();
+  }
+
+  // ==================================================
+
+  public void StartServer()
+  {
+    isRunning = true;
+    serverThread = new Thread(ServerThread);
+    serverThread.IsBackground = true;
+    serverThread.Start();
+    Debug.Log($"[TCP]Server started on port {port}");
+  }
+
+  public void StopServer()
+  {
+    isRunning = false;
+    tcpListener?.Stop();
+    serverThread?.Abort();
+    Debug.Log("[TCP]Server stopped");
+  }
+
+
+
+  private void ServerThread()
+  {
+    try
+    {
+      tcpListener = new TcpListener(IPAddress.Any, port);
+      tcpListener.Start();
+
+      while (isRunning)
+      {
+        using (TcpClient client = tcpListener.AcceptTcpClient())
+        using (NetworkStream stream = client.GetStream())
+        {
+          // 读取数据长度(4字节)
+          byte[] lengthBytes = new byte[4];
+          stream.Read(lengthBytes, 0, 4);
+          int dataLength = System.BitConverter.ToInt32(lengthBytes, 0);
+
+          // 读取数据类型(1字节)
+          byte[] typeBytes = new byte[1];
+          stream.Read(typeBytes, 0, 1);
+          byte dataType = typeBytes[0];
+
+          // 读取实际数据
+          byte[] data = new byte[dataLength];
+          int bytesRead = 0;
+          while (bytesRead < dataLength)
+          {
+            bytesRead += stream.Read(data, bytesRead, dataLength - bytesRead);
+          }
+
+          // 处理接收到的数据
+          if (dataType == 0) // 文本
+          {
+            string text = Encoding.UTF8.GetString(data);
+            Debug.Log($"[TCP]Received text: {text}");
+            UnityMainThreadDispatcher.Instance().Enqueue(() => OnTextReceived?.Invoke(text));
+          }
+          else if (dataType == 1) // 图片
+          {
+            // 只传递原始字节数据到主线程
+            byte[] imageData = (byte[])data.Clone();
+            UnityMainThreadDispatcher.Instance().Enqueue(() =>
+            {
+              // 在主线程中创建Texture2D
+              Texture2D texture = new Texture2D(2, 2);
+              texture.LoadImage(imageData);
+              OnImageReceived?.Invoke(imageData);
+            });
+            Debug.Log($"[TCP]Received image");
+          }
+        }
+      }
+    }
+    catch (SocketException e)
+    {
+      if (isRunning)
+        Debug.LogError($"[TCP]Server error: {e}");
+    }
+  }
+}

+ 50 - 0
Materials/TCP/UnityMainThreadDispatcher.cs

@@ -0,0 +1,50 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+public class UnityMainThreadDispatcher : MonoBehaviour
+{
+  private static UnityMainThreadDispatcher _instance;
+  private static readonly Queue<System.Action> _executionQueue = new Queue<System.Action>();
+
+  // 确保在Awake中初始化实例
+  void Awake()
+  {
+    if (_instance == null)
+    {
+      _instance = this;
+      DontDestroyOnLoad(gameObject);
+    }
+    else
+    {
+      Destroy(gameObject);
+    }
+  }
+
+  public static UnityMainThreadDispatcher Instance()
+  {
+    if (_instance == null)
+    {
+      Debug.LogError("UnityMainThreadDispatcher not found in scene. Please add it to a GameObject.");
+    }
+    return _instance;
+  }
+
+  public void Enqueue(System.Action action)
+  {
+    lock (_executionQueue)
+    {
+      _executionQueue.Enqueue(action);
+    }
+  }
+
+  void Update()
+  {
+    lock (_executionQueue)
+    {
+      while (_executionQueue.Count > 0)
+      {
+        _executionQueue.Dequeue().Invoke();
+      }
+    }
+  }
+}

+ 0 - 0
Materials/UI活动检测/ClickListener.cs → Materials/UI/ClickListener.cs


+ 187 - 139
ToneTuneToolkit/Assets/ToneTuneToolkit/README.md

@@ -1,72 +1,94 @@
 <font face="Source Han Sans TC" size=2 color=#FFFFFF>
 
 #### <center><font size=2>Make everything f<font color="#FF0000">or</font>king simple.</font></center>
-#### <center><font size=2>2025/04/18</font></center>
+#### <center><font size=2>2025/08/04</font></center>
 # <center><font color="#54FF9F" size=6>**Tone Tune Toolkit v1.5.1**</font></center>
-## ToneTuneToolkit是什么?
-一个致力于帮助Unity六边形战士减轻开发负担的项目。</br>
-<s>但更多的时候是在帮助互动工程师偷懒。</s></br>
-
-完成至少<strong>[1]</strong>个有些奇怪却十分好用的工具包:</br>
-(√) 显现存在于Unity/C#中却不为人知的野路子</br>
-(√) 添加需求简单但就是不想亲自编写的小功能</br>
-<s>(×) 解决古怪且迷惑的开发需求</s></br>
-
-<kbd>Ctrl</kbd> + <kbd>C</kbd></br>
-<kbd>Ctrl</kbd> + <kbd>V</kbd></br>
-<s>哈!逮到你了!</s></br>
-
-</br>
-
-# <center>*INTRODUCTION & LOG*</center>
-1. 请留意,“MirzkisD1Ex0”的“ToneTune Toolkit”基于**GPL3.0**(GNU General Public License v3.0)协议所开发。(对,就是那个传染性极强的协议。)
-2. 工具包存在“**Assets/ToneTuneToolkit**”文件夹及“**Assets/StreamingAssets/ToneTuneToolkit**”文件夹,两部分内容。
-3. 当某一模块中包含“**Handler**”助手类时,通常添加助手类至对象即可自动为其添加依赖。避免发生错误的组装。例如“**UDP**”模块以及“**Verification**”模块。
-4. 添加了思源黑体简中OTF格式全套。
-5. 2021/09/06 添加了两张简易场景地板贴图。
-6. 2021/09/06 添加了一些演示用场景。
-7. 2021/09/06 添加了三个可怕的工具,在“**Assets/StreamingAssets**”中。
-8. 2021/09/22 路径检查现在有更为醒目的提示。
-9. 2021/09/23 添加了“Funny”命名空间,里面会存一些然并卵的鬼代码,比如冒泡排序,甚至还有冒泡排序的浮点型重载。添加了UDP响应器。
-10. 2021/09/23 纠正了“PathChecker”中对文件夹路径检查的错误,更新了UDP和WOL非懒人方法的使用说明,移动了UDP消息接受体的位置。
-11. 2021/09/24 为“LedHandler”添加了一个工具函数,可以根据输入的[-1f~0f~1f]生成[黄色~白色~蓝色]的Color。
-12. 2021/10/11 添加了写入json的方法在“TextLoad”中。
-13. 2021/11/10 添加了“CameraSimpleMove”,一个经典的场景漫游脚本,可以通过WSDA空格和LeftShift控制相机移动,按住鼠标右键以移动视角。
-14. 2021/11/29 添加了AssetBundle包工具。
-15. 2022/01/22 添加了“CorrectLookAtCamera”,一个使物体永远正对相机的脚本,改进了LookAt。
-16. 2023/05/17 添加了“ObjectDragRotate”,拖动物体使其跟随鼠标旋转。
-17. 2023/07/20 工具包结构巨幅整理。
-18. 2023/07/21 添加了“FTPMaster”,从已架设FTP服务的服务器中下载文件,为“FileNameCapturer”添加了一种返回List的方法。
-19. 2023/09/07 添加了“ScreenshotMaster”,通过UIRectTransform获取截图范围并进行就截图的截图大师。
-20. 2023/10/10 添加了“UDPCommunicatorLite”,轻量版的UDP通讯工具,贼省事儿。
-21. 2023/10/26 于工程同级目录下“Materials”文件夹中添加了“KinectV2”相关工具。添加了“VideoMaster”,具有播放视频、播放视频第一帧、视频播放结束回调功能。
-22. 2023/11/06 UI模块下的截图工具与Media模块下的截图工具功能合并,新增全角度截图工具“FullAngleScreenshotTool”。
-23. 2023/12/04 新增“SHADERS”模块,新增了一个可以将UGUI去色的Shader,需要额外创建材质球,详见“Examples/022_UGUIGray”。
-24. 2023/12/28 分离“TextLoader”的json读写功能至“Data”分类下的“JsonManager”。
-25. 2024/06/03 添加了“TextureProcessor”,读/写/旋转/缩放Texture。
-26. 2024/06/18 添加了“LongTimeNoOperationDetector”,用于检测用户长时间无操作。
-27. 2024/07/18 添加了“UDPCommunicatorServer”,单端口非一次性play,用于作为server大量接收数据。
-28. 2024/10/11 更新了“ObjectDragRotate”,增加了旋转角度的限制,增加了一个角度校正的方法。
-29. 2024/12/18 添加了“RenameFolders”,一个用于在编辑器内批量化改变文件夹名的工具,直接更新选中的文件夹的文件夹名为新文件夹名或更新所有匹配原文件夹名的文件夹的文件夹名为新文件夹名,嗯。
-30. 2025/01/03 添加了“DataProcessor”,一个用于二级加工数据的工具,开新坑了,家人们。
-31. 2025/01/07 添加了“UpdateCopyrights”,一个用于批量添加版权信息的工具,在“Project”面板中选择“.cs”文件后可正常执行。
-32. 2025/01/10 添加了“ImageLoader”,用于运行时在弹窗内选择并加载图片,添加了第三方资源文件夹。
-33. 2025/01/13 添加了“JsonUploadManager”,用于上传json的工具。
-34. 2025/02/19 “QRCodeMaster”现在支持透明底二维码生成。
-35. 2025/03/27 “FileCapturer”被重制,拥有更高级的功能。
-36. 2025/04/18 “UI”类目下新增3个功能,滚动视图助手,序列帧图片播放助手,序列帧播放管理器。
-
-</br>
-
-# <center>*SCRIPTS*</center>
-### -> ToneTuneToolkit.Common/
+
+
+
+<font size=5><strong>ToneTuneToolkit是什么?</strong></font><br>
+一个致力于帮助Unity六边形战士减轻开发负担的项目。<br>
+<s>但更多的时候是在帮助互动工程师偷懒。</s><br>
+
+完成至少<strong>[1]</strong>个有些奇怪却十分好用的工具包:<br>
+(√) 显现存在于Unity/C#中却不为人知的野路子<br>
+(√) 添加需求简单但就是不想亲自编写的小功能<br>
+<s>(×) 解决古怪且迷惑的开发需求</s><br>
+
+<kbd>Ctrl</kbd> + <kbd>C</kbd><br>
+<kbd>Ctrl</kbd> + <kbd>V</kbd><br>
+<s>哈!逮到你了!</s><br>
+
+<font size=5><strong>Directory - 文档目录</strong></font><br>
+[INTRODUCTION  介绍](#INTRODUCTION)<br>
+[LOG       &ensp;日志](#LOG)<br>
+[SCRIPTS     &ensp;脚本](#SCRIPTS)<br>
+[EXTRA      &ensp;额外内容](#EXTRA)<br>
+[SHADERS     着色器](#SHADERS)<br>
+[TEXTURES    &ensp;贴图](#TEXTURES)<br>
+[FONTS      字体](#FONTS)<br>
+[DEMOS      示例](#DEMOS)<br>
+[STORAGE     仓库](#STORAGE)<br>
+[THIRDPARTY   &ensp;第三方](#THIRDPARTY)<br>
+[TUTORIALS    教程](#TUTORIALS)<br>
+[CONTACT     联系](#CONTACT)<br>
+
+
+
+## <center><a id="INTRODUCTION"></a>*INTRODUCTION*</center>
+- 请留意,“MirzkisD1Ex0”的“ToneTune Toolkit”基于**GPL3.0**(GNU General Public License v3.0)协议所开发。(对,就是那个传染性极强的协议。)
+- 工具包存在“**Assets/ToneTuneToolkit**”文件夹及“**Assets/StreamingAssets/ToneTuneToolkit**”文件夹,两部分内容。
+- 当某一模块中包含“**Handler**”助手类时,通常添加助手类至对象即可自动为其添加依赖。避免发生错误的组装。例如“**UDP**”模块以及“**Verification**”模块。
+- 添加了思源黑体简中OTF格式全套。
+
+
+
+## <center><a id="LOG"></a>*LOG*</center>
+0. 2021/09/06 添加了两张简易场景地板贴图。
+0. 2021/09/06 添加了一些演示用场景。
+0. 2021/09/06 添加了三个可怕的工具,在“**Assets/StreamingAssets**”中。
+0. 2021/09/22 路径检查现在有更为醒目的提示。
+0. 2021/09/23 添加了“Funny”命名空间,里面会存一些然并卵的鬼代码,比如冒泡排序,甚至还有冒泡排序的浮点型重载。添加了UDP响应器。
+0. 2021/09/23 纠正了“PathChecker”中对文件夹路径检查的错误,更新了UDP和WOL非懒人方法的使用说明,移动了UDP消息接受体的位置。
+0. 2021/09/24 为“LedHandler”添加了一个工具函数,可以根据输入的[-1f~0f~1f]生成[黄色~白色~蓝色]的Color。
+0. 2021/10/11 添加了写入json的方法在“TextLoad”中。
+0. 2021/11/10 添加了“CameraSimpleMove”,一个经典的场景漫游脚本,可以通过WSDA空格和LeftShift控制相机移动,按住鼠标右键以移动视角。
+0. 2021/11/29 添加了AssetBundle包工具。
+0. 2022/01/22 添加了“CorrectLookAtCamera”,一个使物体永远正对相机的脚本,改进了LookAt。
+0. 2023/05/17 添加了“ObjectDragRotate”,拖动物体使其跟随鼠标旋转。
+0. 2023/07/20 工具包结构巨幅整理。
+0. 2023/07/21 添加了“FTPMaster”,从已架设FTP服务的服务器中下载文件,为“FileNameCapturer”添加了一种返回List的方法。
+0. 2023/09/07 添加了“ScreenshotMaster”,通过UIRectTransform获取截图范围并进行就截图的截图大师。
+0. 2023/10/10 添加了“UDPCommunicatorLite”,轻量版的UDP通讯工具,贼省事儿。
+0. 2023/10/26 于工程同级目录下“Materials”文件夹中添加了“KinectV2”相关工具。添加了“VideoMaster”,具有播放视频、播放视频第一帧、视频播放结束回调功能。
+0. 2023/11/06 UI模块下的截图工具与Media模块下的截图工具功能合并,新增全角度截图工具“FullAngleScreenshotTool”。
+0. 2023/12/04 新增“SHADERS”模块,新增了一个可以将UGUI去色的Shader,需要额外创建材质球,详见“Examples/022_UGUIGray”。
+0. 2023/12/28 分离“TextLoader”的json读写功能至“Data”分类下的“JsonManager”。
+0. 2024/06/03 添加了“TextureProcessor”,读/写/旋转/缩放Texture。
+0. 2024/06/18 添加了“LongTimeNoOperationDetector”,用于检测用户长时间无操作。
+0. 2024/07/18 添加了“UDPCommunicatorServer”,单端口非一次性play,用于作为server大量接收数据。
+0. 2024/10/11 更新了“ObjectDragRotate”,增加了旋转角度的限制,增加了一个角度校正的方法。
+0. 2024/12/18 添加了“RenameFolders”,一个用于在编辑器内批量化改变文件夹名的工具,直接更新选中的文件夹的文件夹名为新文件夹名或更新所有匹配原文件夹名的文件夹的文件夹名为新文件夹名,嗯。
+0. 2025/01/03 添加了“DataProcessor”,一个用于二级加工数据的工具,开新坑了,家人们。
+0. 2025/01/07 添加了“UpdateCopyrights”,一个用于批量添加版权信息的工具,在“Project”面板中选择“.cs”文件后可正常执行。
+0. 2025/01/10 添加了“ImageLoader”,用于运行时在弹窗内选择并加载图片,添加了第三方资源文件夹。
+0. 2025/01/13 添加了“JsonUploadManager”,用于上传json的工具。
+0. 2025/02/19 “QRCodeMaster”现在支持透明底二维码生成。
+0. 2025/03/27 “FileCapturer”被重制,拥有更高级的功能。
+0. 2025/04/18 “UI”类目下新增3个功能,滚动视图助手,序列帧图片播放助手,序列帧播放管理器。
+0. 2025/08/04 “IO”类目下,新增“NewFileAlerter”,用于“定期检查指定文件夹下是否出现新文件并返回该文件路径”。
+
+
+
+## <center><a id="SCRIPTS"></a><font color="#FF0000">*SCRIPTS*</font></center>
+### ToneTuneToolkit.Common/
 * EventListener.cs      // 数值监听器 // 提供了一个泛型事件
 * PathChecker.cs        // 静态 // 文件/文件夹检查 // 如果不存在则创建空的
 * SingletonMaster.cs    // 单例大师
 * ToolkitManager.cs     // 管理类 // 存放路径 // 多数功能的依赖
 * TTTDebug.cs           // 静态 // TTT工具箱专属Debug.Log
 
-### -> ToneTuneToolkit.Data/
+### ToneTuneToolkit.Data/
 * DataConverter.cs      // 静态 // 数据转换 // 字符串与二进制之间转换 // 字符串与json之间转换
 * DataProcessor.cs      // 数据处理
 * ImageLoader.cs        // 图片选择和加载
@@ -76,36 +98,37 @@
 * TextLoader.cs         // 静态 // 文字加载 // 可以读取txt及json
 * TimestampCapturer.cs  // 静态 // 获取时间戳 // 本地获取静态方法 // 网络获取需单例
 
-### -> ToneTuneToolkit.Editor/
+### ToneTuneToolkit.Editor/
 * CreateAssetBundles.cs // AB包创建工具
 * RenameFolders.cs      // 批量化重命名文件夹工具
 * UpdateCopyrights.cs   // 更新版权工具
 
-### -> ToneTuneToolkit.Funny/
+### ToneTuneToolkit.Funny/
 * BubbleSort.cs         // 静态 // 冒泡排序
 
-### -> ToneTuneToolkit.IO/
+### ToneTuneToolkit.IO/
 * FileCapturer.cs       // 静态 // 获取特定文件夹下特定格式的文件名
 * FTPMaster.cs          // FTP文件下载(暂无上传)器
+* NewFileAlerter.cs     // 检测指定文件夹下是否有新文件传入
 
-### -> ToneTuneToolkit.Media/
+### ToneTuneToolkit.Media/
 * ScreenshotMaster.cs         // 透明通道截图工具
 * FullAngleScreenshotTool.cs  // 全角度截图工具
 * TextureProcessor.cs         // 图片处理工具
 
-### -> ToneTuneToolkit.Mobile/
+### ToneTuneToolkit.Mobile/
 * ObjectRotateAndScale.cs   // 物体Android平台中的单指旋转及双指缩放
 
-### -> ToneTuneToolkit.MultimediaExhibitionHall.LED/
+### ToneTuneToolkit.MultimediaExhibitionHall.LED/
 * LEDCommandCenter.cs   // LED命令中心
 * LEDCommandHub.cs      // 灯盒指令集
 * LEDHandler.cs         // LED助手
 * LEDNuclearShow.cs     // 灯带压力测试 // DEBUG
 
-### -> ToneTuneToolkit.Networking/
+### ToneTuneToolkit.Networking/
 * JsonUploadManager.cs // Json上传
 
-### -> ToneTuneToolkit.Object/
+### ToneTuneToolkit.Object/
 * CorrectLookAtCamera.cs        // 使物体正对相机
 * NeonLight.cs                  // 随机霓虹灯
 * ObjectDragMove.cs             // 物体拖动移动
@@ -114,178 +137,203 @@
 * ObjectSearcher.cs             // 多种方式寻找目标
 * TraverseObejctChangeColor.cs  // 改变对象及所有子对象的颜色
 
-### -> ToneTuneToolkit.Other/
+### ToneTuneToolkit.Other/
 * AsyncLoadingWithProcessBar.cs // 加载场景进度条
 * CMDLauncher.cs                // CMD命令行
 * KeyPressSimulator.cs          // 物理键盘按键模拟
 * QRCodeMaster.cs               // 二维码加载器
 * LongTimeNoOperationDetector.cs        // 长时间无操作检测
 
-### -> ToneTuneToolkit.UDP/
+### ToneTuneToolkit.UDP/
 * UDPCommunicator.cs        // UDP通讯器 // 已残
 * UDPCommunicatorLite.cs    // UDP通讯器客户端轻量版
 * UDPCommunicatorServer.cs  // UDP通讯器服务端
 * UDPHandler.cs             // UDP助手
 * UDPResponder.cs           // UDP响应器
 
-### -> ToneTuneToolkit.UI/
+### ToneTuneToolkit.UI/
 * Parallax.cs         // 多层次视差
 * ScrollViewHandler.cs  // 滚动视图定位元素
 * TextFlick.cs        // 文字通过透明度闪烁
 * UICurved.cs         // UI弯曲
 
-### -> ToneTuneToolkit.Verification/
+### ToneTuneToolkit.Verification/
 * AntiVerifier.cs     // 反向验证器 // 二进制
 * Verifier.cs         // 验证器
 * VerifierHandler.cs  // 验证系统助手
 
-### -> ToneTuneToolkit.Video/
+### ToneTuneToolkit.Video/
 * VideoMaster.cs      // 视频大师
 
-### -> ToneTuneToolkit.View/
+### ToneTuneToolkit.View/
 * CameraFocusObject.cs  // 鼠标拖动控制相机环绕注视对象
 * CameraLookAround.cs   // 鼠标拖动控制相机环视 // 可用于全景
 * CameraSimpleMove.cs   // 经典场景漫游
 * CameraZoom.cs         // 相机POV多层级缩放 // 开镜?
 
-### -> ToneTuneToolkit.WOL/
+### ToneTuneToolkit.WOL/
 * WakeOnLan.cs          // 局域网唤醒器
 * WakeOnLanHandler.cs   // 局域网唤醒助手
 
-</br>
 
-# <center>*Extra*</center>
+
+## <center><a id="EXTRA"></a>*EXTRA*</center>
 下列文件/功能位于与工程同级的“Materials”文件夹下
-### -> 3D/
+### 2D/
+* // Tile贴图与尺寸保持1:1的设置方式
+
+### 3D/
 * // 创建一个物理引力点
 
-### -> AzureKinect/
+### Alpha Video Mask/
+* // 透明视频遮罩
+
+### AzureKinect/
 * AzureKinectDriver.cs // AzureKinect驱动模块
 
-### -> Backend & Upload/
+### Backend & Upload/
 * // 后端上传模块
 
-### -> CamFi2/
+### CamFi2/
 * // CamFi2驱动模块
 
-### -> KeyboardMapping/
+### DG/Tools
+* CanvasGroupMaster.cs // 透明度管理
+* UIStageManager.cs // UI转阶段管理
+
+### Game/
+### IOS对策/
+### Keyboard/
+
+### KeyboardMapping/
 * // 键盘错位映射模块
 
-### -> KinectV2/
-* // KinectV2Driver.cs // KinectV2驱动模块
+### KinectV2/
+* KinectV2Driver.cs // KinectV2驱动模块
+
+### LeapMotion/
+* LeapMotionManager.cs // LP管理模块
 
-### -> MQTT/
+### MediaPipe/
+
+### MQTT/
 * // MQTT驱动模块
 
-### -> OpenCV/
+### OpenCV/
 * // 面部识别模块
 
-### -> OSC/
+### OSC/
 * // 收发模块
 
-### -> RemoveBG & BaiduBodySegment/
+### RemoveBG & BaiduBodySegment/
 * // 人像分割模块
 
-### -> RemoveTrial/
+### RemoveTrial/
 * // 移除试用版标记
 
-### -> ScrollView/
+### ScrollView/
 * ScrollViewHandler.cs // 滚动视图驱动模块
 
-### -> SequenceFrame/
-* // 序列帧播放控制模块
+### SerialPortUtilityPro/
+* // 串口收发模块
 
-### -> SerialPortUtilityPro/
-* // 收发模块
+### SocketIO/
+* SocketIOManager.cs // SocketIO通讯模块
 
-### -> SkipLogo/
+### TCP/
+* // TCP传图传文字模块
+
+### SkipLogo/
 * // 跳过开屏Logo功能
 
-### -> WebGL/
+### UI/
+* ClickListener.cs // UI交互检测
+
+### WebGL/
 * // 背景透明化功能
 
-### -> 后置相机拍摄/
-* // 拍摄功能
+### 打包后分辨率设置/
+### 后置相机拍摄/
+### 扫码枪/
+### 图片选择和加载/
 
-</br>
 
-# <center>*SHADERS*</center>
-### -> UGUI转灰色
 
+## <center><a id="SHADERS"></a>*SHADERS*</center>
+### UGUI转灰色
 * GreyscaleShader(Sprites/GreyscaleShader)
 
-</br>
 
-# <center>*TEXTURES*</center>
-### -> 512x512地板贴图
+
+## <center><a id="TEXTURES"></a>*TEXTURES*</center>
+### 512x512地板贴图
 * grayfloor
 * royalbluefloor
 
-</br>
-
-# <center>*FONTS (Removed)*</center>
-### // -> 思源黑体简体中文
-* // SourceHanSansSC-Bold
-* // SourceHanSansSC-ExtraLight
-* // SourceHanSansSC-Heavy
-* // SourceHanSansSC-Light
-* // SourceHanSansSC-Medium
-* // SourceHanSansSC-Normal
-* // SourceHanSansSC-Regular
-* 因体积原因已从插件中移除
+
+
+## <center><a id="FONTS"></a>*FONTS*</center>
+### // 思源黑体简体中文
+* SourceHanSansSC-Bold
+* SourceHanSansSC-ExtraLight
+* SourceHanSansSC-Heavy
+* SourceHanSansSC-Light
+* SourceHanSansSC-Medium
+* SourceHanSansSC-Normal
+* SourceHanSansSC-Regular
 * 已移至ToneTuneToolkit工程目录“<strong>Assets/Fonts</strong>”中
 
-</br>
 
-# <center>*DEMOS*</center>
-### -> 演示场景
+
+## <center><a id="DEMOS"></a>*DEMOS*</center>
+### 演示场景
 * LED Sample      // LED灯控示例
 * Panorama Sample // 全景示例
 * Parallax Sample // 视差示例
 * WOL Sample      // 局域网唤醒示例
 * ……
 
-</br>
 
-# <center>*WAREHOUSE*</center>
-### -> 用于储存仅在Demo中出现且与核心功能无关的资源
+
+## <center><a id="STORAGE"></a>*STORAGE*</center>
+### 用于储存仅在Demo中出现且与核心功能无关的资源
 * Materials
 * Textures
 
-</br>
 
-# <center>*THIRDPARTY*</center>
-### -> 第三方脚本或资源
+
+## <center><a id="THIRDPARTY"></a>*THIRDPARTY*</center>
+### 第三方脚本或资源
 * StandaloneFileBrowser // 运行时弹出窗口
 
 
-</br>
 
-# <center>*EXAMPLES*</center>
-### -> 一些教程
+
+## <center><a id="TUTORIALS"></a>*TUTORIALS*</center>
+### 一些教程
 * 该功能依赖ToneTuneToolkit
-* 场景文件、教程辅助用脚本文件位于ToneTuneToolkit工程目录“<strong>Assets/Examples/</strong>”中
+* 场景文件、教程辅助用脚本文件位于ToneTuneToolkit工程目录“<strong>Assets/Tutorials/</strong>”中
 * 博客内容保存在位于ToneTuneToolkit工程目录“<strong>Assets/PDFs</strong>”中
 
-</br>
 
-# <center>*CONTACT*</center>
-### -> Developer
-* **[团队代言人博客]** *随缘更新</br>
+
+## <center><a id="CONTACT"></a>*CONTACT*</center>
+### Developer
+* **[团队代言人博客]** *随缘更新<br>
   **[https://www.cnblogs.com/mirzkisd1ex0/](https://www.cnblogs.com/mirzkisd1ex0/ "记得常来光顾")**
-  </br>
+  <br>
 
-* **[开发者邮箱]**</br>
+* **[开发者邮箱]**<br>
   **[mirzkisd1ex0@outlook.com](https://outlook.live.com/ "欢迎来信联系")**
-  </br>
+  <br>
 
-* **[开发者微信]**</br>
+* **[开发者微信]**<br>
   **[qq1005410781](https://weixin.qq.com/ "来啊交流啊")**
-  </br>
+  <br>
 
-* **[开发者企鹅]**</br>
+* **[开发者企鹅]**<br>
   **[1005410781](https://im.qq.com/ "来啊交流啊")**
-  </br>
+  <br>
 
 ![MirzkisD1Ex0](Materials/profile.jpg)
 

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Common/EventListener.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 namespace ToneTuneToolkit.Common
 {
   /// <summary>

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Common/PathChecker.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.IO;
 using UnityEngine;
 

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Common/SingletonMaster.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Common/TTTDebug.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 
 namespace ToneTuneToolkit.Common

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Common/ToolkitManager.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 
 namespace ToneTuneToolkit.Common

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Data/DataConverter.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System;
 using System.Text;
 using System.Text.RegularExpressions;

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Data/DataProcessor.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 using System.Text.RegularExpressions;
 using System.Collections.Generic;

+ 7 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Data/ImageLoader.cs

@@ -1,3 +1,9 @@
+/// <summary>
+/// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
+/// Code Version 1.5.1
+/// </summary>
+
+
 using UnityEngine;
 using NativeFileBrowser;
 using System.Collections.Generic;
@@ -54,4 +60,4 @@ namespace ToneTuneToolkit.Data
       return texture2D;
     }
   }
-}
+}

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Data/JsonManager.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Data/LitJsonManager.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;

+ 4 - 2
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Data/SensitiveWordUtility.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.Collections;
 using System.Collections.Generic;
 using System.Text;
@@ -188,4 +190,4 @@ namespace ToneTuneToolkit.Data
       return !((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) && (ic < 0x2E80 || ic > 0x9FFF);
     }
   }
-}
+}

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Data/TextLoader.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.IO;
 using System.Text;
 using UnityEngine;

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Data/TimestampCapturer.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.Collections;
 using UnityEngine;
 using Newtonsoft.Json.Linq;

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Editor/CreateAssetBundles.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEditor;
 using System.IO;
 

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Editor/EditorStorage.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 namespace ToneTuneToolkit.Editor
 {
   public class EditorStorage

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Editor/RenameFolders.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.IO;
 using UnityEditor;
 using UnityEngine;

+ 5 - 3
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Editor/UpdateCopyrights.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
@@ -16,7 +18,7 @@ namespace ToneTuneToolkit.Editor
   {
     private string author = "MirzkisD1Ex0";
     private string year = "2025";
-    private string codeVersion = "1.4.20";
+    private string codeVersion = "1.5.0";
 
     private string displayString = "";
     private Vector2 displayStringScrollPosition = Vector2.zero;
@@ -62,7 +64,7 @@ namespace ToneTuneToolkit.Editor
 
       GUILayout.Space(EditorStorage.GUI.Space);
 
-      if (GUILayout.Button("Add Copyright Info to Above File(s)"))
+      if (GUILayout.Button("Add or Update Copyright Info to Above File(s)"))
       {
         ChangeContent();
       }

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Funny/BubbleSort.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 namespace ToneTuneToolkit.Funny
 {
   /// <summary>

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/IO/FTPMaster.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 using System.Net;
 using System.IO;

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/IO/FileCapturer.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;

+ 78 - 0
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/IO/NewFileAlerter.cs

@@ -0,0 +1,78 @@
+/// <summary>
+/// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
+/// Code Version 1.5.1
+/// </summary>
+
+
+
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using System;
+using System.IO;
+using UnityEngine.Events;
+
+/// <summary>
+/// 文件轮询查找功能
+/// 你是不是在xxx文件夹下又塞了一个模型?
+/// ↓参考组率先获取所有文件名
+/// ↓对照组循环获取文件名
+/// ↓对比数量
+/// ↓将对照组多出来的末位文件名传出
+/// </summary>
+namespace ToneTuneToolkit.IO
+{
+  public class NewFileAlerter : MonoBehaviour
+  {
+    public static UnityAction<string> OnNewFileDetected;
+
+    private const float detectSpaceTime = 10f; // 间隔多久轮询一次文件数量
+    private const string folderPath = @"C:/SandTableMesh/"; // 路径
+    private const string fileSuffix = ".obj"; // 文件后缀名
+
+    [SerializeField] private List<string> LastFileList; // 参考组
+    [SerializeField] private List<string> NewFileList; // 对照组
+
+    // ==============================
+
+    private void Start() => Init();
+    private void OnDestroy() => UnInit();
+
+    // ==============================
+
+    private void Init()
+    {
+      LastFileList = FileCapturer.GetFileNames2List(folderPath, fileSuffix);
+      StartCoroutine(nameof(FileDetectCircle));
+    }
+
+    private void UnInit()
+    {
+      StopCoroutine(nameof(FileDetectCircle));
+    }
+
+    // ==============================
+
+    /// <summary>
+    /// 文件数量检测循环
+    /// </summary>
+    /// <returns></returns>
+    private IEnumerator FileDetectCircle()
+    {
+      while (true)
+      {
+        NewFileList = FileCapturer.GetFileNames2List(folderPath, fileSuffix);
+
+        if (NewFileList.Count > LastFileList.Count) // 对比数量判断是否有新文件传入
+        {
+          string meshPath = Path.Combine(folderPath, NewFileList[NewFileList.Count - 1]);
+          Debug.Log("<color=green>[STEP01]</color> New .obj detected : <" + meshPath + ">.");
+          OnNewFileDetected?.Invoke(meshPath);
+          LastFileList = new List<string>(NewFileList);
+        }
+
+        yield return new WaitForSeconds(detectSpaceTime);
+      }
+    }
+  }
+}

+ 11 - 0
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/IO/NewFileAlerter.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 7608d8aa09456464d80c95c1ee7fcec9
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Media/FullAngleScreenshotTool.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.Collections;
 using UnityEngine;
 using System.IO;

+ 4 - 2
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Media/ScreenshotMaster.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
@@ -189,4 +191,4 @@ namespace ToneTuneToolkit.Media
 
     #endregion
   }
-}
+}

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Media/TextureProcessor.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.Collections;
 using System.Collections.Generic;
 using System.IO;

+ 4 - 2
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Media/WebCamHandler.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.Collections;
 using System.Collections.Generic;
 using ToneTuneToolkit.Common;
@@ -105,4 +107,4 @@ public class WebCamHandler : SingletonMaster<WebCamHandler>
     }
     return;
   }
-}
+}

+ 4 - 2
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Media/WebCamManager.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.Collections;
 using System.Collections.Generic;
 using ToneTuneToolkit.Common;
@@ -178,4 +180,4 @@ public class WebCamManager : SingletonMaster<WebCamManager>
     }
     return;
   }
-}
+}

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Mobile/ObjectRotateAndScale.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 
 namespace ToneTuneToolkit.Mobile

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/MultimediaExhibitionHall/LED/LEDCommandCenter.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 using UnityEngine.UI;
 using ToneTuneToolkit.UDP;

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/MultimediaExhibitionHall/LED/LEDCommandHub.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 namespace ToneTuneToolkit.LED
 {
   /// <summary>

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/MultimediaExhibitionHall/LED/LEDHandler.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 
 namespace ToneTuneToolkit.LED

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/MultimediaExhibitionHall/LED/LEDNuclearShow.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 using UnityEngine.UI;
 

+ 7 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Networking/JsonUploadManager.cs

@@ -1,3 +1,9 @@
+/// <summary>
+/// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
+/// Code Version 1.5.1
+/// </summary>
+
+
 using System;
 using System.Collections;
 using System.Collections.Generic;
@@ -94,4 +100,4 @@ namespace ToneTuneToolkit.Networking
       yield break;
     }
   }
-}
+}

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Object/CorrectLookAtCamera.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 
 namespace ToneTuneToolkit.Object

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Object/NeonLight.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 using ToneTuneToolkit.Common;
 

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Object/ObjectDragMove.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.Collections;
 using UnityEngine;
 using ToneTuneToolkit.Common;

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Object/ObjectDragRotate.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 
 namespace ToneTuneToolkit.Object

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Object/ObjectFloating.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 
 namespace ToneTuneToolkit.Object

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Object/ObjectSearcher.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 
 namespace ToneTuneToolkit.Object

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Object/TraverseObejctChangeColor.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 using UnityEngine.UI;
 

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Other/AsyncLoadingWithProcessBar.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 using System.Collections;
 using UnityEngine.UI;

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Other/CMDLauncher.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 using System.Diagnostics;
 

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Other/KeyPressSimulator.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.Runtime.InteropServices;
 using UnityEngine;
 

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Other/LongTimeNoOperationDetector.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.Collections;
 using UnityEngine;
 using UnityEngine.Events;

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Other/QRCodeMaster.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.Collections;
 using ToneTuneToolkit.Common;
 using UnityEngine;

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/UDP/UDPCommunicator.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.Net;
 using System.Net.Sockets;
 using System.Text;

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/UDP/UDPCommunicatorLite.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.Text;
 using System.Net;
 using System.Net.Sockets;

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/UDP/UDPCommunicatorServer.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.IO;
 using System.Collections.Generic;
 using System.Net;

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/UDP/UDPHandler.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 using ToneTuneToolkit.Common;
 

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/UDP/UDPResponder.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 
 namespace ToneTuneToolkit.UDP

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/UI/Parallax.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 using ToneTuneToolkit.Common;
 

+ 29 - 8
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/UI/ScrollViewHandler.cs

@@ -1,3 +1,9 @@
+/// <summary>
+/// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
+/// Code Version 1.5.1
+/// </summary>
+
+
 using System;
 using System.Collections;
 using System.Collections.Generic;
@@ -44,6 +50,7 @@ namespace ToneTuneToolkit.UI
     {
       sv = GetComponent<ScrollRect>();
       cg = GetComponent<CanvasGroup>();
+      sv.onValueChanged.AddListener(GetVector2Location);
 
       cellDistance = 1 / ((float)sv.content.childCount - 1);
       anchorPositions = new float[sv.content.childCount];
@@ -79,7 +86,7 @@ namespace ToneTuneToolkit.UI
     /// 添加到OnValueChanged中
     /// </summary>
     /// <param name="value"></param>
-    public void GetVector2Location(Vector2 value)
+    private void GetVector2Location(Vector2 value)
     {
       scrollviewLocation = value;
       // Debug.Log(scrollviewLocation.x);
@@ -142,10 +149,7 @@ namespace ToneTuneToolkit.UI
           if (currentIndex != newIndex) // 有变化
           {
             currentIndex = newIndex;
-            if (OnScrollViewStopped != null)
-            {
-              OnScrollViewStopped(newIndex);
-            }
+            OnScrollViewStopped?.Invoke(newIndex);
           }
         });
       return;
@@ -154,14 +158,14 @@ namespace ToneTuneToolkit.UI
     /// <summary>
     /// 滚动到横向指定位置
     /// </summary>
-    public void Scroll2HorizontalPosition(float normalizedPosition)
+    public void Scroll2HorizontalPosition(float normalizedPosition, float animTime = ANIMTIME)
     {
       if (cgBlocker)
       {
         cgBlocker.blocksRaycasts = true;
       }
 
-      sv.DOHorizontalNormalizedPos(normalizedPosition, ANIMTIME).OnComplete(() =>
+      sv.DOHorizontalNormalizedPos(normalizedPosition, animTime).SetEase(Ease.Linear).OnComplete(() =>
       {
         // AdjustView(); // 视图矫正
         if (cgBlocker)
@@ -171,5 +175,22 @@ namespace ToneTuneToolkit.UI
       });
       return;
     }
+
+    /// <summary>
+    /// 强制移动到横向位置
+    /// </summary>
+    /// <param name="normalizedPosition"></param>
+    public void Force2HorizontalPosition(float normalizedPosition)
+    {
+      if (cgBlocker)
+      {
+        cgBlocker.blocksRaycasts = true;
+      }
+      sv.horizontalNormalizedPosition = normalizedPosition;
+      if (cgBlocker)
+      {
+        cgBlocker.blocksRaycasts = false;
+      }
+    }
   }
-}
+}

+ 7 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/UI/SequenceFrameHandler.cs

@@ -1,3 +1,9 @@
+/// <summary>
+/// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
+/// Code Version 1.5.1
+/// </summary>
+
+
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
@@ -90,4 +96,4 @@ public class SequenceFrameHandler : MonoBehaviour
     }
     // }
   }
-}
+}

+ 7 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/UI/SequenceFrameManager.cs

@@ -1,3 +1,9 @@
+/// <summary>
+/// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
+/// Code Version 1.5.1
+/// </summary>
+
+
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
@@ -35,4 +41,4 @@ public class SequenceFrameManager : MonoBehaviour
     sequenceFrames[index].GetComponent<SequenceFrameHandler>().Stop();
     return;
   }
-}
+}

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/UI/TextFlick.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 using UnityEngine.UI;
 

+ 4 - 2
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/UI/UICurved.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.Collections.Generic;
 
 namespace UnityEngine.UI.Extensions
@@ -103,4 +105,4 @@ namespace UnityEngine.UI.Extensions
       return;
     }
   }
-}
+}

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Verification/AntiVerifier.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 using System.Net.NetworkInformation;
 using System;

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Verification/Verifier.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 using System.Collections;
 using System;

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Verification/VerifierHandler.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 using ToneTuneToolkit.Common;
 

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/Video/VideoMaster.cs

@@ -1,7 +1,9 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
+
+
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/View/CameraFocusObject.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 using ToneTuneToolkit.Common;
 

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/View/CameraLookAround.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 using ToneTuneToolkit.Common;
 

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/View/CameraSimpleMove.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/View/CameraZoom.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 using ToneTuneToolkit.Common;
 

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/WakeOnLan/WakeOnLan.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 using System.Diagnostics;
 using System.Text;

+ 3 - 1
ToneTuneToolkit/Assets/ToneTuneToolkit/Scripts/WakeOnLan/WakeOnLanHandler.cs

@@ -1,8 +1,10 @@
 /// <summary>
 /// Copyright (c) 2025 MirzkisD1Ex0 All rights reserved.
-/// Code Version 1.4.20
+/// Code Version 1.5.1
 /// </summary>
 
+
+
 using UnityEngine;
 using ToneTuneToolkit.Common;
 

+ 0 - 0
ToneTuneToolkit/Assets/ToneTuneToolkit/Warehouse.meta → ToneTuneToolkit/Assets/ToneTuneToolkit/Storage.meta


+ 0 - 0
ToneTuneToolkit/Assets/ToneTuneToolkit/Warehouse/Materials.meta → ToneTuneToolkit/Assets/ToneTuneToolkit/Storage/Materials.meta


+ 0 - 0
ToneTuneToolkit/Assets/ToneTuneToolkit/Warehouse/Materials/panoramamaterials.mat → ToneTuneToolkit/Assets/ToneTuneToolkit/Storage/Materials/panoramamaterials.mat


+ 0 - 0
ToneTuneToolkit/Assets/ToneTuneToolkit/Warehouse/Materials/panoramamaterials.mat.meta → ToneTuneToolkit/Assets/ToneTuneToolkit/Storage/Materials/panoramamaterials.mat.meta


+ 0 - 0
ToneTuneToolkit/Assets/ToneTuneToolkit/Warehouse/Textures.meta → ToneTuneToolkit/Assets/ToneTuneToolkit/Storage/Textures.meta


+ 0 - 0
ToneTuneToolkit/Assets/ToneTuneToolkit/Warehouse/Textures/panoramajpg.jpg → ToneTuneToolkit/Assets/ToneTuneToolkit/Storage/Textures/panoramajpg.jpg


+ 0 - 0
ToneTuneToolkit/Assets/ToneTuneToolkit/Warehouse/Textures/panoramajpg.jpg.meta → ToneTuneToolkit/Assets/ToneTuneToolkit/Storage/Textures/panoramajpg.jpg.meta


+ 0 - 0
ToneTuneToolkit/Assets/Examples.meta → ToneTuneToolkit/Assets/Tutorial.meta


+ 0 - 0
ToneTuneToolkit/Assets/Examples/001_FileNameCapturer.meta → ToneTuneToolkit/Assets/Tutorial/001_FileNameCapturer.meta


+ 0 - 0
ToneTuneToolkit/Assets/Examples/001_FileNameCapturer/Scenes.meta → ToneTuneToolkit/Assets/Tutorial/001_FileNameCapturer/Scenes.meta


+ 0 - 0
ToneTuneToolkit/Assets/Examples/001_FileNameCapturer/Scenes/Example.unity → ToneTuneToolkit/Assets/Tutorial/001_FileNameCapturer/Scenes/Example.unity


+ 0 - 0
ToneTuneToolkit/Assets/Examples/001_FileNameCapturer/Scenes/Example.unity.meta → ToneTuneToolkit/Assets/Tutorial/001_FileNameCapturer/Scenes/Example.unity.meta


+ 0 - 0
ToneTuneToolkit/Assets/Examples/001_FileNameCapturer/Scripts.meta → ToneTuneToolkit/Assets/Tutorial/001_FileNameCapturer/Scripts.meta


+ 0 - 0
ToneTuneToolkit/Assets/Examples/001_FileNameCapturer/Scripts/FNC.cs → ToneTuneToolkit/Assets/Tutorial/001_FileNameCapturer/Scripts/FNC.cs


+ 0 - 0
ToneTuneToolkit/Assets/Examples/001_FileNameCapturer/Scripts/FNC.cs.meta → ToneTuneToolkit/Assets/Tutorial/001_FileNameCapturer/Scripts/FNC.cs.meta


+ 0 - 0
ToneTuneToolkit/Assets/Examples/002_TimestampCapturer.meta → ToneTuneToolkit/Assets/Tutorial/002_TimestampCapturer.meta


+ 0 - 0
ToneTuneToolkit/Assets/Examples/002_TimestampCapturer/Scenes.meta → ToneTuneToolkit/Assets/Tutorial/002_TimestampCapturer/Scenes.meta


+ 0 - 0
ToneTuneToolkit/Assets/Examples/002_TimestampCapturer/Scenes/Example.unity → ToneTuneToolkit/Assets/Tutorial/002_TimestampCapturer/Scenes/Example.unity


+ 0 - 0
ToneTuneToolkit/Assets/Examples/002_TimestampCapturer/Scenes/Example.unity.meta → ToneTuneToolkit/Assets/Tutorial/002_TimestampCapturer/Scenes/Example.unity.meta


+ 0 - 0
ToneTuneToolkit/Assets/Examples/002_TimestampCapturer/Scripts.meta → ToneTuneToolkit/Assets/Tutorial/002_TimestampCapturer/Scripts.meta


部分文件因文件數量過多而無法顯示