这个模块的用处就是让拥有二维码的人才能玩你的游戏,某些客户很喜欢这个东西
思路: (每隔一秒)检索你的摄像头识别二维码,如果识别到二维码的信息,上传到服务器,服务器接收到数据,跟数据库的信息进行比对,如果存在,告诉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();
}
}
}
}