网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
01月16日漏签0天
unity3d吧 关注:116,873贴子:562,170
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 首页 上一页 1 2
  • 46回复贴,共2页
  • ,跳到 页  
<<返回unity3d吧
>0< 加载中...

回复:关于FPS游戏开发的一些个人理解(2)

  • 只看楼主
  • 收藏

  • 回复
  • Not_Gate
  • Renderer
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
收藏了 期待UDP部分


  • 影随我殇化为劫
  • Collider
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这里摘两段从博客上截下来小改一下的代码,实现了最简单的udp,代码非常简单很容易理解,使用socket进行udp的对话,收发都是在单线程内,服务端大神可自觉忽略此楼,不懂的小白读两遍也能轻松理解。



实现了基本的udp,我们就要来开始正式的异步多线程+高频更新的网络IO开发了。


2026-01-16 08:07:21
广告
不感兴趣
开通SVIP免广告
  • 影随我殇化为劫
  • Collider
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using UnityEngine;
namespace UDP
{
class Program
{
void Client()
{
byte[] data = new byte[1024];
string stringData;
//构建TCP 服务器
Debug.Log("This is a Client, host name is " + Dns.GetHostName());
//设置服务IP,设置TCP端口号
IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8001);
//定义网络类型,数据连接类型和网络协议UDP
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
string welcome = "Hello! ";
data = Encoding.ASCII.GetBytes(welcome);
server.SendTo(data, data.Length, SocketFlags.None, ip);
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)sender;
data = new byte[1024];
//对于不存在的IP地址,加入此行代码后,可以在指定时间内解除阻塞模式限制
int recv = server.ReceiveFrom(data, ref Remote);
Debug.Log("Message received from" + Remote.ToString());
Debug.Log(Encoding.ASCII.GetString(data, 0, recv));
for(int i = 0; i < 100; ++i)
{
server.SendTo(Encoding.ASCII.GetBytes("From Server: " + i), Remote);
//发送一条信息
data = new byte[1024];
recv = server.ReceiveFrom(data, ref Remote);
stringData = Encoding.ASCII.GetString(data, 0, recv);
Debug.Log(stringData);
}
Debug.Log("Stopping Client.");
server.Close();
}
void Server(){
int recv;
byte[] data = new byte[1024];
//得到本机IP,设置TCP端口号
IPEndPoint ip = new IPEndPoint(IPAddress.Any, 8001);
Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//绑定网络地址
newsock.Bind(ip);
Debug.Log("This is a Server, host name is " + Dns.GetHostName());
//等待客户机连接
Debug.Log("Waiting for a client");
//得到客户机IP
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)(sender);
recv = newsock.ReceiveFrom(data, ref Remote);
Debug.Log("Message received from : " + Remote.ToString());
Debug.Log(Encoding.ASCII.GetString(data, 0, recv));
//客户机连接成功后,发送信息
string welcome = "你好 ! ";
//字符串与字节数组相互转换
data = Encoding.ASCII.GetBytes(welcome);
//发送信息
newsock.SendTo(data, data.Length, SocketFlags.None, Remote);
while (true)
{
data = new byte[1024];
//发送接收信息
recv = newsock.ReceiveFrom(data, ref Remote);
Debug.Log(Encoding.ASCII.GetString(data, 0, recv));
newsock.SendTo(Encoding.ASCII.GetBytes("Message Received! Thank you!"), recv, SocketFlags.None, Remote);
}
}
}
}


  • 影随我殇化为劫
  • Collider
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
使用上边讲过的多线程与线程安全数据容器的知识,我们来实现一波异步IO,多线程异步不会再有udp对话那种“你一言必须我一语”的堵塞,可以完美的进行高频收发(注意这两个函数可以同时执行时可以使用同一个socket的):


.Net作为非常优秀的CPU密集型运算架构,有着其他语言,其他平台无法比拟的轻量级异步能力,我们使用简单的几句就可以实现一套异步架构了。大家可以尝试一下,给send函数的queue中enqueue的数据是不是会添加到receive的queue中。


  • 昌维001
  • Scene
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
看看


  • 影随我殇化为劫
  • Collider
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这里纠正一下顶上的错误,ref是不支持lambda表达式的,我们这里的endThreadSign可以随意定义一个变量,控制循环的结束。(Task是不支持Thread那种强制终止的,只能用这样的办法来软终止)。


  • 影随我殇化为劫
  • Collider
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

这是如何发送可靠UDP的教程,如开枪等事件,是需要保证可靠的,服务端在没收到客户端的返回信息时,每隔一段时间就应该发送一次信息,而客户端则应该对信息作出反应。


  • _JackCat_
  • Unitor
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
能不能把你的demo或者成品发上来让大家瞧瞧?听你说得头头是道,好像很厉害的样子


2026-01-16 08:01:21
广告
不感兴趣
开通SVIP免广告
  • 愿此刻无痕
  • Renderer
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
好厉害...完全看不懂i


  • _离合幻梦
  • Prefab
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
好帖楼主加油


  • wuli大佬
  • Collider
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
楼主,我想问下,做类似于CS的游戏时,到底用的是人物整个模型还是单单两条手臂+一把枪,如果只是手臂的话,在其他玩家的视角里为什么是整个人,,,,渴望解答


  • wuli大佬
  • Collider
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
如果是整个人的话,为啥好多人去做两条手的模型。。。。


  • 影随我殇化为劫
  • Collider
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
圣诞节假期休息一下,这几天就开更!哈哈


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 首页 上一页 1 2
  • 46回复贴,共2页
  • ,跳到 页  
<<返回unity3d吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示