Unity+PHP 互动多媒体项目的 二维码验证 模块实现

场景: 这个模块的用处就是让拥有二维码的人才能玩你的游戏,某些客户很喜欢这个东西

思路: (每隔一秒)检索你的摄像头识别二维码,如果识别到二维码的信息,上传到服务器,服务器接收到数据,跟数据库的信息进行比对,如果存在,告诉Unity并在数据库中删除该条信息

PHP服务器:

1. 将Excel数据导入 php 数据库 

安装数据库管理工具

3.新建一个表,字段和你的Excel定义一样的字段 (小提示:如果要清空删除表数据 点击任务栏操作按钮,在操作界面最下面)

php mysql不能直接识别Excel .xlsl格式文件 ,所以需要将你的Excel文件转成 .csv格式的文件,

4.在你的 WWW文件夹定一个UTF-8格式 的Login.php文件

<?php
header("Content-Type:text/html;charset=utf8"); //字符集,防止中文页面乱码

 //$url = "https://www.shengyinyouju.cn/cqVaWlETXjhY="; //数据库查询字符
// Unity 使用 POST 的方式传输数据
$url= $_POST["url"]; //数据库查询字符

$dbhost = 'localhost:3306';  // mysql服务器主机地址
$dbuser = 'root';            // mysql用户名
$dbpass = '123456';          // mysql用户名密码
$table = 'test';
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
	die('连接失败: ' . mysqli_error($conn));
}
// 设置编码,防止中文乱码
// mysqli_query($conn , "set names utf8");

// 数据库的表
mysqli_select_db( $conn, $table );

// sql 查询语句
$sql = "SELECT * FROM $table where url='{$url}' ";

$sqlDelete = "DELETE FROM $table where url='{$url}' ";

// sql 执行语句
$retval = mysqli_query( $conn, $sql );
if(!$retval )
{
	die('无法读取数据: ' . mysqli_error($conn));
}

$row = mysqli_fetch_array($retval);
if($row>0){
	// echo "读取到了数据";
	// echo "{$row[0]} ";
	// echo "{$row["id"]} ";
	echo "1";
	mysqli_query( $conn, $sqlDelete );

}else{
	echo "0";
}


mysqli_close($conn);

?>

Unity 客户端:

摄像头实时识别二维码信息,使用zxing.unity.dll

上传数据使用UnityWebRequest Post

服务器地址改成自己的,代码我是直接从自己项目里摘的,你们自己copy方法就行

/****************************************************************************
 * 2021.3 DESKTOP-J98GMVJ
 ****************************************************************************/

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using QFramework;
using ZXing;
using System.Collections;
using UnityEngine.Networking;

namespace QFramework.Example
{
    public partial class LoginCamRaw : UIComponent
    {

        //摄像头实时显示的画面
        private WebCamTexture m_webCameraTexture;
        //申请一个读取二维码的变量
        private BarcodeReader m_barcodeRender = new BarcodeReader();

        //多久检索一次二维码
        private float m_delayTime = 1f;

        public RawImage m_cameraTexture;

        private void Awake()
        {
        }

        IEnumerator Start()
        {
            //yield return new WaitForSeconds(1f);
            yield return new WaitForEndOfFrame();
            //调用摄像头并将画面显示在屏幕RawImage上
            WebCamDevice[] tDevices = WebCamTexture.devices; //获取所有摄像头
            string tDeviceName = tDevices[0].name; //获取第一个摄像头,用第一个摄像头的画面生成图片信息
            m_webCameraTexture = new WebCamTexture(tDeviceName, 1920, 1080); //名字,宽,高
            if (m_cameraTexture == null) m_cameraTexture = GetComponent<RawImage>();
            m_cameraTexture.texture = m_webCameraTexture; //赋值图片信息
            m_webCameraTexture.Play(); //开始实时显示
            InvokeRepeating("CheckQRCode", 0, m_delayTime);
        }

        /// <summary>
        /// 检索二维码方法
        /// </summary>
        void CheckQRCode()
        {
            //存储摄像头画面信息贴图转换的颜色数组
            Color32[] m_colorData = m_webCameraTexture.GetPixels32();

            //将画面中的二维码信息检索出来
            var tResult = m_barcodeRender.Decode(m_colorData, m_webCameraTexture.width, m_webCameraTexture.height);

            if (tResult != null)
            {
                Debug.Log(tResult.Text);

                // 发送到服务器进行比对
                PostToServer(tResult.Text);
            }
        }

        // 你的服务器
        public string m_sServerAddress => "http://xxx.xxx.xxx.xxx/php/Login.php";
        public string m_sPostMsg => "https://www.shengyinyouju.cn/cBBQE6uuDk4g=";
     

        // 外部调用 post 到服务器方法
        public void PostToServer(string m_sPostMsg)
        {
            StartCoroutine(Post(m_sPostMsg));
        }

        IEnumerator Post(string m_sPostMsg)
        {
            WWWForm form = new WWWForm();
            //键值对
            form.AddField("url", m_sPostMsg);

            UnityWebRequest webRequest = UnityWebRequest.Post(m_sServerAddress, form);

            yield return webRequest.SendWebRequest();
            //异常处理,很多博文用了error!=null这是错误的,请看下文其他属性部分
            if (webRequest.isHttpError || webRequest.isNetworkError)
                Debug.Log(webRequest.error);
            else
            {
                Debug.Log(webRequest.downloadHandler.text);
                if(webRequest.downloadHandler.text == "1")
                {
                     Debug.Log("二维码识别验证成功!");

                    // 识别到正确的二维码 打开开始界面
                    UIKit.ClosePanel<UIQRCodeLoginPanel>();
                    UIKit.OpenPanel<UIStartPanel>();
                }
            }
        }


        protected override void OnBeforeDestroy()
        {
            StopAllCoroutines();
            CancelInvoke();
            if (m_webCameraTexture.isPlaying)
            {
                //Debug.LogError("关闭摄像头!");
                m_webCameraTexture.Stop();
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39097425/article/details/114321731