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

四、测试

相关推荐
sweet丶2 小时前
MQTT消息通道-基础篇
网络协议
yychen_java3 小时前
当算法成为武器:AI泛滥时代的多维危机透视与治理路径
网络·人工智能·ai
漫途科技3 小时前
精准盯防危房隐患,智守人居安全|MTB46-4-2A 4G数据采集终端专项应用方案
网络·安全
奥利奥夹心脆芙4 小时前
辅助排查 HTTP 接口代码报错,实操完整案例分享
http
Misnearch4 小时前
抓包Packet Capture
网络·抓包
zhangfeng11334 小时前
ps aux讲解,结合国家超算中心 hpc apptainer
linux·服务器·网络
吠品4 小时前
一次 Nginx 报错 unexpected end of file 的排查记录
网络协议·https·ssl
代码中介商5 小时前
TLS握手全解析:从1.2到1.3的加密演进
网络·网络协议·http
xlq223225 小时前
66.ip
网络·网络协议·tcp/ip
tudoSearcher5 小时前
手机、平板、电脑同时控制Claude Code / Codex ?:Paseo实战指南
网络·开源·开源软件·个人开发·ai编程