项目02《游戏-06-开发》Unity3D

基于      项目02《游戏-05-开发》Unity3D      ,

接下来做   背包系统的   存储框架 ,

首先了解静态数据 与 动态数据,静态代表不变的数据,比如下图武器Icon,

其中,武器的名称,描述,图标,星级,详细技能描述都是不变的,称为静态数据,

而动态数据 会随着游戏进度的改变而发生改变,

其中,武器的等级,数量,是否拥有武器等这些都是可变的,成为动态数据,

对于静态数据的配置,有两种比较常用的方案,

第一种是使用Excel表格进行配置,

第二种是使用unity内置的【Scripper object】进行配置,

其中使用Ecel表格的可视化会更强大,适用于多人协作,缺点是步骤比较繁琐,需要多一步导出操作,

因此我们使用【Scripper object】进行配置,

对于动态数据的配置,也有两种方法,

第一种是存储在服务器上,登陆的时候从服务器拉取数据,

第二种是存储在本地,登陆的时候从文本文件中去读取当前的进度,

这两种最大的区别是一个记录在远程的机器上,一个记录在本地的机器上,

也就是网游和单机的区别,

本次我们使用第二种方案【JSON】

首先我们进行静态数据的配置,

创建背包表格PackageTable.cs脚本,功能是使用右键在unity编辑器中创建一个自定义配置文件,

可以传入两个参数,一个是菜单名称,另一个是创建后文件的名称,

双击PackageTable.cs修改脚本:

using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(menuName = "Water/PackageTable",fileName = "PackageTable")]
public class PackageTable : ScriptableObject{
    public List<PackageTableItem> dataList = new List<PackageTableItem>();
}
[System.Serializable]
public class PackageTableItem {
    public int id;
    public int type;
    public int star;
    public string name; 
    public string description;
    public string skillDescription;
    public string imagePath;
}
【解释】

其中使用List列表来容纳所有物品,

回到unity编辑器中,右键创建一个自己的文件用来容纳表格中的静态数据,

此时就创建了一个静态数据项,

在检查窗口Inspector中,可以看到一个List列表用来添加子项,

以此类推做八个,

回到unity编辑器创建修改器脚本GMCmd.cs

双击修改器脚本GMCmd.cs修改代码:

using UnityEditor;
using UnityEngine;
public class GMCmd{
    [MenuItem("CMCmd/读取表格")]
    public static void ReadTable(){
        PackageTable packageTable = Resources.Load<PackageTable>("TableData/PackageTable");
        foreach (PackageTableItem packageItem in packageTable.dataList)
            Debug.Log(string.Format($"[id] {packageItem.id} [name] {packageItem.name}"));
    }
}
回到unity编辑器中将TableData文件夹放在Resources文件夹下,

在unity菜单栏中可以看到创建的修改器,

点击读取表格可以看到读取数据,

配置好静态数据之后,接下来配置动态数据:

首先创建脚本PackageLocalData.cs

这个脚本的功能是将背包数据以Json的格式存储在本地,并且在使用时将其从本地的文本文件中读取到内存中,为方便使用,将代码设置为单例模式,类似于静态数据,动态数据也有背包物品的每一个子项,将这个子项命名为PackageLocalItem,它包含唯一的一个标识符uid,用来表示它是哪个物体的ID这个物品的数量num,以及物品等级level,是不是新获得的物品isNew,最后重写这个子类的ToString方法,方便后面打印和调试,最后添加List完善这个存取框架,用list容器缓存当前所有物品的动态信息,然后两个方法,存和取,而去文件的方法核心思想就是把文件变成字符串,再把字符串变成类的一个操作,

双击脚本PackageLocalData.cs修改代码:

using System.Collections.Generic;
using UnityEngine;
public class PackageLocalData{
    static PackageLocalData _instance;
    public static PackageLocalData Instance{
        get{
            if (_instance == null)
                _instance = new PackageLocalData();
            return _instance;
        }
    }
    //存
    public List<PackageLocalItem> items;
    public void SavaPackage(){
        string inventoryJson = JsonUtility.ToJson(this);
        PlayerPrefs.SetString("PackageLocalData", inventoryJson);
        PlayerPrefs.Save();
    }
    //取
    public List<PackageLocalItem> LoadPackage(){
        if (items != null)
            return items;
        if (PlayerPrefs.HasKey("PackageLocalData")){
            string inventoryJson = PlayerPrefs.GetString("PackageLocalData");
            PackageLocalData packageLocalData = JsonUtility.FromJson<PackageLocalData>(inventoryJson);
            items = packageLocalData.items;
            return items;
        }
        else{
            items = new List<PackageLocalItem>();
            return items;
        }
    }
}
[System.Serializable]
public class PackageLocalItem{
    public string uid;
    public int id;
    public int num;
    public int level;
    public bool isNew;
    public override string ToString(){
        return string.Format($"[id] {id} [num] {num}");
    }
}
然后修改修改器GMCmd.cs脚本 : 在修改器脚本中调用动态数据的功能,

using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
public class GMCmd{
    [MenuItem("CMCmd/读取表格")]
    public static void ReadTable(){
        PackageTable packageTable = Resources.Load<PackageTable>("TableData/PackageTable");
        foreach (PackageTableItem packageItem in packageTable.dataList)
            Debug.Log(string.Format($"[id] {packageItem.id} [name] {packageItem.name}"));
    }
    [MenuItem("CMCmd/创建背包测试数据")]
    public static void CreateLocalPackageData(){
        //保存数据
        PackageLocalData.Instance.items = new List<PackageLocalItem>();
        for (int i = 1; i < 9; i++){
            PackageLocalItem packageLocalItem = new(){
                uid = Guid.NewGuid().ToString(),
                id = i,
                num = i,
                level = i,
                isNew = i % 2 == i
            };
            PackageLocalData.Instance.items.Add(packageLocalItem);
        }
        PackageLocalData.Instance.SavaPackage();
    }
    [MenuItem("CMCmd/读取背包测试数据")]
    public static void ReadLocalPackageData(){
        //读取数据
        List<PackageLocalItem> readItems = PackageLocalData.Instance.LoadPackage();
        foreach (PackageLocalItem item in readItems)
            Debug.Log(item);
    }
}
回到unity编辑器中使用动态数据功能,运行游戏先创建背包测试数据,

再点击读取背包测试数据,

可以看到调用背包动态数据成功,

End.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/453150.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7min到40s:SpringBoot 启动优化实践!

目录 背景 1 耗时问题排查 1.1 观察 SpringBoot 启动 run 方法 1.2 监控 Bean 注入耗时 2 优化方案 2.1 如何解决扫描路径过多&#xff1f; 2.2 如何解决 Bean 初始化高耗时&#xff1f; 3 新的问题 3.1 SpringBoot 自动化装配&#xff0c;让人防不胜防 3.2 使用 sta…

12. onnx转为rknn测试时有很多重叠框的修改(python)

我们下载rknn-toolkit2-master后并进行前面的处理后&#xff0c;进入到rknn-toolkit2-master\examples\onnx\yolov5文件夹&#xff0c;里面有个test.py文件&#xff0c;打开该文件&#xff0c;其代码如下&#xff1a; # -*- coding: utf-8 -*- # coding:utf-8import os import…

文心一言 VS 讯飞星火 VS chatgpt (194)-- 算法导论14.3 2题

二、用go语言&#xff0c;改写 INTERVAL-SEARCH 的代码&#xff0c;使得当所有区间都是开区间时&#xff0c;它也能正确地工作。 文心一言&#xff0c;代码正常运行&#xff1a; 在Go语言中&#xff0c;处理开区间&#xff08;open intervals&#xff09;时&#xff0c;我们需…

SSH免密切换服务器案例-ssh协议(公钥和私钥)

公钥和私钥理解 公钥提供加密&#xff0c;私钥解密&#xff0c;公钥可以共享&#xff0c;私钥不可以。举例公钥相当于锁头&#xff0c;可以给别人用&#xff0c;钥匙相当于私钥&#xff0c;只能开自己发出去的锁头&#xff0c;也就是私钥和公钥成对&#xff0c;私钥只能解密对…

使用 LoRA 在 vi​​ggo 数据集上微调 Microsoft phi-2 小语言模型

一、说明 Microsoft 的基于 Transformer 的小语言模型。它可以根据 MIT 许可在HuggingFace上使用。 它在 96 个 A100 GPU 上使用 1.4T 令牌进行了 14 天的训练。Phi-2 是一个 27 亿个参数的预训练 Transformer&#xff0c;不使用 RLHF 或指示微调。它进行下一个标记预测&#x…

网络安全产品之准入控制系统

文章目录 一、什么是准入控制系统二、准入控制系统的主要功能1. 接入设备的身份认证2. 接入设备的安全性检查 三、准入控制系统的工作原理四、准入控制系统的特点五、准入控制系统的部署方式1. 网关模式2. 控制旁路模式 六、准入控制系统的应用场景七、企业如何利用准入控制系统…

智慧港口:山海鲸可视化引领未来

随着疫情的结束&#xff0c;全球贸易迎来新的春天&#xff0c;港口作为物流枢纽的地位日益凸显。然而&#xff0c;传统港口的运营和管理方式已无法满足现代物流的需求。为了提高港口运营效率&#xff0c;降低成本&#xff0c;智慧港口的概念应运而生。作为山海鲸可视化的开发者…

docker安装-centos

Docker CE 支持 64 位版本 CentOS 7&#xff0c;并且要求内核版本不低于 3.10 卸载旧版本Docker sudo yum remove docker \ docker-common \ docker-selinux \ docker-engine使用yum安装 yum 更新到最新版本: sudo yum update执行以下命令安装依赖包&#xff1a; sudo yum…

Redis-缓存问题及解决方案

本文已收录于专栏 《中间件合集》 目录 概念说明缓存问题缓存击穿问题描述解决方案 缓存穿透问题描述解决方案 缓存雪崩问题描述解决方案提高缓存可用性过期时间配置熔断降级 总结提升 概念说明 Redis是一个开源的内存数据库&#xff0c;也可以用作缓存系统。它支持多种数据结构…

zabbix配置监控脚本

zabbix配置监控脚本 1.修改agent配置文件 [rootchang ~]# vim /etc/zabbix/zabbix_agentd.conf 333行 原# UnsafeUserParameters0 修改成 UnsafeUserParameters12.创建脚本与脚本存放目录 [rootchang ~]# mkdir /etc/zabbix/zabbix_scripts [rootchang zabbix_scripts]# vi…

Springboot写一个对接钉钉机器人的小插件

钉钉机器人 有时候我门需要监控各种事件&#xff0c;需要机器人给我发给提醒 如&#xff1a;git代码交接&#xff0c;代码合并&#xff0c; 服务器异常捕获&#xff0c;。。。。 参照钉钉给我们的开发文档&#xff0c;可以发现对接起来是非常简单哈哈 这是我写的小插件以及例子…

基恩士 KV-8000 PLC通讯简单测试

1、KV-8000通讯协议 基恩士 KV-8000 PLC支持多种通讯方式&#xff0c;包括&#xff1a;OPC UA、Modbus、上位链路命令等。其中OPC UA需要对服务器和全局变量进行设置&#xff0c;Modbus需要调用功能块。默认支持的是上位链路命令&#xff0c;实际是一条条以回车换行结束的ASCII…