HTTP分数排行榜

HTTP分数排行榜

介绍

Unity中向服务器发送用户名和得分,并存入数据库,再讲数据库中的得分按照降序的方式下载到Unity中。

一、创建数据库

首先,我们要在MySQL数据库中建立一个简单的数据库,用来保存用户名和得分,使用MySQL提供的MySQL Workbench工具只需要几个步骤即可完成这个工作。

  • 1.确定完整安装了MySQL,启动MySQL Workbench(我这里用的8.0+版本),它是一个图形化的数据库工具软件。
  • 2.在菜单栏中点击+号创建一个数据库模型并命名myscoresdb如下图
  • 3.进入如下界面打开刚才创建的数据库模型并找到Tables右键创建一个高分表

二、创建PHP脚本

这里需要创建两个php脚本,一个用来上传用户名和分数,另一个用来下载分数并将其排序发送给Unity。

  • 1.创建UploadScore.php脚本,这里首先需要读入来自Unity的username和score数据,然后打开数据库,最后使用SQL语句将数据插入到数据库中,代码如下:
php 复制代码
<?php 
//UploadScore.php
require_once ("PHPStream.php");

//读入用户名和分数
$webstream=new PHPStream();
$webstream->BeginRead("123456");
$UserID=$webstream->Read('username');       // user name
$hiscore=$webstream->Read('score');         // hi score
$b=$webstream->EndRead();
if ( !$b )
{
    exit("md5 error");
}
//连接数据库
$myData=mysqli_connect("localhost","root","163888");
if (mysqli_connect_errno())
{
    echo mysqli_connect_error();
    return;
}

//校验用户名是否合法(防止SQL注入)
$UserID=mysqli_real_escape_string($myData,$UserID);

//选择数据库
mysqli_query($myData,"set names utf8");
mysqli_select_db($myData,"myscoresdb");

//插入新数据
$sql="insert into hiscores value(NULL,'$UserID','$hiscore')";
mysqli_query($myData,$sql);


//关闭数据库
mysqli_close($myData);

?>
  • 2.创建DownloadScores.php脚本,我们将从数据库中查询分数最高的20个记录,然后在一个循环语句中将用户名和分数发送给Unity,代码如下:
php 复制代码
<?php 
require_once ("PHPStream.php");

//连接数据库
$myData=mysqli_connect("localhost","root","163888");
if (mysqli_connect_errno())
{
    echo mysqli_connect_error();
    return;
}

//选择数据库
mysqli_query($myData,"set name utf8");
mysqli_select_db($myData,"myscoresdb");

//查询得分最高的20个记录
$sql = "SELECT name,score FROM hiscores ORDER by score DESC LIMIT 20";

$result = mysqli_query($myData,$sql) or die("<br>SQL error!<br/>");
$num_results = mysqli_num_rows($result);

//准备发送数据到Unity
$webstream=new PHPStream();
$webstream->BeginWrite(PKEY);

//发送排行榜分数的数量
$webstream->WriteInt($num_results);

for ($i=0;$i<$num_results;$i++)
{
    $row = mysqli_fetch_array($result,MYSQLI_ASSOC);
    
    $data[$i][0]=$row['name'];
    $data[$i][1]=$row['score'];
    
    //发送用户名和得分
    $webstream->WriteString($data[$i][0]);
    $webstream->WriteString($data[$i][1]);
    
    //echo $data[$i][0];
    //echo $data[$i][1];
}

$webstream->EndWrite();

mysqli_free_result($result);

//关闭数据库
mysqli_close($myData);

//发送
echo $webstream->bytes;

?>

三、上传下载分数

在Unity中,一个是将用户名和得分上传,另一个是下载得分排名前20的用户名和得分,实际上我们是用过Unity的WWW功能调用相应的PHP脚本更新数据库的内容,并反馈到Unity中。如下图:

  • 1.创建空物体并命名Score,新创建一个ScoreScript脚本挂在到Score空物体上
  • 2.打开ScoreScript脚本定义属性
csharp 复制代码
  public const string UploadScoreUrl = "http://192.168.1.5:8088/UploadScore.php";

    public const string DownloadScoresUrl = "http://192.168.1.5:8088/DownloadScores.php";

    private string[] m_hiscores;
  • 3.添加UploadScore函数上传分数:
csharp 复制代码
 IEnumerator UploadScore(string name,string score)
    {
        PostStream poststream = new PostStream();

        poststream.BeginWrite(true);
        poststream.Write("username",name);
        poststream.Write("score",score);
        poststream.EndWrite();

        WWW www = new WWW(UploadScoreUrl,poststream.BYTES,poststream.Headers);

        yield return www;

        if (www.error != null)
        {
            Debug.LogError("www.error:" + www.error);
        }
        else
        {
            Debug.LogError("www.text:"+ www.text);
        }
    }
  • 4.添加下载函数:
csharp 复制代码
IEnumerator DownloadScores()
    {
        WWW www = new WWW(DownloadScoresUrl);
        yield return www;
        if (www.error != null)
        {
            Debug.LogError("www.error:" + www.error);
        }
        else
        {
            int count = 0;
            PostStream poststream = new PostStream();
            poststream.BeginRead(www,true);
            poststream.ReadInt(ref count);
            if (count > 0)
            {
                m_hiscores = new string[count];

                //在循环中读入用户名和分数
                for (int i = 0; i < count; i++)
                {
                    string tname = "";
                    string tscore = "";
                    poststream.ReadString(ref tname);
                    poststream.ReadString(ref tscore);

                    m_hiscores[i] = tname + ":" + tscore;
                    Debug.LogError(m_hiscores[i]);
                }
                bool ok = poststream.EndRead();
                if (!ok) Debug.LogError("MD5 error");
                
            }
        }
    }
csharp 复制代码
string userName = "";
    string score = "";
    Vector2 vector2;
    private void OnGUI()
    {
        if (GUI.Button(new Rect(10, 110, 150, 30), "上传"))
        {
            StartCoroutine(UploadScore(userName,score));
            score = "";
            userName = "";
        }
        if (GUI.Button(new Rect(10, 140, 150, 30), "下载"))
        {
            StartCoroutine(DownloadScores());
        }

        //GUI.color = Color.blue;
        GUI.Label(new Rect(10, 10, 100, 50), "用户名:");
        GUI.Label(new Rect(10, 50, 100, 50), "密  码:");

        userName = GUI.TextField(new Rect(80, 10, 100, 30), userName);
        score = GUI.PasswordField(new Rect(80, 50, 100, 30), score,'*');


        //开始滚动视图
        vector2 = GUI.BeginScrollView(new Rect(180, 0, 500, 500), vector2, new Rect(0, 0, 500, 500), true, true);
        if (m_hiscores != null)
        {
            for (int i = 0; i < 20; i++)
            {
                if (i < m_hiscores.Length) GUI.Button(new Rect(0, 25 * i, 500, 20), m_hiscores[i]);
                else GUI.Button(new Rect(0, 25 * i, 500, 20),"");
            }
        }
        GUI.EndScrollView(); 
    }

四、测试

相关推荐
FreeBuf_2 小时前
最新研究揭示云端大语言模型防护机制的成效与缺陷
网络·安全·语言模型
网硕互联的小客服7 小时前
如何利用Elastic Stack(ELK)进行安全日志分析
linux·服务器·网络·安全
Yungoal7 小时前
php & apache构建 Web 服务器
服务器·php·apache
浩浩测试一下7 小时前
Authpf(OpenBSD)认证防火墙到ssh连接到SSH端口转发技术栈 与渗透网络安全的关联 (RED Team Technique )
网络·网络协议·tcp/ip·安全·网络安全·php
leagsoft_10038 小时前
联软NSPM自动化策略管理 助力上交所加速国产化替代提升运维效率
运维·网络·自动化
孤寂大仙v8 小时前
【计算机网络】网络层IP协议与子网划分详解:从主机通信到网络设计的底层逻辑
tcp/ip·计算机网络·php
Think Spatial 空间思维9 小时前
【实施指南】Android客户端HTTPS双向认证实施指南
android·网络协议·https·ssl
昔我往昔9 小时前
https和http有什么区别-http各个版本有什么区别
网络协议·http·https
漫步者TZ9 小时前
【Netty系列】解决TCP粘包和拆包:LengthFieldBasedFrameDecoder
java·网络协议·tcp/ip·netty
leagsoft_10039 小时前
筑牢企业网管域安全防线,守护数字核心——联软网管域安全建设解决方案
网络·安全·网络安全