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

avatar
作者
筋斗云
阅读量:3

        本文思路,主要是通过二进制形式读取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注入等等问题,请勿直接用于商用。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!