Unity游戲的局域網對戰功能實現


   之前項目實現了局域網對戰,看見群里有人問,獻丑分享下。

    這個局域網對戰功能,在PC/web/移動端上實現是一樣的,可以通用。
   要實現一個游戲的局域網功能,主要實現以下三個功能點:
  1.客戶端能建立主機服務。
  2.其他客戶端能自動搜索到該主機
  3.其他客戶端主動加入該主機。


   1. 建立主機服務, 很簡單,就不細說了。


    2. 實現自動搜索該主機
              有幾種實現方式:
      1.主機用UDP廣播向全網段廣播自己的地址
        當客戶端啟動時使用UDP協議向255.255.255.255這個廣播地址發送廣播包,廣播包內容包含用戶名、工作組、主機名、IP等信息,收到此廣播包后,就會在自己的用戶列表中添加這個用戶的用戶名、工作組等信息,同時向對方IP發送本機用戶的個人信息;從而雙方都能建立起用戶列表。 
      2. 用TCP syn包掃描獲取ack。  或者用Udp的ICMP包。其實Udp的ICMP包在某些被屏蔽的情況是無法獲得地址的,但我們自己的游戲不存在這個問題。
      3.  最簡單的一種 見回復內容。

[hide]using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;
using UnityEngine;

public class PingSocket : MonoBehaviour
{

    List<string> ipList = new List<string>();

    public void DoGetIP()
    {
        //Thread
        StartCoroutine(getIP());
    }

    IEnumerator getIP()
    {
        yield return new WaitForSeconds(1f);

        //獲取本地機器名 
        string _myHostName = Dns.GetHostName();
        //獲取本機IP 
        string _myHostIP = Dns.GetHostEntry(_myHostName).AddressList[0].ToString();

        //截取IP網段
        string ipDuan = _myHostIP.Remove(_myHostIP.LastIndexOf('.'));
        //string ipDuan = "192.168.0";
        //枚舉網段計算機
        for (int i = 1; i <= 255; i++)
        {
            System.Net.NetworkInformation.Ping myPing = new System.Net.NetworkInformation.Ping();
            myPing.PingCompleted += new PingCompletedEventHandler(_myPing_PingCompleted);
            string pingIP = ipDuan + "." + i.ToString();
            myPing.SendAsync(pingIP, 500, null);

        }
    }
    void _myPing_PingCompleted(object sender, PingCompletedEventArgs e)
    {
        if (e.Reply.Status == IPStatus.Success)
        {
            ipList.Add(e.Reply.Address.ToString());
        }

        Debugerr.LogJLError("局域網主機---" + e.Reply.Address.ToString());
    }
}


其實ping使用的也是ICMP包,只是系統幫我們實現了。
     


      
  
   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM