每个人都有自己的知识体系。
Toggle navigation
Home
随笔
C#/.Net
树莓派 / Raspberry
皓月汉化组
Beego
Golang
OxideMod
apache
haproxy
windows
Java
Objective-C
日语/罗马音歌词/日语常识
MongoDB
python
电学
公告
Minecraft服务器-公告
NanoPi
C4D (CINEMA 4D)
生活
推流/m3u8/rtmp/rtsp
Unity3d
ffmpeg
数据结构
区块链
tarui
UnityForPSVita
About Me
Archives
Tags
PSVIta_Unity网络请求踩坑
2024-09-24 17:04:10
63
0
0
akiragatsu
文本探索了PSVita移植过程中,关于网络请求的问题 仅针对Unity的情况。(实测发现Unity下PSVita开发比C/C++原生PSVita开发底层提供的东西太少了) 本文用于记录我开发UNITY PSVITA跨平台联机模拟器项目,所遇到的问题,以及解决方案, 尤其是Http的坑,我提供了代码。随着我的联机项目持续开发,本文持续更新…… 直接进入正题: ##**PSV电源模式 (模式A和模式C可以联网 仅模式B不可以)** 模式有三种,Unity官方描述是 ModeA - default. ModeB - GPU High - No WLAN or COM. ModeC - GPU High - No Camera, OLED Low brightness. 模式A不限制,模式B关闭WLAN和COM接口,给GPU争取更多功率 那么,看样子是 是模式C限制得更狠。 实测,模式C限制摄像头和OLED之外,并没有限制WLAN; 如果项目需要联网不需要摄像头,那就**选模式C**吧。 *没准COM就是那个神秘接口(小声说道) ##**原生SOCKET(IPv4可用,IPv6不可用)** 使用原生Socket,在PSVita中是直接可用的。 **但PSVita不允许包含IPv6,即便是他隐式支持了。也要手动排除** 不过 虽然你大概率在PSV上IPv6,但是Socket默认是要初始化IPv6的,需要手动指定一下。 使用时,要注意避免使用C#内部实现初始化了IPv6的实现。 例如 Socket 的构造函数中 SocketType和 ProtocolType两个参数的构造函数不可用。 会报协议不支持的错误:SocketException: Protocol not Supported 因为该构造函数,会自动补底层基类的类型为IPV6优先。 ``` //不要用如下方式 Socket client = new Socket(SocketType.Stream, ProtocolType.Tcp); //C#内部实际基类透传 是ipv6优先 ↓↓↓ public Socket(SocketType socketType, ProtocolType protocolType) : this(AddressFamily.InterNetworkV6, socketType, protocolType) ``` **正确姿势:** 手动指定为AddressFamily.InterNetwork即IPv4,(没错,这吊PSVita就这样),不知道该吐槽mono还是该吐槽psvita协议优先级。 ``` Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ``` ##**DNS解析(可用)** 如下代码在PSVita上正常运行(妈的,少有的正常运行的) ``` PHostEntry hostinfo = Dns.GetHostEntry("emu.axibug.com"); IPAddress[] aryIP = hostinfo.AddressList; Debug.Log($"strIPRet->{aryIP[0].ToString()}"); ``` ##**PSVita的网络设置** ``` //字面意思,需要自取 UnityEngine.PSVita.Networking.enableUDPP2P = true;//开启UDP的P2P UnityEngine.PSVita.Networking.npSignalingPort;//端口信号 ``` ##**Wifi网络提示(惰性触发)** ![title](/api/file/getImage?fileId=66f27bcbbbb3221df80004d7) 这个是当进入游戏之前在PSVita系统界面,没有连接wifi时。 进入游戏第一次使用Socket请求时,若没有连接Wifi,底层访问TimeOut之后,才会弹出Wifi提示选项。 PS: · 任何C#自带的或者Unity自带的Http请求手段无法直接触发该弹窗。 · 顺带,如果用户关闭该弹窗,保持没有连接Wifi,后续请求将不再提示弹窗。 · 短时间之内,即便是关闭了游戏(保持不连接WiFi),再启动游戏,联网也不再弹窗。 · 重启PSVita之后,第一次启动某Unity游戏的第一次联网,会弹窗。 建议: 如果您移植的PSVita有联网需求,做提示,应该在访问失败时,UI上提示用户”请检查Wifi连接“,让用户即使知晓,并前往系统连接wifi。 ##**HTTP/HTTPS (原生方式不可用,我给个替代方案)** 省流:即目前发现,原生UnityWebRequest、WWW 以及C# 原生的 System.Net.HttpClient,System.Net.WebRequest,PSV Unity下都不可正常使用。最下面有解决方法。 目前发现Unity自带的 UnityWebRequest 请求HTTP 在PSVita上无法使用,HTTP Code 始终为0.(和无网络的code一样) 经过多次测试,大致断定 **UnityWebRequest** 在PSVita下未实现(至少没有PSVita的联网权限。) C#原生的大部分 Http请求构造方法不可用: System.Net.HttpClient 或 System.Net.WebRequest 不可用 Unity的**BestHttp插件**已证实**不可用**,悲。 如果你想使用C#原生的System.Net.HttpClient,在Editor上写代码冲拳出击,但是!PSVita实机报错: ``` DllNotFoundException:Unable to load DLL 'libc':The specified module cloud not be found. ``` 逆天! 打包的sce_module/libc.suprx不是有么,居然找不到。乐。 草,Unity Support PSVita 和 SDK **貌似并不包含完整mono的所需的依赖链**。 亦或者是System.Net.WebRequest,编辑器中没问题,但是PSVita实体机: ``` NoSupportException:The URI prefix is not recognized. ``` 差不多是这样,↓ https://learn.microsoft.com/en-nz/archive/msdn-technet-forums/431e8e80-3bf0-4679-a0c0-9b5cae4f2f38 ## 解决方法: - 使用原生Socket构造完整的Http收发流程的方式(需要自己实现http流程) 这里我直接提供一个好了: 我称之为,OnlySocketHttp。就是纯用Socket的方式构建Http协议请求。 支持协程等待。 (草,有点小问题,我正在修复中,请持续关注本文……) ## 具体实现 我已经封装好,支持Http/Https 的请求和下载功能,支持异步 你可以直接拷贝到你Unity项目中, 如下: [http://git.axibug.com/sin365/AxiHttp](http://git.axibug.com/sin365/AxiHttp) 调用方式,范例: http请求、 http异步请求可协程等待、 http下载、 http异步下载可协程等待、 ``` void NewHttpTest() { AxiRespInfo respInfo = AxiHttp.AxiRequest("http://emu.axibug.com/api/CheckStandInfo?platform=1&version=1.0.0.0"); ShowAxiRespInfo(respInfo); } IEnumerator NewHttpTestAsync() { WaitAxiRequest waitAsync = AxiRequestAsync("http://emu.axibug.com/api/CheckStandInfo?platform=1&version=1.0.0.0"); yield return waitAsync; AxiRespInfo respInfo = waitAsync.mReqAsync; ShowAxiRespInfo(respInfo); } void NewHttpDownLoadTest() { AxiRespInfo respInfo = AxiHttp.AxiDownload("http://emu.axibug.com/images/fcrom/Downtown%20-%20Nekketsu%20Monogatari%20(J).JPG"); ShowAxiRespInfo(respInfo); } IEnumerator NewHttpDownLoadTestAsync() { AxiRespInfo respInfo = AxiHttp.AxiDownloadAsync("http://emu.axibug.com/FileZilla_Server-cn-0_9_60_2.exe"); while (!respInfo.isDone) { //yield return new WaitForSeconds(0.3f); yield return null; Debug.Log($"下载进度:{respInfo.DownLoadPr} ->{respInfo.loadedLenght}/{respInfo.NeedloadedLenght}"); } ShowAxiRespInfo(respInfo); } void ShowAxiRespInfo(AxiRespInfo respInfo) { Debug.Log($""); Debug.Log($"==== request ===="); Debug.Log($"url =>{respInfo.url}"); Debug.Log($"Raw =>{respInfo.requestRaw}"); Debug.Log($"code =>{respInfo.code}"); Debug.Log($"respInfo.bTimeOut =>{respInfo.bTimeOut}"); Debug.Log($""); Debug.Log($"==== response ===="); Debug.Log($"==== header ===="); Debug.Log($"header =>{respInfo.header}"); Debug.Log($"HeadersCount =>{respInfo.headers.Count}"); foreach (var kv in respInfo.headers) Debug.Log($"{kv.Key} => {kv.Value}"); Debug.Log($""); Debug.Log($"==== body ===="); Debug.Log($"body_text =>{respInfo.body}"); Debug.Log($"body_text.Length =>{respInfo.body.Length}"); Debug.Log($"bodyRaw.Length =>{respInfo.bodyRaw?.Length}"); Debug.Log($""); Debug.Log($"==== download ===="); Debug.Log($"downloadMode =>{respInfo.downloadMode}"); Debug.Log($"respInfo.fileName =>{respInfo.fileName}"); Debug.Log($"respInfo.NeedloadedLenght =>{respInfo.NeedloadedLenght}"); Debug.Log($"respInfo.loadedLenght =>{respInfo.loadedLenght}"); if (respInfo.downloadMode == AxiDownLoadMode.DownLoadBytes) { if (respInfo.bTimeOut) { Debug.Log($"DownLoad Timeout!"); return; } string downloadSavePath; if (Application.platform == RuntimePlatform.PSP2) { downloadSavePath = dataAxibugPath + "/" + respInfo.fileName; } else { downloadSavePath = persistentDataPath + "/" + respInfo.fileName; } try { File.WriteAllBytes(downloadSavePath, respInfo.bodyRaw); Debug.Log($"DownLoad OK"); } catch (Exception ex) { Debug.Log($"DownLoad Err {ex.ToString()}"); } } } ```
Pre:
热爱105°C的你(日语版)(翻自 阿肆)
Next:
PSVIta_Unity目录
0
likes
63
Weibo
Wechat
Tencent Weibo
QQ Zone
RenRen
Submit
Sign in
to leave a comment.
No Leanote account?
Sign up now.
0
comments
More...
Table of content
No Leanote account? Sign up now.