Unity中通过Process启动程序并传递数据

说明:


最近根据项目上的需求,一个专题中有众多的场景,后决定采用【主场景+子场景】分开打包的方式,需要解决的是在主场景登陆进去之后需要将【用户ID】等数据传递到子场景中,一开始采用的是Socket通讯的方式传递,后来改为使用进程(Process)启动外部exe


所引用的命名空间为:System.Diagnostics

1. 不带参数直接启动外部程序

 Process.Start("启动的路径名字");

2. 启动时传递参数

传递多个参数时需要用【空格】分开

	 /// <param name="path">启动路径</param>
    /// <param name="argument">传递的参数 【多个参数使用空格分开】</param>
 	public static void OpenStartByProgress(string path,string argument)
    {
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.FileName = path;
        startInfo.Arguments = argument;
        Process.Start(startInfo);
    }

3.启动传递参数,避免多开(只开一个)

注意: 获取进程中的名字进行比较时没有后缀,比如QQ.exe, 进程名字是QQ

	 /// <param name="path">启动路径</param>
     /// <param name="argument">传递参数</param>
    public static void OpenByProgress(string path,string argument,UnityAction<string> action=null)
    {
        //这里是根据路径获取启动的程序名字
        int index = path.LastIndexOf('/');
        //启动进程的名字(进程的名字后缀没有.exe)
        string ProgressName =path.Substring(index+1).Split('.')[0]; 
        
        //索引记数
        int currentProgress = 0;

        Process[] processes = Process.GetProcesses();

        foreach (var item in processes)
        {
            if (item.ProcessName == ProgressName)
            {
                currentProgress++;
            }
        }

        if (currentProgress >= 1) //已经启动的情况下
        {
            //提示信息: 当前进程已经启动 请勿重复使用  
            action("当前程序已经启动,请勿重复启动");
        }
        else //没有启动
        {
            //进程启动
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.FileName = path;
            startInfo.Arguments = argument;
            Process.Start(startInfo);
        }
    }

4.子场景启动时获取传递的参数

 private void GetArguements()
    {
    	//args数组获取的就是参数列表,可根据实际情况进行处理
        string[] args = Environment.GetCommandLineArgs();
        //args[0]: 的数据为启动的路径
        ProgressData.Id = args[1];
        ProgressData.MemberId = args[2];
        ProgressData.Token = args[3];
    }

如有错误请指出,相互学习,相互进步!

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Unity读取WinForm通过Process类发来的数据,可以使用Unity自带的网络库来实现。具体步骤如下: 1. 在WinForm,使用Process启动Unity程序,并将需要传递的数据作为命令行参数传递给Unity程序。 2. 在Unity,编写一个网络服务器程序,监听指定的端口。 3. 在WinForm,使用Socket类向Unity服务器发送数据。 4. 在Unity,接收WinForm发送的数据,并对其进行处理。 以下是一个简单的示例代码,用于在Unity启动网络服务器并接收WinForm发送的数据: ```csharp using UnityEngine; using System.Net; using System.Net.Sockets; using System.Text; public class NetworkServer : MonoBehaviour { private TcpListener listener; private TcpClient client; private NetworkStream stream; void Start() { // 启动网络服务器并监听指定的端口 listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8888); listener.Start(); Debug.Log("Server started."); // 等待客户端连接 client = listener.AcceptTcpClient(); stream = client.GetStream(); Debug.Log("Client connected."); // 开始接收数据 byte[] buffer = new byte[1024]; int bytesRead = 0; while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0) { string message = Encoding.UTF8.GetString(buffer, 0, bytesRead); Debug.Log("Received message: " + message); } } void OnDestroy() { // 关闭网络连接 stream.Close(); client.Close(); listener.Stop(); Debug.Log("Server stopped."); } } ``` 在WinForm,可以使用以下代码向Unity服务器发送数据: ```csharp using System.Net.Sockets; using System.Text; public class NetworkClient { private TcpClient client; private NetworkStream stream; public void Connect() { // 连接Unity服务器 client = new TcpClient("127.0.0.1", 8888); stream = client.GetStream(); } public void Send(string message) { // 发送数据 byte[] buffer = Encoding.UTF8.GetBytes(message); stream.Write(buffer, 0, buffer.Length); } public void Disconnect() { // 关闭网络连接 stream.Close(); client.Close(); } } ``` 使用上述代码,可以在WinFormUnity服务器发送数据,并在Unity接收并处理这些数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值