UE虚幻将存档保存到自己服务器

        本文思路,主要是通过二进制形式读取UE的存档文件,将字节串转为字符串,然后通过post提交到服务器,服务器通过php接收并写入mysql数据库,载入存档也是同理。亲测可用,windows和安卓都测试过,通过这个方案完全没问题。

        本文需要使用到http,json,文件管理3种插件,全部在商城购买大概300-400元,如果只是学习使用可以使用其他途径购买插件,商用买正版。

        使用到的UE插件如下:

        HTTP request for blueprint 大概36块

        LE file manage 289块,应该也可以用其他插件,只要能以二进制读写文件就行。

        

         LE Extended Library 免费插件,用来将字节串转为字符串,字符串转为字节串。

        JsonParse 43.32元,创建json,解析json。

        本文非插件广告,只要能满足需求,使用其他类似插件或者自己开发都行。

先要自行实现UE的存档,本文不赘述UE如何存档的问题。

UE会将存档保存为一个.sav文件。

将存档文件读出,返回一个字节数组,文件名是存档的插槽名。

字节数组转字符串, LE Extended Library提供这个功能。

然后创建Json,其中包括用户密码和内容,三个元素,生成Json字符串

创建Post请求

参数为空,请求头申明数据类型为Json,Body就是刚刚创建的Json字符串。

服务端本人使用的是LNMP环境,创建一个php文件,命名为SaveGame.php

<?php
// MySQL 数据库连接信息
$servername = "localhost";
$username = "";
$password = "";
$dbname = "";

// 创建数据库连接
$conn = new mysqli($servername, $username, $password, $dbname);

// 检查连接是否成功
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// 从数据库中获取用户密码和保存数据
function getUserPassword($username) {
    global $conn;
    $stmt = $conn->prepare("SELECT Password, Save FROM xxxxxxx WHERE User = ?");
    $stmt->bind_param("s", $username);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc();
    $stmt->close();
    return $row;
}

// 验证用户密码
function authenticateUser($username, $password) {
    $user = getUserPassword($username);
    if ($user && $user["Password"] === $password) {
        return true;
    } else {
        return false;
    }
}


// 示例使用
$data = json_decode(file_get_contents('php://input'), true);
$username = $data["User"];
$password = $data["Password"];
$saveData = $data["Save"];

if (authenticateUser($username, $password)) {
    // 密码验证成功,修改保存数据
    $stmt = $conn->prepare("UPDATE xxxxx SET Save = ? WHERE User = ?");
    $stmt->bind_param("ss", $saveData, $username);
    $stmt->execute();
    $stmt->close();
    $response = array("message" => "上传成功");
    echo json_encode($response);
} else {
    // 密码验证失败,创建新用户并存储数据
    #createUser($username, $password, $saveData);
    $response = array("error" => "用户名或密码错误");
    echo json_encode($response);
}

// 关闭数据库连接
$conn->close();
?>

填写自己数据库信息,xxxxx是数据表名,通过phpmyadmin创建数据库,数据表和数据表的结构,结构如下:

包含ID作为主键,用户名,密码,内容。

执行sql命令ALTER TABLE your_table MODIFY COLUMN ID INT AUTO_INCREMENT;

将ID设置为自增。

回到UE,从上面PHP可以看到有两种返回的消息,一种是message,一种是error。

在回调事件处理这两种消息,告示用户是否成功。

这里json解析是http插件提供的。判断是否有error返回,有的话用红色把消息显示,这里的消息显示是我自己设计的一个简单的用户控件。

这样就完成了保存,

效果是这样的

可以看到Save这里有一串字符串,这个就是文件字节转过来的,如果要加载存档,就把这一些转回去。

加载存档

将用户名和密码post服务器上,服务器验证,然后返回数据,写入存档文件。

服务器创建LoadGame.php

<?php

// Establish MySQL connection
$servername = "localhost";
$username = "";
$password = "";
$dbname = "";

$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// Receive JSON data from POST request
$json_data = json_decode(file_get_contents('php://input'), true);

// Check if JSON data contains User and Password fields
if (isset($json_data['User']) && isset($json_data['Password'])) {
    $user = $json_data['User'];
    $password = $json_data['Password'];

    // Prepare SQL statement to retrieve user data
    $stmt = $conn->prepare("SELECT Password, Save FROM xxxxxxxxxx WHERE User = ?");
    $stmt->bind_param("s", $user);
    $stmt->execute();
    $result = $stmt->get_result();

    // Check if user exists
    if ($result->num_rows > 0) {
        $row = $result->fetch_assoc();
        $stored_password = $row["Password"];
        $save_data = $row["Save"];

        // Verify password
        if ($password==$stored_password) {
            // Password is correct, return Save data as JSON
            echo json_encode(array("Save" => $save_data));
        } else {
            // Password is incorrect, return error message as JSON
            echo json_encode(array("error" => "密码错误"));
        }
    } else {
        // User does not exist, create new user
        $hashed_password = password_hash($password, PASSWORD_DEFAULT); // Hash the password
        $stmt = $conn->prepare("INSERT INTO xxxxxxx (User, Password, Save) VALUES (?, ?, ?)");
        $stmt->bind_param("sss", $user, $hashed_password, ""); // Change "" to default Save data if needed
        $stmt->execute();
        echo json_encode(array("error" => "无此用户"));
    }

    $stmt->close();
} else {
    // JSON data does not contain User and Password fields, return error message as JSON
    echo json_encode(array("error" => "需要用户名和密码"));
}

$conn->close();

?>

一样的逻辑

验证服务器是否返回错误

没有则写入存档

接下来还可以做一个创建新用户的事件,方法同上,自行研究。

再建立一个用户控件,方便用户输入用户名和密码。

创建控件的方法自行学习,本文就不赘述了。

此方案在UE原本的存档方案的前提下实现云存档,方便跨设备游玩,方案简单粗暴,适用广。

此方法仅供参考学习,商用需要考虑文件读写安全,性能,php代码防止sql注入等等问题,请勿直接用于商用。

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值