Unity3D 游戏开发构架篇 ——角色类的设计与持久化
在游戏开发中,游戏角色占了很大的篇幅,可以说游戏中所有的内容都是由主角所带动。这里就介绍一下角色类的设计和持久化。
一、角色类应用场景和设计思想
游戏中的角色类型不一而足,有不同的技能,有不同的属性等等。有些一个玩家只有一个角色,有些一个玩家可以有多个角色。这里就目前项目来描述一下角色类的构造,思路都是类似的。
早期我写角色类都是直接一个Class,然后想到什么属性就往里面添加,如果游戏过程中需要对属性的修改,逻辑判断也写在这个类中,这样必然导致类的庞大和臃肿,最后你自己也忘记了自己写在什么地方了。
后期的逻辑如果修改了,姑且不论属性之间的互相连带和逻辑连带,你的查找就是一件麻烦事。
这里我们讨论一下一个玩家账号多个角色的构造。
定为一个角色类,包括玩家的疲劳,金币,元宝等等。角色类包括多个英雄对象。
一个英雄类,包括英雄的属性,等级等等,英雄对象包括多个属性对象。
一个属性类,包括属性的值,下一级属性的值等等。
对这些类的修改,类的内部只提供接口,逻辑的判断存在于外部的部件中,而不是自己类的内部实现。这样代码就简洁明了不少,同样逻辑修改也只需要查找对应的部件即可。
当然还有更复杂的,如下图所示:
一个基础属性类衍生出来了Attribute,Virtal,SKill等等。
二、持久化的应用场景和设计思想
角色化类创建后,这个类不论游戏的关闭和开启都要和上一次的一样。可以采用持久化的方案。C#中一般采取序列化到本地二进制文件或者XML文件等流序列化。
当然你也可以采用Unity3D的ScriptableObject方案。
http://blog.csdn.net/jjiss318/article/details/7195052
三、核心代码
BaseState.CS
基础属性类,可以枚举中动态添加
- [Serializable]
- public class BaseState
- {
- public int _baseValue;
- public int _grown;
- public int _max_baseValue;
- public Attribute _name;
- public BaseState(int _baseValue, int _grown, Attribute _name, int _max_baseValue)
- {
- this._baseValue = _baseValue;
- this._grown = _grown;
- this._name = _name;
- this._max_baseValue = _max_baseValue;
- }
- //调整接口如下
- …………………………
- }
- public enum Attribute
- {
- Might,
- Constitution
- }
BaseCharacter.CS
基础英雄类,可以枚举中动态添加
- [Serializable]
- public class BaseCharacter
- {
- public Character _name;
- public Currency_Kind mycurrency;
- public int price;
- public bool _isLocked;
- public int _level;
- public int _max_level;
- public BaseState[] attribute_list;
- public BaseCharacter ( Character _name,Currency_Kind _kind, int price,int _max_level)
- {
- this._name = _name;
- this.mycurrency = _kind;
- this.price = price;
- _isLocked = true;
- _level=;
- this._max_level = _max_level;
- this.attribute_list= new BaseState[Enum.GetValues(typeof(Attribute)).Length];
- AddAllAttriute(this._name,this.attribute_list);
- }
- private void AddAllAttriute(Character _name, BaseState[] attribute_list)
- {
- AttributeDateBase.GetBaseArrayByName(_name,attribute_list);
- }
- }
- public enum Character {
- Moking,
- Super_Pig
- }
序列化方法,这里就采用本地二进制方法
- //持久化英雄数组
- public static void Load()
- {
- Globals.Character = new BaseCharacter[Enum.GetValues(typeof(Character)).Length];
- Debug.Log("load");
- //second load
- if (File.Exists(fileName))
- {
- try
- {
- using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
- {
- BinaryFormatter b = new BinaryFormatter();
- //这里貌似最好一个个序列化
- //BaseCharacter[] gp = (BaseCharacter[])b.Deserialize(fileStream);
- for (int i = ; i < Globals.Character.Length; i++)
- {
- Globals.Character[i] = (BaseCharacter)b.Deserialize(fileStream);
- }
- }
- }
- catch (Exception ex)
- {
- Utils.WriteLog("Globals.Save occurs an error:" + ex);
- }
- }
- else {
- HeroDateBase.GetBaseArray(Globals.Character);
- }
- }
- public static void Save()
- {
- if (Globals.Character == null && Globals.Character.Length <=)
- {
- return;
- }
- try
- {
- using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
- {
- BinaryFormatter b = new BinaryFormatter();
- //也要一个个反序列化
- for (int i = ; i < Globals.Character.Length; i++)
- {
- b.Serialize(fs, Globals.Character[i]);
- }
- Debug.Log("Serialize Save");
- }
- }
- catch (Exception ex)
- {
- Utils.WriteLog("Globals.Save occurs an error:" + ex);
- }
- }
搞完了英雄类和属性类的持久化,角色类的持久化也就大同小异了,不过角色也就是玩家一个游戏只有一个,也就不用枚举了。
四、总结
考虑到英雄类和属性类的字段动态增长,可能每次游戏开辟的内存不同,那么此时反序列化的出来的数据覆盖会不会有错呢?可以考虑一下。
Unity3D 游戏开发构架篇 ——角色类的设计与持久化的更多相关文章
- Unity3D 游戏开发架构篇 ——性格一流的设计和持久性
在游戏开发.游戏人物占了非常大的空间.所有内容都是由主角可以说游戏驱动. 下面来介绍一下一流的设计和持久性的作用. 一.应用场景 游戏中的角色类型不一而足,有不同的技能.有不同的属性等等.有些一个玩家 ...
- Unity3D 游戏开发构架篇 ——输入控制
临近毕业之初.进入Unity3D这个行业,是一家小工作室.老板人非常不错,公司氛围也非常单纯.近期公司开发一款小游戏,初次上手,颇多周折,记录下自己的开发心得.主要涉及一些设计理念,互相交流. 先说下 ...
- Unity3D 游戏开发构架篇 —— 动态大场景生成 = 区域加载+对象池管理
项目做一个类似无尽模式的场景,想了一想,其实方法很简单,做一个相关的总结. 主要先谈一谈构架,后期附上代码. 一.区域加载 其实无尽场景的实现很简单,因为屏幕限制,那么不论何时何地,我们只能看到自己的 ...
- Unity3D游戏开发从零单排(四) - 制作一个iOS游戏
提要 此篇是一个国外教程的翻译,尽管有点老,可是适合新手入门. 自己去写代码.debug,布置场景,能够收获到非常多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一 ...
- Unity3D游戏开发初探—2.初步了解3D模型基础
一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...
- [Unity3D]Unity3D游戏开发之飞机大战项目解说
大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...
- [Unity3D]Unity3D游戏开发《反对》说到游戏(上)——目标跟踪
朋友,大家好.我是秦培,欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 首先博主要自我反省,过了这么久才来更新博客,这段时间主要是在忙着写期末的作业,所以博主基本上没 ...
- [Unity3D]Unity3D游戏开发之异步记载场景并实现进度条读取效果
大家好,我是秦元培.欢迎大家关注我的博客,我的博客地址是:blog.csdn.net/qinyuanpei.终于在各种无语的论文作业中解脱了,所以立即抓紧时间来这里更新博客.博主本来计划在Unity3 ...
- 从一点儿不会开始——Unity3D游戏开发学习(一)
一些废话 我是一个windows phone.windows 8的忠实粉丝,也是一个开发者,开发数个windows phone应用和两个windows 8应用.对开发游戏一直抱有强烈兴趣和愿望,但奈何 ...
随机推荐
- 杭电ACM2076--夹角有多大(题目已修改,注意读题)
杭电ACM2076--夹角有多大(题目已修改,注意读题) http://acm.hdu.edu.cn/showproblem.php?pid=2076 思路很简单.直接贴代码.过程分析有点耗时间. / ...
- 如何判断一个js对象是不是Array
1. instance of 2.constructor 3. isArray 1.var a=new Array(); a instanceof Array; //true 2.var a=new ...
- 【Qt】Qt国际化【转】
简介 Qt国际化属于Qt高级中的一部分,本想着放到后面来说,上节刚好介绍了Qt Linguist,趁热打铁就一起了解下. 对于绝大多数的应用程序,在刚启动时,需要加载默认的语言(或最后一次设置的语言) ...
- Sql 临时表
一个#是只能在当前打开滴查询窗体查询,两个#是能够在其他打开滴查询窗体查询 SELECT 'VR001839003YP' 列名1,'RO512498726DE' 列名2 INTO #临时表 UNION ...
- Oracle 动态视图4 V$SESSION_WAIT & V$SESSION_EVENT
一.视图V$SESSION_WAIT显示了session的当前等待事 Column Datatype Description SID NUMBER Session identifier SEQ# NU ...
- (转)使用getevent监听Android输入设备文件
尊重原创转载请注明:From AigeStudio(http://blog.csdn.net/aigestudio)Power by Aige 侵权必究! 炮兵镇楼 上一节Android事件分发完全解 ...
- access_ok()
access_ok() 函数是用来代替老版本的 verify_area() 函数的.它的作用也是检查用户空间指针是否可用. 函数原型: access_ok (type, addr, size); 变量 ...
- 转字符驱动实例gpio
概述: 字符设备驱动程序: 是按照字符设备要求完成的由操作系统调用的代码. 重点理解以下内容: 1. 驱动是写给操作系统的代码,它不是直接给用户层程序调用的,而是给系统调用的 2. 所以驱动要向系 ...
- intellij 设置-试验过的
1.已修改的文件星号“*”标记 2.在PROJECT窗口中快速定位,编辑窗口中的文件 在编辑的所选文件按ALT+F1, 然后选择PROJECT VIEW 3.改变编辑文本字体大小 FILE -> ...
- python3 学习总结与建议
最近我又玩起了python,以前听说过它,只是那时候我看见官方的一句名言:“用python语言编程,只用一种最好的方式去实现就可以了”,我就对它提不起兴趣了.原因是我是一个喜欢自由的人,不喜欢做事情只 ...