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

四、测试

相关推荐
码熔burning3 分钟前
内网互通原则详解!
网络·内网互通
新时代的弩力9 分钟前
CSRF 和 XSS 攻击分析与防范
网络
YGGP1 小时前
对比 HTTP-REST 与 gRPC:各自的优缺点以及适用的场景
http·grpc·rest
Think Spatial 空间思维1 小时前
【HTTPS基础概念与原理】SSL/TLS协议演进史:从SSLv3到TLS 1.3
网络协议·https·ssl
是大强1 小时前
编译OpenSSL时报错,Can‘t locate IPC/Cmd.pm in @INC perl环境
网络·网络协议·ssl
神仙别闹1 小时前
基于C#实现中央定位服务器的 P2P 网络聊天系统
服务器·网络·c#
zm2 小时前
网络编程超时检测,unix域套接字,粘包
网络
Li_yizYa2 小时前
网络原理 | 网络基础概念复习
运维·服务器·网络·计算机网络
s_little_monster2 小时前
【Linux】socket网络编程基础
linux·运维·网络·笔记·学习·php·学习方法
若风的雨10 小时前
【deekseek】P2P通信路由过程
服务器·网络协议·p2p