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