您现在的位置是:首页 >其他 >Unity + PHP + MySQL连接技术简介网站首页其他

Unity + PHP + MySQL连接技术简介

深海流 2024-06-17 10:24:24
简介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进行服务。

以上就是整篇文章内容了,介绍的都是基础的案例应用,里面不涉及复杂的技术实现。由于作者也是在学习和探索的阶段,如果文章内容有什么缺陷和错误的地方,也欢迎大家指出、讨论。谢谢。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。