unity存储信息的方式,保存读取背包、游戏进度,连接MySQL数据库

存储信息的方式

为了在Unity中存储信息,有几种方法可供选择。最常见的方法是PlayerPrefs、Serialization和Database

PlayerPrefs是一种简单的存储小量数据(如玩家偏好或游戏设置)的方法。它易于使用,不需要任何外部库。但是,不建议用于存储大量数据或敏感信息。

Serialization是另一种在Unity中存储数据的方法。它允许您保存和加载复杂的数据结构,如类和数组。Unity提供了几种序列化选项,如BinaryFormatter、XML和JSON。但是,序列化可能会很慢,可能不适合实时应用程序。

Database是一种在Unity中存储数据的更高级的方法。它允许您存储大量数据并提供高级查询功能。Unity支持几种数据库选项,如SQLite、MySQL和PostgreSQL。但是,使用数据库需要额外的设置,对于简单的应用程序可能不是必要的。

对于保存和加载游戏进度,PlayerPrefs或Serialization都是合适的选项。PlayerPrefs更容易使用,适用于小量数据,如玩家进度。Serialization更适合于更大量的数据或更复杂的数据结构。

以下是使用PlayerPrefs保存和加载游戏进度的示例:

// 保存游戏进度
PlayerPrefs.SetInt("Level", currentLevel);
PlayerPrefs.SetFloat("Score", currentScore);
PlayerPrefs.Save();

// 加载游戏进度
int savedLevel = PlayerPrefs.GetInt("Level");
float savedScore = PlayerPrefs.GetFloat("Score");

用PlayerPrefs存储简易背包系统的demo

// 首先需要在Unity中创建一个空对象,命名为InventorySystem
// 然后在该对象上添加一个C#脚本,命名为Inventory.cs
// 在该脚本中实现背包系统的逻辑,包括添加、删除和查询物品等功能
// 可以使用Unity自带的PlayerPrefs类来实现数据的存储和读取
// 在需要存储数据的地方调用PlayerPrefs.SetInt或PlayerPrefs.SetString等方法进行存储
// 在需要读取数据的地方调用PlayerPrefs.GetInt或PlayerPrefs.GetString等方法进行读取
// 在Inventory.cs脚本中实现背包系统的逻辑
using UnityEngine;

public class Inventory : MonoBehaviour
{
    // 存储物品的字典
    private Dictionary<string, int> items = new Dictionary<string, int>();

    // 添加物品的方法
    public void AddItem(string itemName, int count)
    {
        // 如果字典中已经存在该物品,则将数量加上count
        if (items.ContainsKey(itemName))
        {
            items[itemName] += count;
        }
        // 如果字典中不存在该物品,则添加该物品
        else
        {
            items.Add(itemName, count);
        }

        // 存储背包信息
        SaveInventory();
    }

    // 删除物品的方法
    public void RemoveItem(string itemName, int count)
    {
        // 如果字典中已经存在该物品,则将数量减去count
        if (items.ContainsKey(itemName))
        {
            items[itemName] -= count;

            // 如果数量小于等于0,则从字典中删除该物品
            if (items[itemName] <= 0)
            {
                items.Remove(itemName);
            }
        }

        // 存储背包信息
        SaveInventory();
    }

    // 查询物品数量的方法
    public int GetItemCount(string itemName)
    {
        // 如果字典中存在该物品,则返回数量
        if (items.ContainsKey(itemName))
        {
            return items[itemName];
        }
        // 如果字典中不存在该物品,则返回0
        else
        {
            return 0;
        }
    }

    // 存储背包信息的方法
    private void SaveInventory()
    {
        // 遍历字典,将物品名称和数量存储到PlayerPrefs中
        foreach (KeyValuePair<string, int> item in items)
        {
            PlayerPrefs.SetInt(item.Key, item.Value);
        }

        // 保存PlayerPrefs中的数据
        PlayerPrefs.Save();
    }

    // 读取背包信息的方法
    private void LoadInventory()
    {
        // 遍历字典,从PlayerPrefs中读取物品名称和数量
        foreach (KeyValuePair<string, int> item in items)
        {
            int count = PlayerPrefs.GetInt(item.Key);
            items[item.Key] = count;
        }
    }
}

以下是使用Serialization保存和加载游戏进度的示例:

// 保存游戏进度
BinaryFormatter formatter = new BinaryFormatter();
FileStream file = File.Create(Application.persistentDataPath + "/gameProgress.dat");
formatter.Serialize(file, gameProgress);
file.Close();

// 加载游戏进度
BinaryFormatter formatter = new BinaryFormatter();
FileStream file = File.Open(Application.persistentDataPath + "/gameProgress.dat", FileMode.Open);
GameProgress gameProgress = (GameProgress)formatter.Deserialize(file);
file.Close();

请注意,在Serialization示例中,GameProgress是包含游戏进度数据的自定义类。

用Serialization存储简易背包系统的demo

using UnityEngine;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

// GameSaveManager类用于保存和加载背包信息
public class GameSaveManager : MonoBehaviour
{
    public Inventory myInventory; // 背包信息
    public void SaveGame() // 保存背包信息
    {
        Debug.Log(Application.persistentDataPath); // 输出保存路径
        if (!Directory.Exists(Application.persistentDataPath + "/game_SaveData")) // 如果路径不存在,则创建路径
        {
            Directory.CreateDirectory(Application.persistentDataPath + "/game_SaveData");
        }

        BinaryFormatter formatter = new BinaryFormatter(); // 创建二进制转化器
        FileStream file = File.Create(Application.persistentDataPath + "/game_SaveData/inventory.txt"); // 创建文件流
        var json = JsonUtility.ToJson(myInventory); // 将背包信息转化为json格式
        formatter.Serialize(file, json); // 将json格式的背包信息序列化到文件流中
        file.Close(); // 关闭文件流
    }

    public void LoadGame() // 加载背包信息
    {
        BinaryFormatter bf = new BinaryFormatter(); // 创建二进制转化器
        if (File.Exists(Application.persistentDataPath + "/game_SaveData/inventory.txt")) // 如果文件存在
        {
            FileStream file = File.Open(Application.persistentDataPath + "/game_SaveData/inventory.txt", FileMode.Open); // 打开文件流
            JsonUtility.FromJsonOverwrite((string)bf.Deserialize(file), myInventory); // 将文件流中的背包信息反序列化到myInventory中
            file.Close(); // 关闭文件流
        }
    }
}

unity使用MySQL

Unity可以连接到MySQL数据库。以下是一个简单的示例:

首先,您需要从官方MySQL网站下载MySQL Connector/NET。下载并安装后,您可以在Unity项目中添加对MySQL.Data.dll的引用。

接下来,您可以使用以下代码连接到MySQL数据库:

using System.Data;
using MySql.Data.MySqlClient;

public class MySQLConnector : MonoBehaviour
{
    private MySqlConnection connection;
    private string server;
    private string database;
    private string uid;
    private string password;

    void Start()
    {
        server = "localhost";
        database = "mydatabase";
        uid = "username";
        password = "password";
        string connectionString = "SERVER=" + server + ";" + "DATABASE=" + 
            database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";";
        connection = new MySqlConnection(connectionString);
        connection.Open();
    }

    void OnApplicationQuit()
    {
        connection.Close();
    }
}

这段代码创建了一个MySqlConnection类的新实例,并打开了一个连接到MySQL数据库的连接。您需要用自己的值替换server、database、uid和password变量。

一旦建立了连接,您可以使用MySqlCommand类执行SQL查询。以下是如何执行SELECT查询并将结果打印到控制台的示例:

void Start()
{
    // ...

    string query = "SELECT * FROM mytable";
    MySqlCommand cmd = new MySqlCommand(query, connection);
    MySqlDataReader dataReader = cmd.ExecuteReader();

    while (dataReader.Read())
    {
        Debug.Log(dataReader["column1"] + " " + dataReader["column2"]);
    }

    dataReader.Close();
}

这段代码在名为“mytable”的表上执行了一个SELECT查询,并为查询返回的每一行的“column1”和“column2”值打印到控制台。

优化

如果您需要在整个应用程序中共享数据库连接,那么使用单例模式可能是一个好主意。这将确保只有一个MySQLConnector实例存在,并且可以在应用程序的任何部分使用它。

要实现这一点,您可以将MySQLConnector类的构造函数设置为私有,并添加一个静态GetInstance方法,该方法返回MySQLConnector类的单例实例。在GetInstance方法中,您可以检查是否已经创建了一个MySQLConnector实例,如果没有,则创建一个新实例并返回它。否则,返回现有实例。

以下是如何修改MySQLConnector类以使用单例模式的示例:

using System.Data;
using MySql.Data.MySqlClient;

public class MySQLConnector
{
    private static MySQLConnector instance;
    private MySqlConnection connection;
    private string server;
    private string database;
    private string uid;
    private string password;

    private MySQLConnector(string server, string database, string uid, string password)
    {
        this.server = server;
        this.database = database;
        this.uid = uid;
        this.password = password;
        string connectionString = "SERVER=" + server + ";" + "DATABASE=" + 
            database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";";
        connection = new MySqlConnection(connectionString);
    }

    public static MySQLConnector GetInstance(string server, string database, string uid, string password)
    {
        if (instance == null)
        {
            instance = new MySQLConnector(server, database, uid, password);
        }
        return instance;
    }

    public void OpenConnection()
    {
        connection.Open();
    }

    public void CloseConnection()
    {
        connection.Close();
    }

    public DataTable ExecuteQuery(string query)
    {
        MySqlCommand cmd = new MySqlCommand(query, connection);
        MySqlDataAdapter adapter = new MySqlDataAdapter(cmd);
        DataTable dataTable = new DataTable();
        adapter.Fill(dataTable);
        return dataTable;
    }
}

现在,您可以在应用程序的任何部分使用MySQLConnector.GetInstance方法来获取MySQLConnector类的单例实例,并调用其方法来执行查询。例如:

MySQLConnector connector = MySQLConnector.GetInstance("localhost", "mydatabase", "username", "password");
connector.OpenConnection();
string query = "SELECT * FROM mytable";
DataTable dataTable = connector.ExecuteQuery(query);

foreach (DataRow row in dataTable.Rows)
{
    Debug.Log(row["column1"] + " " + row["column2"]);
}

connector.CloseConnection();

这段代码获取MySQLConnector类的单例实例,并使用适当的服务器、数据库、uid和密码值打开了数据库连接,在名为“mytable”的表上执行了一个SELECT查询,并为查询返回的每一行的“column1”和“column2”值打印到控制台。最后,它关闭了数据库连接。文章来源地址https://uudwc.com/A/mNvnJ

原文地址:https://blog.csdn.net/qq_36303853/article/details/130069593

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

h
上一篇 2023年09月14日 12:17
下一篇 2023年09月14日 12:19