游戏开发日志17(保存技能树信息)

2023-10-26

最开始的想法是这样的:在GameManage中写一个public List<SkillData> skills=new List<SkillData>();与unity中的SkillData资源文件联系起来,在Save类中创建

 public List<bool> IsUnlocked=new List<bool>();

 public List<int> skillLevel=new List<int>();

来记录技能的解锁状态以及技能等级。

通过二进制来存储/加载Save类,

以及通过Playerprefs来记录技能点数,实现如下:

首先记录技能点数:

 public void SaveByPlayerprefs()
    {
        PlayerPrefs.SetInt("projectile",projectile.itemHeld);

        PlayerPrefs.SetFloat("PlayerPosX",rubby.transform.position.x);
        PlayerPrefs.SetFloat("PlayerPosY",rubby.transform.position.y);
        //save ruby's hp infomation
        PlayerPrefs.SetFloat("hp",rubby.CurrentHealth);
        //save SkillTree
        //save Points
        PlayerPrefs.SetInt("Points",SkillManage.instance.skillPoint);
    }
 public void LoadByPlayerprefs()
    {
        projectile.itemHeld=PlayerPrefs.GetInt("projectile");
        InventoryManage.RefreshItem();

        position.x=PlayerPrefs.GetFloat("PlayerPosX");
        position.y=PlayerPrefs.GetFloat("PlayerPosY");
        rubby.transform.position=new Vector2(position.x,position.y);
        rubby.CurrentHealth=PlayerPrefs.GetFloat("hp");
        UIHealth.instance.SetValue( rubby.CurrentHealth/ rubby.MaxHealth);
        //Read Points
        SkillManage.instance.skillPoint=PlayerPrefs.GetInt("Points");
        SkillManage.instance.updatePointUI();
    }

记录技能信息:

using System.Net.Mime;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class GameManage : MonoBehaviour
{
    public static GameManage instance;
    public bool IsPaused;

    public List<EnemyController> enemies=new List<EnemyController>(); 
    public List<SkillData> skills=new List<SkillData>();
   

    private void Awake() {
        if(instance==null)
        { 
            instance=this;
        }else{
            if(instance!=this)
            {
                Destroy(gameObject);
            }
        }
        DontDestroyOnLoad(gameObject);
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class Save 
{
    //save enemies position and hp information
    public List<float> positionX=new List<float>();
    public List<float> positionY=new List<float>();
    public List<bool> broken=new List<bool>();
    //save SkillTree
    public List<bool> IsUnlocked=new List<bool>();
    public List<int> skillLevel=new List<int>();

}

把public List<SkillData> skills=new List<SkillData>();中的信息写入Save类

 private Save createSaveGameObject()
    {
        Save save=new Save();
        foreach(EnemyController enemy in GameManage.instance.enemies)
        {
            save.broken.Add(enemy.broken);
            save.positionX.Add(enemy.PositionX);
            save.positionY.Add(enemy.PositionY);
        }
        foreach(SkillData skill in GameManage.instance.skills)
        {
            save.IsUnlocked.Add(skill.isUnlocked);
            save.skillLevel.Add(skill.SkillLevel);
        }

        
        return save;
    }

将Save类以二进制类型存储

 private void SaveBySerialization()
    {
        Save save=createSaveGameObject();
        BinaryFormatter bf=new BinaryFormatter();
        FileStream fileStream=File.Create(@"F:\unity games\learning\My project\Assets\scripts\LoadGame\Data.text");
        bf.Serialize(fileStream,save); //将save以二进制存入fileStream
        fileStream.Close();
    }

读取Save类里的信息至skills

private void LoadByDeSerialization()
    {
        
            //load SkillTree
            for(int i=0;i<GameManage.instance.skills.Count;i++)
            {
                GameManage.instance.skills[i].isUnlocked=save.IsUnlocked[i];
                GameManage.instance.skills[i].SkillLevel=save.skillLevel[i];
            }
            SkillManage.instance.updateSkillByLoad();
        }

    }

其中的updateSkillByLoad函数

 public void updateSkillByLoad()
    {
        foreach(SkillData skill in GameManage.instance.skills)
        {
            if(skill.isUnlocked==true)
            {
                skillButtons[skill.SkillID].GetComponent<Image>().color=Color.white;
                skillButtons[skill.SkillID].transform.GetChild(1).gameObject.SetActive(true);
                skillButtons[skill.SkillID].transform.GetChild(1).GetComponent<Text>().text=
                skill.SkillLevel.ToString();
            }
        }
    }

经测试,通过Save/Load按钮,可以正确实现技能树信息存储了,但是会有问题,当保存后继续加点其它技能,再load后,保存后继续加点的其它技能依然显示,经检查数据保存是没有问题的,只是忘了把之后技能的颜色返回原本的灰色,所有我先在Awake中去记录最初的阴影颜色

 private Color origional;
    private void Awake() {
        if(instance==null)
        {
            instance=this;
        }
        else{
            if(instance!=this)
            {
                Destroy(gameObject);
            }
        }
        DontDestroyOnLoad(gameObject);

        origional=skillButtons[0].GetComponent<Image>().color;
    }

再在updateSkillByLoad函数中添加一个else

public void updateSkillByLoad()
    {
        foreach(SkillData skill in GameManage.instance.skills)
        {
            if(skill.isUnlocked==true)
            {
                skillButtons[skill.SkillID].GetComponent<Image>().color=Color.white;
                skillButtons[skill.SkillID].transform.GetChild(1).gameObject.SetActive(true);
                skillButtons[skill.SkillID].transform.GetChild(1).GetComponent<Text>().text=
                skill.SkillLevel.ToString();
            }else{
                skillButtons[skill.SkillID].GetComponent<Image>().color=origional;
                skillButtons[skill.SkillID].transform.GetChild(1).gameObject.SetActive(false);
                }
        }
    }

至此,技能树的UI功能已经大功告成了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

游戏开发日志17(保存技能树信息) 的相关文章

  • UnityLuaMvvM Lua 带通知的Mode类

    实现数据更新UI自动刷新的核心代码 欢迎关注https gitee com xiongks UnityMVVM mode function modeType local obj obj modeType modeType obj filds
  • UE5学习笔记(一)——界面功能梳理&第一天知识点记录

    学习UE5的第一步 是软件安装 默认是安装好的 由于安装没有太多技术含量 所以就没有专门做记录 这里有个注意点 虚幻引擎是整合在Epic games launcher中的 也就是说开发引擎内嵌在游戏平台上 打个比方 就是如果你要下unity
  • 蒙特卡洛积分、重要性采样、低差异序列

    渲染公式 渲染的目标在于计算周围环境的光线有多少从表面像素点反射到相机视口中 要计算总的反射光 每个入射方向的贡献 必须将他们在半球上相加 为入射光线 与法线 的夹角 为方便计算可以使用法线向量和入射向量 单位化 的乘积表示 对于基于图像的
  • Unity 安卓打包

    Unity打包的方式有很多种 自动打包和手动打包 今天小弟就鼓捣鼓捣unity手动打包 如果想动态打包的话 可以去看其他大佬的帖帖哈 unity打包先配置环境 下载unity的时候可以顺道把unity的安卓包下载下来 如果忘了也没事 可以从
  • Unity-AR 简介

    Unity AR 简介 现有Unity AR Sdk ARKit 苹果推出的AR开发平台 ARCore Google 推出的增强现实 SDK ARFoundation ARFoundation是ARKit XR插件和ARCore XR插件
  • FBX导入Unity中模型没有材质的处理

    一 3dMax导出FBX时的注意事项 导出时 确保maps文件存在 里面放着fbx用到的image 二 在Unity中的设置 1 文件拖入Unity的Assets文件夹中 2 查看模型的材质是否存在 如下所示 材质为None 此时拖入sce
  • Unity中按钮检测鼠标状态

    改方法主要是用于按钮检测鼠标的进入 滑出 点击 抬起 长按 长按停止 1 先将下面这个脚本挂载到需要检测鼠标状态的按钮上 using System Collections using System Collections Generic u
  • Unity动画系统详解

    目录 动画编辑器 编辑器面板 动画复用 前言 人形重定向动画 Humanoid 通用动画 Generic 旧版本动画 Legacy 动画控制器 系统状态 切换条件 状态机脚本 IK动画 反向动力学 BlendTree 混合树 Animato
  • Unity中UI框架的使用1-添加面板、显示Loading页面

    其中BasePanel和Canvas都是挂在面板的预制物上的 1 导入我们的UI框架 本篇文章中有用的是两个UIPanelType NUIManager和NBasePanel 会放在文章最后供大家使用 2 先将我们做好的Panel设置成预制
  • GooglePlay提审警告(com.google.android.gms:play-services-safetynet:17.0.0)

    1 Goole在今年6月份出的新政策 不在使用safetynet 而使用Play Integrity API 2 项目本身没有使用过safetynet 3 使用了firebase 查阅资料 解决方案如下 implementation pla
  • unity中创建询问弹出窗口

    在开发过程中进程会遇到需要弹出一个窗口询问用户是否进行的操作 今天就来制作一个这样弹出窗口 然后根据弹出窗口的选择内容不同进行不同的操作 本例中主要是为了删除一个数据 而在删除数据操作前需要得到用户的一个确认操作 这里面主要用到了Notif
  • unity工程崩溃资源找回

    1 Unity死机未保存场景 当你在Unity中编辑场景 突然死机时 可以在项目文件目录中找到Temp文件夹 双击文件夹 找到 Backupscenes文件夹 把后缀为 backup的文件后缀改为 unity 然后拖进Unity的Proje
  • unity3d大型互动照片墙

    1 本次应客户需求 制作一个大型照片墙互动 输出分辨率为9600 4320 注 unity3d官方推荐最大分辨率为8192 3686 4 经过现场长达24小时暴力测试中途未发生问题 姑且判定可以达到正常标准 废话不多说 先上效果 unity
  • 【Unity步步升】监控与检测物体的各种方案,如:射线、碰撞、挂载等...

    在制作AR模型数值控制方案的时候遇到了检测的问题 学习过程受益匪浅 故今天为大家整理带来一篇监控与检测物体的参考方案集合 目录 一 射线检测 二 物体存在检测 三 碰撞检测 一 射线检测 单射线检测 首先完成搭建场景如下图1 1 我这里用到
  • unity dots jobSystem 记录

    Looking for a way to get started writing safe multithreaded code Learn the principles behind our Job System and how it w
  • unity小球跟随音乐节奏放大缩小和改变颜色

    放在小球身上 设置对应组件即可 using System Collections using System Collections Generic using Unity VisualScripting using UnityEngine
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • 游戏开发常见操作梳理之NPC任务系统

    多数游戏存在任务系统 接下来介绍通过NPC触发任务的游戏制作代码 using System Collections using System Collections Generic using UnityEngine
  • 游戏开发常见操作梳理之NPC药品商店系统(NGUI版)

    后续会出UGUI Json的版本 敬请期待 游戏开发中经常会出现药品商店 实际操作与武器商店类似 甚至根据实际情况可以简化设置 废话不多说 直接上代码 药品商店的源码 using System Collections using Syste

随机推荐

  • 【Golang】切片(slice)

    文章目录 切片 直接声明新的切片 append 函数为切片添加元素 复制切到另一个切片 从切片中删除元素 从开头位置删除 从中间位置删除 从尾部删除 切片 切片 slice 是对数组的一个连续片段的引用 所以切片是一个引用类型 这个片段可以
  • scss 转为 less

    tnpm install less plugin sass2less g sass2less scss dir name less rm rf scss 转载于 https www cnblogs com lyraLee p 1048966
  • virtualbox的虚拟机联不通外网的问题

    问题描述 在网卡配置上按照网上的操作配置好了 但是仍然联不通外网 ip地址显示为127 0 0 1 解决 通过输入dhclient v命令解决
  • Spring框架常用注解及通配符总结

    Autowired 自动注入 默认是类型匹配 使用配置文件需要set 使用注解不需要 只需要类属性 Autowired可以和 Qualifier beanName 配合着使用 Qualifier beanName 多个相同类型的bean 标
  • 基于深度学习的目标检测方法综述

    引言 现有的深度学习的目标检测方法 可以大致分为两类 一 基于候选区域的目标检测方法 二 基于回归的目标检测方法 依据方法的提出时间 可以构建出如下时间线 2014 CVPR R CNN 1 2015 arXiv DenseBox 14 2
  • 「开源项目」现代化开源Linux服务器运维管理面板-1Panel

    1Panel 基本介绍 1Panel 是新一代的 Linux 服务器运维管理面板 产品优势 快速建站 深度集成 Wordpress 和 Halo 域名绑定 SSL 证书配置等一键搞定 高效管理 通过 Web 端轻松管理 Linux 服务器
  • arm汇编中感叹号/叹号的作用

    arm汇编中存在一个神奇的可选后缀 一般是在寄存器或寻址方式之后 对于加了叹号的情况 访问内存时先根据寻址方式更改寄存器的值 再按照该已经更新的值访问内存
  • 基于深度学习的目标检测算法概述

    摘要 目标检测是计算机视觉的一个重要分支 其目的是准确判断图像或视频中的物体类别并定位 传统的目标检测方法包括这三个步骤 区域选择 提取特征和分类回归 这样的检测方法存在很多问题 现已难以满足检测对性能和速度的要求 基于深度学习的目标检测方
  • 电子元器件/模块供应商汇总

    晶振 WIFI MLCC电容
  • Python制作模拟按键摘录,pyautogui库及该库在某些窗口不生效的问题部分解决措施(PyDirectInput库、winio驱动级模拟)

    文章目录 toc 一 使用pyautogui库 1 安装pyautogui库 2 导入并在py中使用 1 导包 2 基本鼠标控制 3 基本键盘控制 4 屏幕截图 5 图片位置识别 3 存在问题 二 使用PyDirectInput库解决某些游
  • 机器学习——数据清洗,特征选择

    数据清洗的方法 设置阈值去掉异常值 随机森林预测去掉点的数值加进去 onehot编码 不适用于决策树和随机森林 先将一个属性分成几个类别 然后再将样本的数据变成矩阵01 1表示其所在类别 会导致特征数增多 数据清洗代码实现 import n
  • Linux磁盘扩容详解

    公司项目服务器是买的阿里的 原来的项目是外包出去别人做的 用户图片上传保存到了服务器上 500G的磁盘空间硬生生给用完了 怎么搞 扩容呗 大概思路就是从阿里那再买一块磁盘 添加到ESC实例上 然后挂载 然后格式化磁盘文件 然后把老图片mv过
  • STL sort排序算法详细介绍

    用于C 中 对给定区间所有元素进行排序 头文件是 include
  • selenium中键盘操作:Keys类

    一 前言 selenium提供了比较完整的键盘操作 在使用的模拟键盘操作之前需要我们导入Keys类 from selenium webdriver common keys import Keys 二 常用的非组合键操作 1 回车键 Keys
  • python循环综合运用

    循环很重要 计算机很蠢 唯一的优势就是按照指令不停的执行 所以决定在说一下 break语句 用在循环体中 迫使循环立即终止 即跳出所在循环体 继续执行循环体后面的语句 sum 0 i 1 while i sum i i 1 if i gt
  • 生成随机mask以及根据mask对两幅图片进行合并

    前言 对图像处理的一些操作还是需要掌握的嘿嘿 随机mask生成 这里代码参考MAT的一份代码 https github com fenglinglwb MAT blob main datasets mask generator 256 py
  • 机器人学基础(2)-微分运动和速度-雅可比矩阵计算、雅可比矩阵求逆、计算关节运动速度

    机器人学基础 2 微分运动和速度 雅可比矩阵计算 雅可比矩阵求逆 计算关节运动速度 本文知识点 坐标系的微分运动 坐标系之间的微分变化 机器人和机器人手坐标系的微分运动 雅可比矩阵的计算 雅可比矩阵求逆 雅可比矩阵和微分算子之间的关联 文章
  • flea-db使用之JPA接入

    JPA接入 1 准备工作 2 接入讲解 2 1 实体类 2 2 持久化单元DAO层实现 2 3 配置介绍 2 4 学生DAO层接口 2 5 学生DAO层实现 2 6 学生SV层接口 2 7 学生SV层实现 2 8 JPA接入自测 2 8 1
  • Pycharm连接Mysql数据库

    import pandas as pd import pymysql from sqlalchemy import create engine 创建一个Mysql连接器 用户名为root 密码123456 地址为127 0 0 1 数据库名
  • 游戏开发日志17(保存技能树信息)

    最开始的想法是这样的 在GameManage中写一个public List