阿里云服务器免费领卷啦。

捡代码论坛-最全的游戏源码下载技术网站!

 找回密码
 立 即 注 册

QQ登录

只需一步,快速开始

搜索
关于源码区的附件失效或欺骗帖, 处理办法
查看: 2101|回复: 0

Unity中防止多个客户端同时打开

[复制链接]

4208

主题

210

回帖

12万

积分

管理员

管理员

Rank: 9Rank: 9Rank: 9

积分
126177
QQ
发表于 2017-4-24 17:35:47 | 显示全部楼层 |阅读模式
Unity中防止多个客户端同时打开


在游戏开发中,我们通常会为了防止用户同时打开多个端口,进行一些处理。大概的逻辑就是,首先判断有没有端口已经打开,如果有,则关闭将要打开的端口,如果没有,则打开端口。这里只是在Window下进行的操作,下面是具体实现:

  1. using UnityEngine;

  2. #if UNITY_STANDALONE_WIN
  3. using System;
  4. using System.Diagnostics;
  5. using System.Threading;
  6. using System.Runtime.InteropServices;
  7. #endif
  8. using System.Collections;

  9. /// <summary>
  10. /// 防止同时运行多个实例
  11. /// 用于检查此应用程序是否有多个存在,当检测到另一个实例已在运行,并退出当前的应用程序
  12. /// 仅限于Windows(其他平台由相应的操作系统处理)
  13. /// </summary>
  14. public class PreventMultipleExecution : MonoBehaviour {


  15.     public string m_WindowCaption = string.Empty;
  16.     public string m_WindowClass = "UnityWndClass";

  17. #if UNITY_STANDALONE_WIN
  18.     //引用Win32 API
  19.     [DllImport("user32.dll")]
  20.     private static extern bool SetForegroundWindow(IntPtr hWnd);  //创建指定窗口的线程设置到前台,并且激活该窗口
  21.     [DllImport("user32.dll")]
  22.     private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);   //设置指定窗口的显示状态。
  23.     [DllImport("user32.dll")]
  24.     private static extern bool IsIconic(IntPtr hWnd);    //确定给定窗口是否是最小化(图标化)的窗口。
  25.     [DllImport("user32.dll")]
  26.     private static extern IntPtr FindWindow(string className, string windowName);   //检索处理顶级窗口的类名和窗口名称匹配指定的字符串


  27.     //
  28.     private static PreventMultipleExecution m_Instance = null;
  29.     private System.Threading.Mutex m_Mutex = null;


  30.         void Awake ()
  31.     {
  32.         if (m_Instance != null)
  33.         {
  34.             Destroy(this.gameObject);
  35.             return;
  36.         }

  37.         m_Instance = this;

  38.         UnityEngine.Object.DontDestroyOnLoad(this);

  39.         if (IsAlreadyRunning())
  40.         {
  41.             //bring the original instance to front
  42.             BringToFront();

  43.             Application.Quit();
  44.         }
  45.         }

  46.     /// <summary>
  47.     /// 应用退出操作
  48.     /// </summary>
  49.     void OnApplicationQuit()
  50.     {
  51.         if (m_Mutex != null)
  52.             m_Mutex.ReleaseMutex();
  53.     }

  54.     /// <summary>
  55.     /// 判断应用是否已经运行
  56.     /// </summary>
  57.     /// <returns></returns>
  58.     private bool IsAlreadyRunning()
  59.     {
  60.         //create our mutex
  61.         bool createdNew;
  62.         m_Mutex = new System.Threading.Mutex(true, m_WindowCaption, out createdNew);

  63.         if (!createdNew)
  64.             m_Mutex = null;                                

  65.         return (createdNew == false);        //如果没有创建新的应用,说明已经有一个应用在运行
  66.     }

  67.     /// <summary>
  68.     /// 将应用实例窗口置于前面
  69.     /// </summary>
  70.     private void BringToFront()
  71.     {
  72.         if (string.IsNullOrEmpty(m_WindowCaption))
  73.             return;

  74.         const int SW_RESTORE = 9;
  75.         IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);

  76.         IntPtr hWnd = FindWindow(string.IsNullOrEmpty(m_WindowClass) ? null : m_WindowClass, m_WindowCaption);

  77.         if (hWnd == INVALID_HANDLE_VALUE)
  78.             return;

  79.         if (IsIconic(hWnd))
  80.             ShowWindow(hWnd, SW_RESTORE);

  81.         SetForegroundWindow(hWnd);
  82.     }
  83. #endif
  84. }
复制代码


源码在这里下载:


游客,如果您要查看本帖隐藏内容请回复







00


捡代码论坛-最全的游戏源码下载技术网站! - 论坛版权郑重声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与捡代码论坛-最全的游戏源码下载技术网站!享有帖子相关版权
3、捡代码论坛版权,详细了解请点击。
4、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。
5、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。 我们不承担任何技术及版权问题,且不对任何资源负法律责任。
6、如无法链接失效或侵犯版权,请给我们来信:jiandaima@foxmail.com

回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立 即 注 册

本版积分规则

技术支持
在线咨询
QQ咨询
3351529868

QQ|手机版|小黑屋|捡代码论坛-专业源码分享下载 ( 陕ICP备15015195号-1|网站地图

GMT+8, 2024-4-26 11:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表