可能会出现到后面没有教程可以看,走不动,,但还是尝试吧
过程远比想象的要多
那连Live2d的这些脚本怎么控制的都要了解一下
------------


文件类型和扩展名 | 编辑手册 | Live2D Manuals & Tutorials

全部导入之后

在这下载SDK
Live2D Cubism SDK とは | Live2D Cubism
将 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 模型。
 

Live2D示例数据集 (可免费下载) | Live2D Cubism
那意思是说还有一个“SDK”

-----------
-  
数据保护:
UnityWebRequest封装了底层网络通信的细节,开发者不需要直接操作字节流或套接字。 -  
简化开发:通过
uploadHandler和downloadHandler,开发者可以更方便地设置请求体和处理响应。 -  
跨平台支持:
UnityWebRequest在 Unity 支持的各个平台(如 Windows、macOS、Android、iOS 等)上都能正常工作。 
UnityWebRequest 并不是直接发送给服务器的数据,而是一个包装器,它包含了以下核心组件:
-  
uploadHandler:用于设置请求体(即发送给服务器的数据)。 -  
downloadHandler:用于接收服务器返回的响应数据。 -  
SetRequestHeader:用于设置请求头。 -  
SendWebRequest:用于发送请求并等待响应。 
服务器最终接收的是 UnityWebRequest 中封装的数据(如请求体、请求头等),而不是 UnityWebRequest 类本身。
UnityWebRequest 类在 Unity 中是一个封装了 HTTP 请求和响应的工具类,它的主要作用是对底层网络通信的抽象和封装,使得开发者可以更方便地发送 HTTP 请求和处理响应。

请求体:这里是要发送的内容,实际发给服务端的是Request,Request里装的内容,类型需要是byte数组(
所以后面有

)
这里是按照服务端的要求格式,定义了可以传的匿名类
里面的数据 按服务器格式来写
-  
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:系统的唯一标识符。 

装上了插件后,把这个脚本挂到游戏物体上,成功返回了结果打印
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using Newtonsoft.Json;
using System.Text;
public class DeepSeekAPI : MonoBehaviour
{
    // DeepSeek API 的 URL
    private string url = "https://api.deepseek.com/chat/completions";
    // 你的 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。
步骤:
-  
下载
Newtonsoft.Json.dll:-  
访问 Newtonsoft.Json NuGet 页面。
 -  
下载最新版本的
.nupkg文件(例如Newtonsoft.Json.13.0.3.nupkg)。 -  
将
.nupkg文件后缀改为.zip,然后解压缩。 -  
在解压后的文件夹中找到
lib/netstandard2.0/Newtonsoft.Json.dll。 
 -  
 -  
将 DLL 文件导入 Unity:
-  
在 Unity 项目中,创建一个
Plugins文件夹(如果不存在)。 -  
将
Newtonsoft.Json.dll文件拖入Plugins文件夹中。 
 -  
 
----------
API Key 安全性:
不要在代码中硬编码 API Key,建议使用 Unity 的 PlayerPrefs 或从外部配置文件加载。
------------------
curl 是一个命令行工具,用于通过多种协议(如 HTTP、HTTPS、FTP 等)传输数据。它常用于发送 HTTP 请求并获取响应。
基本用法
GET 请求:默认情况下,curl 发送 GET 请求。
curl https://example.com
POST 请求:使用 -X POST 选项发送 POST 请求,并通过 -d 传递数据。
curl -X POST -d "param1=value1¶m2=value2" https://example.com
设置请求头:使用 -H 选项添加请求头。
curl -H "Content-Type: application/json" https://example.com



用终端进行命令传输也可以,这个接口的服务请求


什么是API?DeepSeek技巧升级2.0~_哔哩哔哩_bilibili

接口

首次调用 API | DeepSeek API Docs
看国外的还是门槛太高了,又是政策限制,又是语言的描述,还有版本问题,,讨论的圈子小,,这哪顶得住
还是老实先拿deepseek实验一下吧
AICommand的Unity版本问题
解决方法,把报错的Post方法
换成
    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的
UnityWebRequestAPI设计较早,功能较为基础,没有考虑到复杂的POST请求场景。 -  
灵活性:手动设置请求体和请求头虽然繁琐,但也提供了更大的灵活性,可以适应各种自定义需求。
 -  
改进:Unity 2022对API进行了优化,使其更符合现代开发需求,减少了开发者的工作量。
 
请求体和请求头的设置差异
Unity 2021
在Unity 2021中,如果你需要发送JSON数据,必须手动完成以下步骤:
-  
创建
UnityWebRequest对象:using var post = new UnityWebRequest(url, "POST"); -  
设置请求体:
-  
将JSON字符串转换为字节数组。
 -  
使用
UploadHandlerRaw将字节数组设置为请求体。 
var bodyRaw = System.Text.Encoding.UTF8.GetBytes(jsonData); post.uploadHandler = new UploadHandlerRaw(bodyRaw); -  
 -  
设置请求头:
-  
手动设置
Content-Type为application/json。 -  
手动设置
Authorization头(如果需要)。 
post.SetRequestHeader("Content-Type", "application/json"); post.SetRequestHeader("Authorization", "Bearer " + apiKey); -  
 -  
设置下载处理器:
post.downloadHandler = new DownloadHandlerBuffer(); 
Unity 2022
在Unity 2022中,这些步骤被大大简化:
-  
直接使用
UnityWebRequest.Post:using var post = UnityWebRequest.Post(url, jsonData, "application/json");
 -  
设置请求头(如果需要):
post.SetRequestHeader("Authorization", "Bearer " + apiKey); -  
不需要手动设置
UploadHandlerRaw和DownloadHandlerBuffer,因为这些已经由UnityWebRequest.Post内部处理。 
因为Unity2022版本,UnityWebReqeust更新了方法,

在23年的版本,这里还可以写别的类型的

Toolbox的Project Setting

网络知识
怎么防止 MITM 攻击?
如果你不想让自己的 HTTPS 连接被代理服务器劫持,可以采取以下措施:
🔹 (1) 检查网站证书
- 当你访问 
https://example.com时,点击浏览器的“锁”图标,检查证书是否是官方颁发的。 - 如果证书是未知机构颁发的,说明可能存在 MITM 代理!
 
🔹 (2) 启用 HSTS(HTTP 严格传输安全)
- HSTS 让网站强制使用 HTTPS,并防止客户端接受伪造的证书。
 
🔹 (3) 使用 VPN
- VPN 加密了你和 VPN 服务器之间的所有通信,即使有人在网络上使用 MITM 代理,也看不到你的实际数据。
 
合法用途
-  
公司网络监控
- 公司可以在员工的电脑上安装“受信任的”证书,让员工的所有 HTTPS 访问都经过 MITM 代理。
 - 这样,公司可以监控员工访问的网站内容(比如是否在上班时间刷 YouTube)。
 
 -  
安全测试
- 安全研究人员可以用 MITM 代理检查网络通信,看看应用程序是否安全(比如某个APP是否会偷偷上传你的数据)。
 
 
非法用途
-  
黑客攻击
- 恶意 WiFi 热点可能会使用 MITM 代理,拦截你登录银行、社交媒体时的加密数据,盗取密码。
 
 -  
政府审查
- 一些国家可能会使用 MITM 代理来监视公民的网络活动,即使使用了 HTTPS 也无法完全保护隐私。
 
 
中间人代理(MITM Proxy)是怎么破解 HTTPS 的?
因为 HTTPS 是加密的,代理服务器默认无法读取数据。但是,中间人代理(MITM Proxy) 采用了一种特殊的“欺骗”手法,绕过了这个限制。
MITM 代理如何破解 HTTPS?
-  
伪造一个假的 HTTPS 证书
- 代理服务器自己创建一个“假的”SSL证书,冒充你访问的网站(如 
example.com)。 - 你的电脑本来应该直接和 
example.com建立加密连接,但现在会误以为代理服务器就是example.com。 
 - 代理服务器自己创建一个“假的”SSL证书,冒充你访问的网站(如 
 -  
代理服务器建立两条连接
- 第一条连接:你的电脑 → 代理服务器(这个连接使用伪造的 HTTPS 证书)
 - 第二条连接:代理服务器 → 目标网站(真实的 
example.com) 
 -  
代理服务器解密你的数据
- 你的浏览器“信任”了伪造的证书,并和代理服务器建立了加密连接。
 - 代理服务器可以解密你发送的所有数据,然后再用真实的 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 是一个密封的信封,代理服务器只能看到信封的外观(目的地),但看不到里面的内容。
 



















