【Unity 导出 WebGL 通过Linux宝塔的 Nginx 连接数据库】使用 UnityWebRequest 与 WebAPI (php服务) 执行mysql命令

【Unity 导出 WebGL 通过Linux宝塔的 Nginx 连接数据库】使用 UnityWebRequest 与 WebAPI {php服务} 执行mysql命令

  • 前言
  • 方案一,MySql.Data.MySqlClient
    • 前置准备
    • 数据库部分
    • 代码部分
    • 结论
  • 方案二:创建中间php服务,通过UnityWebRequest调用,来执行mysql命令
    • php 编写
    • php 部署
    • C# 代码编写
    • A Native Collection has not been disposed, resulting in a memory leak.
  • 其他我还遇到的一些问题

前言

  • 做项目,需要 Unity 导出的 WebGL 项目能进行与数据库交互,这里指能实现 insert 命令即成功
    项目已经成功部署在 腾讯云服务器下,通过 Linux 宝塔的 Nginx 部署。
  • 于是通过 chatGPT 紧急学习了其他相关技术,来实现与数据库交互的功能。

方案一,MySql.Data.MySqlClient

前置准备

  • 第一种方案比较简单,在 C# 代码直接导入
using System.Data;
using MySql.Data.MySqlClient;

第一个头文件在比较新的Unity Editor版本可自动直接导入,否则需要到具体的编辑器的路径处查找
编辑器的路径可以在UnityHub直接打开
在这里插入图片描述
在这里插入图片描述

  • 头文件,需要在 Plugins 文件夹放置如下 DLL 文件
MySql.Data.dll
I18N.CJK.dll
I18N.dll
I18N.West.dll

其中 MySql.Data.dll 在 这里下载,这里选择第三个版本下载才成功。
后面的四个文件一般在这些目录中:
在这里插入图片描述

  • 然后,上述dll放入该文件夹下。常识性操作。
    在这里插入图片描述

数据库部分

  • Linux 宝塔的该位置添加数据库
    注意编码的区别
    utf8mb4utf8 的基础上支持 most bytes 4,即那些emoji的编码
    utf8 支持全国各种字符,包括中文
    gbk 更加支持中文编码,其中 gbk2312 只支持中文
    注意我们这里选择 utf8 否则后续会需要调整编码,比较麻烦。
  • 记住这里的数据库名,用户名和密码。注意该账号和 root 账号密码之间是不同的。
    在这里插入图片描述
  • 然后在 Navicat 处,连接该数据库,并创建自己需要的表格。
    可能第一次创建时连接失败或者其他别的什么问题,需要下面修改一下:
    修改访问权限
    在这里插入图片描述
    数据库定时备份
    在这里插入图片描述
    放行端口:默认数据库使用 3306 号端口。需要在 Linux 宝塔以及腾讯云服务器处放行。
    在这里插入图片描述
  • 端口号在这里查看。
    在这里插入图片描述

代码部分

  • 代码部分很简单。引入必要的头文件后,在某个类中声明一个 MySqlConnection 连接变量,然后调用 ConnectSQL() 代码,给定数据库名,端口号,用户名和密码然后连接。
    QuerySet() 代码调用,执行 sqlString 命令
	using System.Data;using MySql.Data.MySqlClient;public static string dbName = "XXdb";public static string tableName = "XXT";public static string host = "IP";public static string uname = "aniDB";public static string psw = "your password";public static string port = "your port";private static MySqlConnection con;public void ConnectSQL()	// 直接复制粘贴使用即可{try{string mySqlString = string.Format("Database={0};Data Source={1};User Id={2};Password={3};port={4}", dbName, host, uname, psw, port);con = new MySqlConnection(mySqlString);con.Open();}catch (Exception e){throw new Exception("服务器连接失败,请重新检查MySql服务是否打开。" + e.Message.ToString());}}public void CloseSql()	// 直接复制粘贴使用即可{if (con != null){con.Close();con.Dispose();con = null;}}public void RawQuery(int stage, int val)	// 为一个具体的插入例子{DateTime dateTime = DateTime.Now;string sqlstr = string.Format("INSERT INTO {0} VALUES('{1}',{2},'{3}','{4}','{5}',{6},'{7}') ", tableName, id, stage, user_name, college_name, tel, val, dateTime);QuerySet(sqlstr);}private DataSet QuerySet(string sqlString)	// 直接复制粘贴使用即可{if (con.State == ConnectionState.Open){DataSet ds = new DataSet();try{MySqlDataAdapter mySqlAdapter = new MySqlDataAdapter(sqlString, con);mySqlAdapter.Fill(ds);}catch (Exception e){throw new Exception("SQL:" + sqlString + "/n" + e.Message.ToString());}finally{}return ds;}return null;}

结论

  • 本地调用成功,数据库内数据成功插入
    WebGL 项目中,数据库内数据插入失败
    原因:unity在webgl的平台下无法支持直连MySql
    在这里插入图片描述

方案二:创建中间php服务,通过UnityWebRequest调用,来执行mysql命令

  • 哈哈,好绕,但是是 chatGPT 在我最无助的时候提供的一个看似可行的方案。
    但我之前也没学过这俩玩意儿啊
    没事,一步一步来

php 编写

  • 通过 chatGPT 的引导,拥有了这么一份 index.php 文件
<?php$servername = "your IP";
$username = "your user name";
$password = "your password";
$dbname = "your db name";// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);// 检查连接是否成功
if ($conn->connect_error) {die("连接失败: " . $conn->connect_error);
}// 从HTTP请求中读取JSON数据
$json_data = file_get_contents('php://input');// 将JSON数据解码为PHP数组
$data = json_decode($json_data, true);// 插入数据到数据库表格
$sql = "INSERT INTO aniT VALUES ('".$data['id']."', '".$data['stage']."','".$data['college']."','".$data['tel']."','".$data['value']."','".$data['time']."')";
if ($conn->query($sql) === TRUE) {echo "插入成功";
} else {echo "Error: " . $sql . "<br>" . $conn->error;
}// 关闭连接
$conn->close();
?>
  • 上述代码通过 httpRequest 传入json数据,然后转成 $data php数组,然后组合成 $sql mysql语句(一个字符串),最后执行。
    在这里插入图片描述
  • 第一次测试,可能对于大量代码测试比较麻烦,建议第一次使用下述代码进行测试
<?php
phpinfo();
?>

php 部署

  • 部署真是头疼。
    首先确保你的 Linux 宝塔下载了该 PHP,这个 5.X 的版本其实也能用。
    在这里插入图片描述
  • 打开配置文件,我们目前只需要关注 FPM配置文件
    查看 listen = XXXX注意这里监听的不是端口而是一个 sock复制该sock
    在这里插入图片描述
  • 打开 Nginx 配置文件,选择配置修改,往下翻到 server 这一块
    前面我们了解了 location 对于 html 的基本配置,也让我们成功打开了 WebGL 项目
    这里我们需要部署 php 文件,又大相径庭了…
    在这里插入图片描述
  • 之前没有配置过的话,需要新加入这一段
    fastcgi_pass 后面填写 unix: 再加刚刚的监听sock
    其他的照抄
    ,不然我就是打不开…
        location ~ \.php$ {fastcgi_pass   unix:/tmp/php-cgi-56.sock;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME     $document_root$fastcgi_script_name;include        fastcgi_params;}
  • 然后我把 index.php 传到了 root 目录,即 /www/wwwroot 目录下。
    通过 ip/index.php 可以尝试访问是否成功。
    我遇到了如下的问题。
    情况1:502 BadGate 估计是端口号没有放行,没有权限访问。
    情况2:404 :超链接 direct 失败,一般是你文件放错目录,或目录配置错误,或二级目录输入错了
    情况3:file not found 文件放错目录,或目录配置错误
    情况4:403 forbidden 貌似是权限问题
    在这里插入图片描述

(注:该php部署后打开就是类似一个网页,虽然它被叫做WebAPI,提供了其他的服务)
(但它貌似不是一个完整的WebAPI项目)

  • 一般多次尝试,对配置文件了解一下,就可以访问成功了。

C# 代码编写

  • 到这里我们再返回 Unity,在脚本中编写一些代码
    我们需要使用 UnityWebRequest 来访问上述的 php 服务。
    首先需要导入新的头文件 using UnityEngine.Networking;
    代码部分如下:
    public void RawQuery(int stage, int val)	// 一个测试函数{StartCoroutine(Insert(url, id, stage, college_name, tel, val, DateTime.Now));}// 具体的插入myqsl命令的函数IEnumerator Insert(string url, string id, int stage, string college, string tel, int value, DateTime time){// 创建JSON数据string json = "{\"id\":\"" + id + "\",\"stage\":" + stage + ",\"college\":\"" + college + "\",\"tel\":\"" + tel + "\",\"value\":" + value + ",\"time\":\"" + time.ToString("yyyy-MM-dd HH:mm:ss") + "\"}";// Debug.Log(json);UnityWebRequest request = UnityWebRequest.Post(url, json);// 创建HTTP请求byte[] bodyRaw = Encoding.UTF8.GetBytes(json);request.uploadHandler = new UploadHandlerRaw(bodyRaw);request.downloadHandler = new DownloadHandlerBuffer();request.SetRequestHeader("Content-Type", "application/json");// 发送HTTP请求yield return request.SendWebRequest();if (request.result == UnityWebRequest.Result.Success){Debug.Log("Request successful!");}else{Debug.Log("Request failed!");}request.Dispose();}
  • 那么问题又来了
    疑惑一:WebGL 不是不支持 IEnumerator 吗?这里为什么可以用?
    在这里插入图片描述
    (你小子,肝反复横跳是吧!)
    好吧,经过我的思考,我得出了如下结论:
    虽然 WebGL 不支持 IEnumerator (大众风评,以及chatGPT的回复)
    虽然 WebGL 支持 UnityWebRequest (这点在unity官方文档中也有提出)
    但是 UnityWebRequest 支持 IEnumerator (WTF?)
    好吧,代码和我有一个能跑就行。
  • 疑惑二:那个 string json 的怪异格式
    就是单纯变成了一个字符串存储的json,unity把该字符串json传到php中再后续的解析。
    注意:对于varchar格式的数据,需要给引号,这也是常识。格式不对,后面你会遇到爆炸的问题(这里按下不表)。

A Native Collection has not been disposed, resulting in a memory leak.

  • 疑惑三: request.Dispose(); 一开始 chatGPT 没有让我写这句。
    不加的话,你就会在运行阶段遇到(一直遇到)可爱的:
    A Native Collection has not been disposed, resulting in a memory leak. ……
  • 后面没有更多报错信息,需要 packManager 导入一个新的包com.entity 啥的,但是导入后确实可以看到了,发现就是 UnityWebRequest.Post(url, json) 进去后报错了。
    但是之后运行阶段又出了
    RuntimeError: memory access out of bounds - gatsby development extremely slow
    在这里插入图片描述
    查看解决措施,貌似就是删掉没有用的 dll 等文件,就可以解决。所以我又把这个包给删了…
  • 额,那么 A Native Collection has not been disposed, resulting in a memory leak. ……
    的产生原因是什么呢?
    有人提出,各种各样的问题都会导致这个bug
    情况一:UnityWebRequest 使用后没有 Dispose
    情况二:mysql 语句语法错误(也就是我遇到的…)
  • 或者有博客推荐如下格式:
using(UnityWebRequest request = XXX){XXXX;
}

他们说这样退出的时候会自动使用 Dispose 方法,可能也行

其他我还遇到的一些问题

  • 我发现 Unity 导出的 WebGL ,其中 InputField ,移动端点击后居然没有输入的键盘…
    离谱,说好的 WebGL 支持各种设备呢,结果只是名义上支持…
    有说用虚拟键盘的,就是自己敲个代码之类的,居然还有人设置需要花 100R 来下载…
    我这里没办法,只能取消汉字输入,手写了一个点触数字输入的虚拟键盘了,寄。
  • WebGL 不支持移动端的横屏切换,输入键盘,基本的 IEnumerator,一些浏览器打不开,一些浏览器对音频播放不支持……唯一的优势也就是打开连接就能下载游玩吧。
  • 我这里只需要 insert 命令。如果需要 select 命令,就是需要 POST + GET 的,应该是差不多原理的,具体的也可以问问百度和 ChatGPT,使用C#中的 dataSet 类型存储GET来的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/72609.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小白的GPT入门指南 - 技巧篇

前言 要想用好ChatGPT, 还是有一些技巧可以让我们是事半功倍的, 下面就列出常见的一些技巧和工具 翻译 ChatGPT母语是英语, 所以最符合逻辑的自然是英语提问, 当遇到英语能力不足的咱们, 一款优秀的翻译软件就显得格外重要 这里推荐deepl, 翻译会比某道翻译更加精准. Promp…

包学习(一款安卓端小学到高中全部课程精讲APP)

简介 【包学习】是一款拥有小学至高中九个学年的全套学习资料的APP&#xff0c;名校名师重点、难点精讲 软件简单介绍 软件分为首页、必刷课、动态教辅、在学、我的五大模块。 进入软件会让你选择对应的年级&#xff0c;小编这里就以高三年级课程给大家截图演示&#xff0…

学堂在线课程字幕下载

事情起因 学堂在线 工程伦理课程 在线学习,没有课件, 考试的时候可能会不方便,做一解决此类问题 字幕下载 合成为Txt 文件或者word 文件以供学习使用 事情经过 首先想到的是自己写一个爬虫 怕区相应的字幕, 发现是文本形式存储和, 很好做, 但是涉及到登录的cookie信息, 暂时…

课堂派资料PDF文件下载

课堂派资料PDF文件下载 前排提示&#xff0c;本文没有什么技术含量&#xff0c;大佬轻喷 因为暂时要上网课&#xff0c;但是年前走得着急其实是懒 &#xff0c;课本没有带回来&#xff0c;所幸有的老师会发一些课本、习题的PDF到课堂派的“资料”里。但是有的时候会限制不让下…

Python程序开发案例教程PDF,python程序开发案例教程

大家好&#xff0c;本文将围绕Python程序开发案例教程黑马程序员电子版书展开说明&#xff0c;Python程序开发案例教程黑马课后答案是一个很多人都想弄明白的事情&#xff0c;想搞清楚Python程序开发案例教程pdf黑马程序员需要先了解以下几个事情。 1、python软件开发的案例有哪…

文章润色器-文章润色的软件

文章修改润色软件 在如今信息化时代&#xff0c;我们的工作常常涉及到处理或编辑一些文件和文章&#xff0c;其中一项重要的工作是对文章的润色和修改。为了高效地完成这项任务&#xff0c;越来越多的人开始借助文章修改润色软件进行文章修改和润色。本文将介绍一款专业的文章…

[分割一切!] SegmentAnything真的太强了

相信大家最近都听说了Meta开源了一个图像分割模型【SegmentAnything Model】&#xff0c;简称SAM模型&#xff0c;号称分割一切&#xff0c;在短短开源的一周内&#xff0c;截止今天Github已经24k的star了&#xff01; 看了很多推文各种炸裂的词都出来了&#xff0c;最近也是…

chatgpt赋能python:如何升级Python版本

如何升级Python版本 Python一直以来都是开发者们的最爱&#xff0c;在Python开发的过程中&#xff0c;我们难免会遇到需要升级Python版本的情况。本篇文章将向大家介绍如何升级Python版本。 1. 查看当前Python版本 在开始升级之前&#xff0c;我们需要先了解当前所使用的Pyt…

Ranedeer先生:您的个性化AI导师!

前言&#xff1a;17岁的澳大利亚人贾斯汀(Justin)离高中考试只有一周的时间了&#xff0c;不过他对自己的课本毫无兴趣&#xff0c;于是自己动手解决了这个问题。通过一套简单的指令&#xff0c;他要求ChatGPT-4把他需要知道的概念教给他&#xff0c;从而创造了自己的AI私人导师…

【送书福利-第十二期】机工社Python与AI好书来袭!~

大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我&#xff01; 本文目录 一、前言二、书籍介绍1、认识AI…

数据之美----雪球网股票组合分析

简介 因为工作需要&#xff0c;爬了几个大型的网站&#xff0c;练就一身爬取数据和分析数据的功夫。所以&#xff0c;在无聊的时候写了个爬取系统。主要功能是爬取雪球组合的数据&#xff0c;并进行分析&#xff0c;得出一些有价值有潜力的股票代码。实盘到没有测试&#xff0c…

腾讯两大社交巨头败了, 瓦次普才是社交APP的真霸主, 用户比微信多5亿

大家都知道&#xff0c;腾讯公司凭借着QQ和微信&#xff0c;成为了国内社交软件市场当之无愧的霸主。1999年横空出世的QQ&#xff0c;到今天仍保持着不下2亿用户的高活跃度。微信的用户数量更是已经突破了11亿。 微信是国内社交APP的NO.1&#xff0c;那国外呢&#xff1f;对于这…

又一“邪恶版”ChatGPT出现,专为网络犯罪而生

最近&#xff0c;Hackread 分享了一个恶意聊天机器人 WormGPT 的详细信息&#xff0c;该聊天机器人是为帮助网络犯罪分子进行非法活动而创建的。现在&#xff0c;暗网上又出现了一个名为 FraudGPT 的聊天机器人。这是一个基于订阅的人工智能聊天机器人&#xff0c;可以为网络犯…

计算机学科a类排名,中国科学技术大学学科评估排名!附中科大a类学科名单

选择科目 测一测我能上哪些大学 选择科目 领取你的专属报告 > 选择省份 关闭 请选择科目 确定 v> 中国科学技术大学是安徽省一所知名高校&#xff0c;位于安徽省合肥市&#xff0c;是我国著名的“211大学”、“985工程”之一&#xff0c;现已入选“双一流”建设高校。本期…

中科大计算机网络空间安全,2020年中国科学技术大学网络空间安全考研经验分享...

原标题&#xff1a;2020年中国科学技术大学网络空间安全考研经验分享 大家好&#xff0c;我是育明考研小赵老师 关于中国科学技术大学网络空间安全考研信息汇总&#xff0c;请参考 一、院校介绍 中国科学技术大学创建于1958年&#xff0c;是中国科学院所属的一所以理工学科为主…

华中科技大学计算机专业招生人数,华中科技大学各省招生计划:这4省的招生总人数占总计划的一半...

华中科技大学 华中科技大学是教育部直属重点综合性大学&#xff0c;由原华中理工大学、同济医科大学、武汉城市建设学院于2000年5月26日合并成立&#xff0c;学校位列985/211工程和双一流行列&#xff0c;被誉为“新中国高等教育发展的缩影”&#xff0c;综合实力在各大学排行榜…

中科院和中科大计算机考研分数线,中国科学技术大学研究生院,中科大考研复试刷人太狠。...

中科院研究生院与中科大研究生院的比较 中科大——中国科技大学&#xff0c;是一所教育部直属高校&#xff0c;985,211,c9院校之一&#xff0c;在安徽合肥。中科院——中国科学院&#xff0c;总院在北京&#xff0c;上海、新疆、深圳等地设有分院&#xff0c;是与教育。 1、不一…

2023中国科学技术大学计算机考研信息汇总

中国科学技术大学计算机科学与技术学院官网 http://cs.ustc.edu.cn/ 中国科学技术大学软件学院官网 https://sse.ustc.edu.cn/pages/index.php 中国科学技术大学大数据学院官网 http://sds.ustc.edu.cn/ 中国科学技术大学网络空间安全学院官网 http://infosec.ustc.edu.…

南京大学比中科大计算机与科学专业,为什么有些人认为中国科学技术大学比南京大学强?到底谁更厉害?...

原标题&#xff1a;为什么有些人认为中国科学技术大学比南京大学强&#xff1f;到底谁更厉害&#xff1f; 其实两个大学差不多 中科大与南大总体差不多&#xff0c;真要分一个高低&#xff0c;中科大稍强。 一:中科大强在有少年班&#xff0c;二:中科大强在有两座国家实验室&am…