271 lines
7.7 KiB
Markdown
271 lines
7.7 KiB
Markdown
#unity/代码缓存
|
||
|
||
模拟进度条效果
|
||
## ProgressBarExampleWindow
|
||
|
||
``` cs
|
||
using UnityEditor;
|
||
using UnityEngine;
|
||
using System.Threading.Tasks;
|
||
|
||
public class ProgressBarExampleWindow : EditorWindow
|
||
{
|
||
private float progress = 0f;
|
||
private string statusMessage = "Ready";
|
||
private bool isProcessing = false;
|
||
|
||
[MenuItem("Tools/Async Progress Bar Example")]
|
||
public static void ShowWindow()
|
||
{
|
||
GetWindow<ProgressBarExampleWindow>("Async Progress Bar");
|
||
}
|
||
|
||
private void OnGUI()
|
||
{
|
||
GUILayout.Label("Simulate an Async Task with Progress", EditorStyles.boldLabel);
|
||
|
||
if (GUILayout.Button("Start Task") && !isProcessing)
|
||
{
|
||
StartAsyncTask();
|
||
}
|
||
|
||
// 显示进度条
|
||
EditorGUI.ProgressBar(new Rect(3, 50, position.width - 6, 20), progress, statusMessage);
|
||
GUILayout.Space(30);
|
||
|
||
Repaint(); // 刷新窗口
|
||
}
|
||
|
||
private async void StartAsyncTask()
|
||
{
|
||
isProcessing = true;
|
||
statusMessage = "Processing...";
|
||
progress = 0f;
|
||
|
||
// 模拟异步任务
|
||
await Task.Run(async () =>
|
||
{
|
||
for (int i = 0; i <= 100; i++)
|
||
{
|
||
await Task.Delay(50); // 模拟工作负载
|
||
progress = i / 100f; // 更新进度
|
||
statusMessage = "Progress: " + (int)(progress * 100) + "%";
|
||
}
|
||
});
|
||
|
||
statusMessage = "Task Complete!";
|
||
isProcessing = false;
|
||
}
|
||
}
|
||
```
|
||
|
||
拉取git仓库
|
||
## GitCloneProgressWindow
|
||
|
||
``` cs
|
||
using UnityEditor;
|
||
using UnityEngine;
|
||
using System.Diagnostics;
|
||
using System.Text.RegularExpressions;
|
||
using System.Threading.Tasks;
|
||
|
||
public class GitCloneProgressWindow : EditorWindow
|
||
{
|
||
private float progress = 0f;
|
||
private string statusMessage = "Ready";
|
||
private bool isCloning = false;
|
||
|
||
[MenuItem("Tools/Git Clone with Progress")]
|
||
public static void ShowWindow()
|
||
{
|
||
GetWindow<GitCloneProgressWindow>("Git Clone Progress");
|
||
}
|
||
|
||
private void OnGUI()
|
||
{
|
||
GUILayout.Label("Clone Repository to C:\\git_backup", EditorStyles.boldLabel);
|
||
|
||
if (GUILayout.Button("Start Cloning") && !isCloning)
|
||
{
|
||
StartCloneProcess();
|
||
}
|
||
|
||
// 显示进度条
|
||
EditorGUI.ProgressBar(new Rect(3, 50, position.width - 6, 20), progress, statusMessage);
|
||
GUILayout.Space(30);
|
||
|
||
Repaint(); // 刷新窗口以实时更新进度
|
||
}
|
||
|
||
private async void StartCloneProcess()
|
||
{
|
||
isCloning = true;
|
||
statusMessage = "Starting clone process...";
|
||
progress = 0f;
|
||
|
||
await Task.Run(() => CloneRepository());
|
||
|
||
// 完成后重置状态
|
||
isCloning = false;
|
||
statusMessage = "Clone complete!";
|
||
progress = 1f;
|
||
}
|
||
|
||
private void CloneRepository()
|
||
{
|
||
string commands = "cd C:\\ && mkdir git_backup && cd git_backup && git clone https://192.168.0.223:8843/igengine/gamecenter_data.git";
|
||
|
||
Process process = new Process();
|
||
process.StartInfo.FileName = "cmd.exe";
|
||
process.StartInfo.Arguments = "/c " + commands;
|
||
process.StartInfo.RedirectStandardOutput = true;
|
||
process.StartInfo.RedirectStandardError = true;
|
||
process.StartInfo.UseShellExecute = false;
|
||
process.StartInfo.CreateNoWindow = true;
|
||
process.EnableRaisingEvents = true;
|
||
|
||
// 注册输出处理器以解析进度
|
||
process.OutputDataReceived += (sender, args) => ParseGitOutput(args.Data);
|
||
process.ErrorDataReceived += (sender, args) => ParseGitOutput(args.Data);
|
||
|
||
process.Start();
|
||
process.BeginOutputReadLine();
|
||
process.BeginErrorReadLine();
|
||
|
||
process.WaitForExit();
|
||
}
|
||
|
||
private void ParseGitOutput(string data)
|
||
{
|
||
if (string.IsNullOrEmpty(data)) return;
|
||
|
||
UnityEngine.Debug.Log(data); // 打印输出到控制台以供调试
|
||
|
||
// 解析 Receiving objects 进度
|
||
var receivingMatch = Regex.Match(data, @"Updating files:\s+(\d+)%");
|
||
if (receivingMatch.Success)
|
||
{
|
||
progress = int.Parse(receivingMatch.Groups[1].Value) / 100f;
|
||
statusMessage = "Updating files... " + receivingMatch.Groups[1].Value + "%";
|
||
return;
|
||
}
|
||
|
||
// 检查是否完成克隆
|
||
if (data.Contains("Checking out files"))
|
||
{
|
||
progress = 1f;
|
||
statusMessage = "Clone complete!";
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
其余情况,参考,有可能log是包含`Resolving deltas`或`Receiving objects`
|
||
## GitCloneProgressWindow
|
||
|
||
``` cs
|
||
using UnityEditor;
|
||
using UnityEngine;
|
||
using System.Diagnostics;
|
||
using System.Text.RegularExpressions;
|
||
using System.Threading.Tasks;
|
||
|
||
public class GitCloneProgressWindow : EditorWindow
|
||
{
|
||
private float progress = 0f;
|
||
private string statusMessage = "Ready";
|
||
private bool isCloning = false;
|
||
|
||
[MenuItem("Tools/Git Clone with Progress")]
|
||
public static void ShowWindow()
|
||
{
|
||
GetWindow<GitCloneProgressWindow>("Git Clone Progress");
|
||
}
|
||
|
||
private void OnGUI()
|
||
{
|
||
GUILayout.Label("Clone Repository to C:\\git_backup", EditorStyles.boldLabel);
|
||
|
||
if (GUILayout.Button("Start Cloning") && !isCloning)
|
||
{
|
||
StartCloneProcess();
|
||
}
|
||
|
||
// 显示进度条
|
||
EditorGUI.ProgressBar(new Rect(3, 50, position.width - 6, 20), progress, statusMessage);
|
||
GUILayout.Space(30);
|
||
|
||
Repaint(); // 刷新窗口以实时更新进度
|
||
}
|
||
|
||
private async void StartCloneProcess()
|
||
{
|
||
isCloning = true;
|
||
statusMessage = "Starting clone process...";
|
||
progress = 0f;
|
||
|
||
await Task.Run(() => CloneRepository());
|
||
|
||
// 完成后重置状态
|
||
isCloning = false;
|
||
statusMessage = "Clone complete!";
|
||
progress = 1f;
|
||
}
|
||
|
||
private void CloneRepository()
|
||
{
|
||
string commands = "cd C:\\ && mkdir git_backup && cd git_backup && git clone https://192.168.0.223:8843/igengine/cgbu_sdk.git";
|
||
|
||
Process process = new Process();
|
||
process.StartInfo.FileName = "cmd.exe";
|
||
process.StartInfo.Arguments = "/c " + commands;
|
||
process.StartInfo.RedirectStandardOutput = true;
|
||
process.StartInfo.RedirectStandardError = true;
|
||
process.StartInfo.UseShellExecute = false;
|
||
process.StartInfo.CreateNoWindow = true;
|
||
process.EnableRaisingEvents = true;
|
||
|
||
// 注册输出处理器以解析进度
|
||
process.OutputDataReceived += (sender, args) => ParseGitOutput(args.Data);
|
||
process.ErrorDataReceived += (sender, args) => ParseGitOutput(args.Data);
|
||
|
||
process.Start();
|
||
process.BeginOutputReadLine();
|
||
process.BeginErrorReadLine();
|
||
|
||
process.WaitForExit();
|
||
}
|
||
|
||
private void ParseGitOutput(string data)
|
||
{
|
||
if (string.IsNullOrEmpty(data)) return;
|
||
|
||
UnityEngine.Debug.Log(data); // 打印输出到控制台以供调试
|
||
|
||
// 解析 Receiving objects 进度
|
||
var receivingMatch = Regex.Match(data, @"Receiving objects:\s+(\d+)%");
|
||
if (receivingMatch.Success)
|
||
{
|
||
progress = int.Parse(receivingMatch.Groups[1].Value) / 100f;
|
||
statusMessage = "Receiving objects... " + receivingMatch.Groups[1].Value + "%";
|
||
return;
|
||
}
|
||
|
||
// 解析 Resolving deltas 进度
|
||
var resolvingMatch = Regex.Match(data, @"Resolving deltas:\s+(\d+)%");
|
||
if (resolvingMatch.Success)
|
||
{
|
||
progress = 0.7f + int.Parse(resolvingMatch.Groups[1].Value) / 100f * 0.2f;
|
||
statusMessage = "Resolving deltas... " + resolvingMatch.Groups[1].Value + "%";
|
||
return;
|
||
}
|
||
|
||
// 检查是否完成克隆
|
||
if (data.Contains("Checking out files"))
|
||
{
|
||
progress = 1f;
|
||
statusMessage = "Clone complete!";
|
||
}
|
||
}
|
||
}
|
||
``` |