目录

自由学习记录42

自由学习记录(42)

可能会出现到后面没有教程可以看,走不动,,但还是尝试吧 过程远比想象的要多 那连Live2d的这些脚本怎么控制的都要了解一下 -———– https://i-blog.csdnimg.cn/direct/cdd9a28ea0c94ca89f450e8ab7e649d1.png https://i-blog.csdnimg.cn/direct/cd98109846854432a8f43ba197cd46bc.png https://i-blog.csdnimg.cn/direct/34d972f512754d0c8a54e116a1d27e35.png 全部导入之后 https://i-blog.csdnimg.cn/direct/e45ea9f3214742b2addaee046120073a.png 在这下载SDKhttps://i-blog.csdnimg.cn/direct/5b526fac3bf848fcad31a1ae810d65c4.png

将 Live2D 模型导入 Unity

Live2D 模型通常包含以下文件:

  • .model3.json:模型的配置文件。
  • .moc3:模型的骨骼文件。
  • .texture:模型的纹理文件(通常是 .png)。
  • .physics3.json:物理配置文件(可选)。
  • .motion3.json:动画文件(可选)。 确保你下载的 Live2D 模型文件包含以上内容。

Cubism SDK 是什么?

Cubism SDK 是 Live2D 官方提供的开发工具包,包含以下内容:

  • Cubism Core :Live2D 的核心库,用于解析和渲染 Live2D 模型。
  • Cubism Native/Web Framework :用于在不同平台上集成 Live2D 模型的框架。
  • Cubism Unity SDK :专门为 Unity 开发者提供的工具包,用于在 Unity 中加载和运行 Live2D 模型。 https://i-blog.csdnimg.cn/direct/9a08fab0c29a4969bfa4f3a8bd69e086.png 那意思是说还有一个“SDK” https://i-blog.csdnimg.cn/direct/b033816db9d049d994ce8ebe42493390.png -———-
  • 数据保护UnityWebRequest 封装了底层网络通信的细节,开发者不需要直接操作字节流或套接字。
  • 简化开发 :通过 uploadHandlerdownloadHandler,开发者可以更方便地设置请求体和处理响应。
  • 跨平台支持UnityWebRequest 在 Unity 支持的各个平台(如 Windows、macOS、Android、iOS 等)上都能正常工作。 UnityWebRequest 并不是直接发送给服务器的数据,而是一个包装器 ,它包含了以下核心组件:
  • uploadHandler :用于设置请求体(即发送给服务器的数据)。
  • downloadHandler :用于接收服务器返回的响应数据。
  • SetRequestHeader :用于设置请求头。
  • SendWebRequest :用于发送请求并等待响应。 服务器最终接收的是 UnityWebRequest 中封装的数据(如请求体、请求头等),而不是 UnityWebRequest 类本身。 UnityWebRequest 类在 Unity 中是一个封装了 HTTP 请求和响应的工具类,它的主要作用是对底层网络通信的抽象和封装 ,使得开发者可以更方便地发送 HTTP 请求和处理响应。 https://i-blog.csdnimg.cn/direct/a50406a2e9af419a9e28831fa2a59d46.png 请求体:这里是要发送的内容,实际发给服务端的是Request,Request里装的内容,类型需要是byte数组( 所以后面有https://i-blog.csdnimg.cn/direct/e3f3d57f9fdb4ff8993e29e9d325d221.png https://i-blog.csdnimg.cn/direct/29e24110786847078444aeb32662aa5d.png ) 这里是按照服务端的要求格式,定义了可以传的匿名类 里面的数据 按服务器格式来写
  • system :用于设置 AI 的行为或角色。例如,content 可以是 "You are a helpful assistant.",表示让 AI 扮演一个有帮助的助手。
  • user :用户输入的内容。例如,content 可以是 "Hello!",表示用户向 AI 打招呼。
  • assistant :AI 的回复。通常不需要在请求中手动设置,而是由 API 返回。
  • 如果设置为 true,API 会以流式传输的方式逐步返回响应(适用于需要实时显示结果的场景)。
  • 如果设置为 false,API 会一次性返回完整的响应(适用于不需要实时显示的场景)。 var requestData = new { model = “deepseek-chat”, messages = new[] { new { role = “system”, content = "" }, new { role = “user”, content = "" } }, stream = false }; -————- using System; using Newtonsoft.Json; [Serializable] public class ChatCompletionResponse { public string id; public string @object; public long created; public string model; public Choice[] choices; public Usage usage; public string system_fingerprint; } [Serializable] public class Choice { public int index; public Message message; public object logprobs; // 可以是 null public string finish_reason; } [Serializable] public class Message { public string role; public string content; } [Serializable] public class Usage { public int prompt_tokens; public int completion_tokens; public int total_tokens; public PromptTokensDetails prompt_tokens_details; public int prompt_cache_hit_tokens; public int prompt_cache_miss_tokens; } [Serializable] public class PromptTokensDetails { public int cached_tokens; } 流程大致是知道了,传请求给了服务端了,然后需要有类来装信息 -———-

响应字段解析

  • id :请求的唯一标识符。
  • object :返回的对象类型,这里是 chat.completion
  • created :响应生成的时间戳。
  • model :使用的模型名称,这里是 deepseek-chat
  • choices :生成的回复内容。
  • index :回复的索引(通常为 0)。
  • message :回复的具体内容。
  • role :角色,这里是 assistant
  • content :回复的文本内容。
  • logprobs :日志概率(通常为 null)。
  • finish_reason :回复结束的原因,这里是 stop
  • usage :请求的 token 使用情况。
  • prompt_tokens :输入提示的 token 数量。
  • completion_tokens :生成回复的 token 数量。
  • total_tokens :总 token 数量。
  • prompt_tokens_details :输入提示的 token 详情。
  • cached_tokens :缓存的 token 数量。
  • prompt_cache_hit_tokens :缓存命中的 token 数量。
  • prompt_cache_miss_tokens :缓存未命中的 token 数量。
  • system_fingerprint :系统的唯一标识符。 https://i-blog.csdnimg.cn/direct/76ae60eb78f840a191a33a09eea9caec.png 装上了插件后,把这个脚本挂到游戏物体上,成功返回了结果打印 using System.Collections; using UnityEngine; using UnityEngine.Networking; using Newtonsoft.Json; using System.Text; public class DeepSeekAPI : MonoBehaviour { // DeepSeek API 的 URL private string url = “ // 你的 DeepSeek API Key private string apiKey = “你的API KEY”; void Start() { // 启动发送请求的协程 StartCoroutine(SendRequest()); } IEnumerator SendRequest() { // 请求的 JSON 数据 var requestData = new { model = “deepseek-chat”, messages = new[] { new { role = “system”, content = “You are a helpful assistant.” }, new { role = “user”, content = “Hello!” } }, stream = false }; // 使用 Newtonsoft.Json 序列化 JSON 数据 string jsonContent = JsonConvert.SerializeObject(requestData); // 创建 UnityWebRequest using (UnityWebRequest request = new UnityWebRequest(url, “POST”)) { // 设置请求头 request.SetRequestHeader(“Content-Type”, “application/json”); request.SetRequestHeader(“Authorization”, $“Bearer {apiKey}”); // 设置请求体 byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonContent); request.uploadHandler = new UploadHandlerRaw(bodyRaw); request.downloadHandler = new DownloadHandlerBuffer(); // 发送请求并等待响应 yield return request.SendWebRequest(); // 检查是否有错误 if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError) { Debug.LogError(“Error: " + request.error); Debug.LogError(“Response: " + request.downloadHandler.text); } else { // 输出响应结果 Debug.Log(“Response: " + request.downloadHandler.text); } } } }

Newtonsoft.Json(正确转数据格式)

手动下载并导入 Newtonsoft.Json.dll

步骤:
  1. 下载 Newtonsoft.Json.dll
  • 访问 。
  • 下载最新版本的 .nupkg 文件(例如 Newtonsoft.Json.13.0.3.nupkg)。
  • .nupkg 文件后缀改为 .zip,然后解压缩。
  • 在解压后的文件夹中找到 lib/netstandard2.0/Newtonsoft.Json.dll
  1. 将 DLL 文件导入 Unity:
  • 在 Unity 项目中,创建一个 Plugins 文件夹(如果不存在)。
  • Newtonsoft.Json.dll 文件拖入 Plugins 文件夹中。 -——— API Key 安全性 : 不要在代码中硬编码 API Key,建议使用 Unity 的 PlayerPrefs 或从外部配置文件加载。 -—————– curl 是一个命令行工具,用于通过多种协议(如 HTTP、HTTPS、FTP 等)传输数据。它常用于发送 HTTP 请求并获取响应。

基本用法

GET 请求 :默认情况下,curl 发送 GET 请求。 curl POST 请求 :使用 -X POST 选项发送 POST 请求,并通过 -d 传递数据。 curl -X POST -d “param1=value1&param2=value2” 设置请求头 :使用 -H 选项添加请求头。 curl -H “Content-Type: application/json” https://i-blog.csdnimg.cn/direct/b868726cb8d74b39a056262f77ab5922.png https://i-blog.csdnimg.cn/direct/3537fca2f119454e86758205d7fd75f8.png https://i-blog.csdnimg.cn/direct/7de1d9da61de43589deba930693b150a.png 用终端进行命令传输也可以,这个接口的服务请求 https://i-blog.csdnimg.cn/direct/df6d1dd5195842adb813c6243bb720f1.png https://i-blog.csdnimg.cn/direct/9e1c158d9802418cbaea3925515d3a19.png [什么是API?DeepSeek技巧升级2.0~_哔哩哔哩_bilibili]( card.all.click&vd_source=8edbc527019213f5a0f28f3a4b395636 “什么是API?DeepSeek技巧升级2.0~_哔哩哔哩_bilibili”) https://i-blog.csdnimg.cn/direct/1201fb12dcca46138f3b521576e1e04d.png 接口 https://i-blog.csdnimg.cn/direct/69f820a552f2407b8f62399bb5475bc2.png 看国外的还是门槛太高了,又是政策限制,又是语言的描述,还有版本问题,,讨论的圈子小,,这哪顶得住 还是老实先拿deepseek实验一下吧

AICommand的Unity版本问题

解决方法,把报错的Post方法https://i-blog.csdnimg.cn/direct/d2064f0850bb49ae8362b0c0a81da071.png 换成 using var post = new UnityWebRequest(OpenAI.Api.Url, “POST”); // 设置请求体 var bodyRaw = System.Text.Encoding.UTF8.GetBytes(CreateChatRequestBody(prompt)); post.uploadHandler = new UploadHandlerRaw(bodyRaw); post.downloadHandler = new DownloadHandlerBuffer(); // 设置请求头 post.SetRequestHeader(“Content-Type”, “application/json”); post.SetRequestHeader(“Authorization”, “Bearer " + settings.apiKey); -–版本差异 2021 using var post = new UnityWebRequest(url, “POST”); var bodyRaw = System.Text.Encoding.UTF8.GetBytes(jsonData); post.uploadHandler = new UploadHandlerRaw(bodyRaw); post.downloadHandler = new DownloadHandlerBuffer(); post.SetRequestHeader(“Content-Type”, “application/json”); post.SetRequestHeader(“Authorization”, “Bearer " + apiKey); 2022 using var post = UnityWebRequest.Post(url, jsonData, “application/json”); post.SetRequestHeader(“Authorization”, “Bearer " + apiKey);

为什么Unity 2021需要更多步骤?

  • 历史原因 :Unity 2021的UnityWebRequest API设计较早,功能较为基础,没有考虑到复杂的POST请求场景。
  • 灵活性 :手动设置请求体和请求头虽然繁琐,但也提供了更大的灵活性,可以适应各种自定义需求。
  • 改进 :Unity 2022对API进行了优化,使其更符合现代开发需求,减少了开发者的工作量。

请求体和请求头的设置差异

Unity 2021

在Unity 2021中,如果你需要发送JSON数据,必须手动完成以下步骤:

  1. 创建UnityWebRequest对象: using var post = new UnityWebRequest(url, “POST”);
  2. 设置请求体
  • 将JSON字符串转换为字节数组。
  • 使用**UploadHandlerRaw** 将字节数组设置为请求体。 var bodyRaw = System.Text.Encoding.UTF8.GetBytes(jsonData); post.uploadHandler = new UploadHandlerRaw(bodyRaw);
  1. 设置请求头
  • 手动设置Content-Typeapplication/json
  • 手动设置Authorization头(如果需要)。 post.SetRequestHeader(“Content-Type”, “application/json”); post.SetRequestHeader(“Authorization”, “Bearer " + apiKey);
  1. 设置下载处理器 : post.downloadHandler = new DownloadHandlerBuffer();
Unity 2022

在Unity 2022中,这些步骤被大大简化:

  1. 直接使用UnityWebRequest.Post: using var post = UnityWebRequest.Post(url, jsonData, “application/json”);
  2. 设置请求头 (如果需要): post.SetRequestHeader(“Authorization”, “Bearer " + apiKey);
  3. 不需要手动设置UploadHandlerRawDownloadHandlerBuffer,因为这些已经由UnityWebRequest.Post内部处理。 因为Unity2022版本,UnityWebReqeust更新了方法, https://i-blog.csdnimg.cn/direct/ca3e2a06f22d4492941816deffa75fa0.png 在23年的版本,这里还可以写别的类型的 https://i-blog.csdnimg.cn/direct/a7f0bdfc02c3412dabba7984358ea3bb.png Toolbox的Project Setting https://i-blog.csdnimg.cn/direct/dd06698085994179a86b07c6faccb7c9.png

网络知识

怎么防止 MITM 攻击?

如果你不想让自己的 HTTPS 连接被代理服务器劫持,可以采取以下措施:

🔹 (1) 检查网站证书

  • 当你访问 https://example.com 时,点击浏览器的“锁”图标,检查证书是否是官方颁发的。
  • 如果证书是未知机构颁发的,说明可能存在 MITM 代理!

🔹 (2) 启用 HSTS(HTTP 严格传输安全)

  • HSTS 让网站强制使用 HTTPS,并防止客户端接受伪造的证书。

🔹 (3) 使用 VPN

  • VPN 加密了你和 VPN 服务器之间的所有通信 ,即使有人在网络上使用 MITM 代理,也看不到你的实际数据。

合法用途

  1. 公司网络监控
  • 公司可以在员工的电脑上安装“受信任的”证书,让员工的所有 HTTPS 访问都经过 MITM 代理。
  • 这样,公司可以监控员工访问的网站内容(比如是否在上班时间刷 YouTube)。
  1. 安全测试
  • 安全研究人员可以用 MITM 代理检查网络通信,看看应用程序是否安全(比如某个APP是否会偷偷上传你的数据)。

非法用途

  1. 黑客攻击
  • 恶意 WiFi 热点可能会使用 MITM 代理,拦截你登录银行、社交媒体时的加密数据,盗取密码。
  1. 政府审查
  • 一些国家可能会使用 MITM 代理来监视公民的网络活动,即使使用了 HTTPS 也无法完全保护隐私。

中间人代理(MITM Proxy)是怎么破解 HTTPS 的?

因为 HTTPS 是加密的,代理服务器默认无法读取数据 。但是,中间人代理(MITM Proxy) 采用了一种特殊的“欺骗”手法,绕过了这个限制。

MITM 代理如何破解 HTTPS?

  1. 伪造一个假的 HTTPS 证书
  • 代理服务器自己创建一个“假的”SSL证书,冒充你访问的网站(如 example.com)。
  • 你的电脑本来应该直接和 example.com 建立加密连接,但现在会误以为代理服务器就是example.com
  1. 代理服务器建立两条连接
  • 第一条连接 :你的电脑 → 代理服务器(这个连接使用伪造的 HTTPS 证书)
  • 第二条连接 :代理服务器 → 目标网站(真实的 example.com
  1. 代理服务器解密你的数据
  • 你的浏览器“信任”了伪造的证书,并和代理服务器建立了加密连接。
  • 代理服务器可以解密你发送的所有数据 ,然后再用真实的 HTTPS 连接把数据转发给 example.com
  • 这样,代理服务器就在中间**“偷看”**了你和目标网站之间的所有加密数据。

简单的类比

  • 你本来要寄一封加密信件给朋友(example.com)。
  • 但是,代理服务器伪造了一个假的朋友身份 ,让你把信寄给它。
  • 代理服务器拆开信封,看完里面的内容,然后再重新封装,寄给真正的朋友。
  • 朋友收到信后,完全不知道中间有人偷偷看过

透明代理 vs. 匿名代理

代理服务器可以根据是否暴露用户真实 IP 来分类:

类型描述是否隐藏 IP
透明代理(Transparent Proxy)只是转发请求,不隐藏 IP,目标服务器仍然能看到客户端的真实 IP
匿名代理(Anonymous Proxy)代理服务器会隐藏客户端的 IP,但目标服务器可能知道请求来自代理
高匿名代理(Elite Proxy)代理服务器不仅隐藏 IP,还会让目标服务器认为请求是直接来自真实用户✅✅
应用场景
  • 透明代理 :用于公司/学校内部网络,用户可能不知道自己在使用代理。
  • 匿名代理 :用于隐藏用户身份,如浏览受限网站。
  • 高匿名代理 :用于规避封锁,如 Tor 网络的出口节点。

为什么普通代理无法直接读取 HTTPS 数据?

假设你访问的是 HTTP 网站(比如 http://example.com):

  • 代理服务器可以直接看到 所有的请求内容,比如:
  • 你访问了哪个网页?
  • 你提交了什么表单?
  • 你下载了什么文件? 但如果你访问的是 HTTPS 网站(比如 https://example.com),情况就不同了:
  • HTTPS 数据是加密的 ,所以代理服务器 看不到你发送的具体内容 ,只能看到:
  • 你访问了哪个网站(example.com
  • 但看不到你访问的具体页面或数据 这就好比:
  • HTTP 是一个透明的信封 ,代理服务器可以看到里面的信件内容。
  • HTTPS 是一个密封的信封 ,代理服务器只能看到信封的外观(目的地),但看不到里面的内容。