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();
            }
        }
    }
}

 

 

 

 

原文地址:https://blog.csdn.net/qq_39097425/article/details/114321731

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍了Unity游戏开发中外观模式是什么意思,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章主要介绍Unity中地面检测方案的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.普通射线在角色坐标(一般是脚底)...
这篇文章主要介绍了Unity游戏开发中如何消除不想要的黄色警告,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带...
这篇文章主要介绍了Unity中有多少种渲染队列,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解
这篇文章主要介绍Unity中如何实现Texture,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!了解Texture2D 如上图,Texture2D是一张
小编给大家分享一下Unity中DOTS要实现的特点有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让...
这篇文章给大家分享的是有关unity中如何实现UGUI遮罩流光特效的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。下面是核心shader:Sh...
这篇文章主要为大家展示了“Unity中如何实现3D坐标转换UGUI坐标”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下...
这篇文章主要介绍了Unity游戏开发中设计模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章主要介绍了Unity中如何实现仿真丝袜渲染,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了...
这篇文章给大家分享的是有关Unity插件OVRLipSync有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。项目需要接入对话口型动...
这篇文章主要介绍了Unity性能优化之DrawCall的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章给大家分享的是有关Unity给力插件之Final IK怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。这插件有什么用:一般游...
这篇文章给大家分享的是有关Unity中如何内嵌网页插件UniWebView的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、常见Unity中内...
小编给大家分享一下Unity如何做流体物理的几个轮子,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让...
小编给大家分享一下Unity中Lod和Occlusion Culling的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收...
这篇文章将为大家详细讲解有关Unity中LineRenderer与TrailRenderer有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获...
这篇文章主要介绍了Unity中coroutine问题的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起...
这篇文章将为大家详细讲解有关unity中spine怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。骨骼动画首先我们来看到...
这篇文章主要为大家展示了“Unity Shader后处理中如何实现简单均值模糊”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学...