您现在的位置是:首页 >其他 >Unity + PHP + MySQL连接技术简介网站首页其他
Unity + PHP + MySQL连接技术简介
之前答应网友说出一期Unity通过PHP连接MySQL的讲解,一直搁在计划里。最近专门就这事再看了一下之前的工程,有些生疏了,但整体思路还是清晰的。这篇博文就仅提供一个基础的连接方案,供大家参考Unity如何通过PHP连接MySQL。
1.Unity + PHP + MySQL技术路线
其实这个技术路线很简单,如图所示,就是Unity作为数据的用户端,PHP作为数据的请求和处理端,具体对数据库数据的请求(增删改查验证......),是由PHP+MySQL完成的。PHP是一种在服务器端运行的脚本语音,可直接嵌入到Web网页之中,所以Unity和PHP之间的通讯,可以理解为Unity和Web网页的通讯, 直接通过POST和GET去发送/获取信息即可(确定网址、具体脚本位置,直接post/get)。
在这里,可能疑问比较多的是,Unity如何去和Web进行post/get,使用WWW类就行,新版的Unity大家也可以尝试一下使用UnityWebRequest类(这个我没使用过),WWW就是post一个请求,get一个值返回到Unity。具体代码我会在后续展示。
2.具体的工程实现
这里带大家来完成一个Unity + PHP + MySQL的基础工程,要实现这个工程,建议掌握C#、PHP、MySQL三种语言的基础,掌握基础的Web网页部署和PHP在网页中的嵌入使用,才好更快的上手。
2.1PHP和MySQL之间的连接
因为PHP需要嵌入网页使用,所以这一步,咱们可以提前在Unity中新建一个WebGL工程,在工程中新建StreamingAssets文件夹用于放置PHP脚本,确保打包后PHP脚本可以不被压缩。也可以放置在单独的网站文件目录下。后续需要将含该脚本的网站在服务器端部署启动,才可运行提供服务。
具体的PHP脚本,和C#连接数据库的代码一致,只是在一些字符上具有个性化的差异。PHP的基础格式是<?php 代码块 ?>,可以直接在HTML中嵌入,这里不作过多介绍,自行去了解学习。
我这里把PHP连接MySQL的脚本分成了两部分,第一部分是公共方法脚本,是用于设置数据库参数、连接、断开数据库等公共方法。第二部分是连接脚本,用于获取Unity端POST过来的参数,并基于参数,断/连、操作数据库等。
PHP连接数据库的公共方法脚本
<?php
/**
* 数据库的基本操作
*/
class dbconfig
{
// 数据库的默认连接参数
private $dbConfig=[
'db'=>'mysql', // 数据库类型
'host'=>'localhost', // 主机名称
'port'=>'3306', // 默认端口
'user'=>'root', // 用户名
'pass'=>'admin', // 密码
'charset'=>'utf8', // 默认字符集
'dbname'=>'gamedb', // 默认数据库
];
// 新增主键id
public $insertId = null;
// 受影响的记录
public $num = 0;
// 单例模式,本类的实例
private static $instance = null;
// 数据库的连接
private $conn = null;
/**
* Db构造方法
* 私有化以防止外部实例化
*/
private function __construct($params=[])
{
// 初始化连接参数
$this->dbConfig = array_merge($this->dbConfig,$params);
// 连接数据库
$this->connect();
}
/**
* 禁止外部克隆该实例
*/
private function __clone()
{
// TODO:Implement __clone() method.
}
/**
* 获取当前类的单一实例
*/
public static function getInstance($params=[])
{
if (!self::$instance instanceof self) {
self::$instance = new self($params);
}
return self::$instance;
}
private function connect()
{
try{
// 配置数据源DSN
$dsn = "{$this->dbConfig['db']}:host={$this->dbConfig['host']};port={$this->dbConfig['port']};dbname={$this->dbConfig['dbname']};charset={$this->dbConfig['charset']}";
// 创建PDO对象
$this->conn = new PDO($dsn,$this->dbConfig['user'],$this->dbConfig['pass']);
// 设置客户端字符集
$this->conn->query("SET NAMES {$this->dbConfig['charset']}");
}catch (PDOException $e){
die('数据库连接失败'.$e->getMessage());
}
}
/**
* 完成数据表的操作:CURD
*/
public function exec($sql)
{
$num = $this->conn->exec($sql);
// 如果有受影响的记录
if($num > 0){
// 如果是新增操作,初始化新增主键id属性
if(null !==$this->conn->lastInsertId()){
$this->insertId = $this->conn->lastInsertId();
}
$this->num = $num; // 返回受影响的记录
}else{
$error = $this->conn->errorInfo(); // 获取最后操作错误信息的数组
var_dump($error);
}
}
// 获取单条查询结果
public function fetch($sql)
{
return $this->conn->query($sql)->fetch(PDO::FETCH_ASSOC);
}
// 获取多条查询结果
public function fetchAll($sql)
{
return $this->conn->query($sql)->fetchAll(PDO::FETCH_ASSOC);
}
}
?>
PHP与Unity之间的数据交互脚本
这个脚本是写的一个 登录账户验证功能脚本,这脚本引用了前一个脚本,通过收到的POST(Unity上传)数据,查询数据库是否存在该账户(实例化引用脚本,调用实例化对象函数去实现),并输出反馈。
<?php
/*
*dbconfig类测试
*/
require 'dbconfig.php';
//获取dbconfig类实例
$db = dbconfig::getInstance();
$row = 0;
//查询单条操作
/* $sql = "SELECT userid FROM tb1 WHERE userid = '100001'";
$row = $db->fetch($sql);
var_dump($row); */
//print_r($_POST);
if(isset($_POST['userId'])&&isset($_POST['password']))
{
$sql = "select userid , password from tb1 where userid = '".$_POST['userId']."'";
if(($row = $db->fetch($sql)) > 0)
{
if($_POST['password'] == $row['password'])
{
echo "登陆成功";
return true;
}
else
{
echo "登陆失败:密码错误";
return false;
}
}
else
{
echo "登录失败...";
}
}
?>
以上两个脚本,放置在网站文件目录下,并在服务器端,部署网站启动服务,即可。
2.2 Unity和PHP之间的连接
Unity和PHP之间连接的实质,就是C#脚本对Web端PHP脚本的数据请求,很简单,使用一个WWW类函数即可实现。在Unity端的C#脚本里,需要我们提前把连接数据库的参数、POST数据的地址(PHP脚本位置)、需要POST的数据等基础信息提前设置好,通过WWW将信息传递给PHP脚本即可。
我再Unity端写了一个简单的登录界面
具体Unity端C#代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
//using UnityEngine.Networking;
using System;
using Commons;
public class login : MonoBehaviour
{
#region 字段
public InputField userIdField;
public InputField passwordField;
public Text statusText;
private string userId = "";
private string password = "";
private string url = "http://localhost:8083/WWW/login.php";
private string reMsg = "";
public string ReMsg { get { return reMsg; } set { reMsg = value; } }
#endregion
#region 方法
public void OnLogin()
{
userId = userIdField.text;
password = passwordField.text;
if(userId.isEmpty() || password.isEmpty())
{
statusText.text = "账户密码不能为空";
return;
}
StartCoroutine(logining());
}
private IEnumerator logining()
{
WWWForm from = new WWWForm();
from.AddField("userId",userId);
from.AddField("password",password);
WWW www = new WWW(url, from);
//UnityWebRequest www = UnityWebRequest.Post(url,from);
yield return www;
if(www.error != null)
{
print("error is login:" + www.error);
statusText.text = "error is login:" + www.error + "...";
}
else
{
print(www.text);
statusText.text = ReMsg = www.text;
}
}
#endregion
}
到此,整个工程的内容完毕,Unity + PHP + MySQL的连接就这么简单,但是由于一下子跨了Unity、前端、PHP、MySQL等多个领域知识,所以让大家感觉这个东西的实现比较复杂。的确,这种耦合性质的需求实现,就是需要多技术的灵活运用。后面再介绍一下这个案例运行测试需要注意的点。
3. 该案例运行需要注意的点
这个案例,其实就是将数据库的操作全交给PHP来实现,Unity和PHP之间只是一个数据的请求服务。所以要运行这个案例,PHP端必须在服务器端启动服务。前面提到,需要将PHP脚本放置在网页项目中,在服务器端部署网页。
服务器端部署网页是一个很简单的事,以微软IIS服务器部署为例,Unity生成WebGL打包文档后,我们在计算机中找到IIS服务器,没有的需要自行添加该服务。
选择网站,右键添加网站,这时会弹出来具体的网站设置界面。
设置好后,启动网站服务,PHP脚本即被运行,这时候在Unity端,再去运行测试,才能访问到PHP并通过其去操作数据库。
上述描述的是Unity和web分离,或者Unity编辑器中测试功能的情况。如果你得Unity项目是WebGL项目,那可以把PHP脚本放在之前说的本工程StreamingAssets文件夹下,等项目打包后部署服务器,即可直接访问PHP进行服务。
以上就是整篇文章内容了,介绍的都是基础的案例应用,里面不涉及复杂的技术实现。由于作者也是在学习和探索的阶段,如果文章内容有什么缺陷和错误的地方,也欢迎大家指出、讨论。谢谢。