在游戏开发中,游戏角色占了很大的篇幅,可以说游戏中所有的内容都是由主角所带动。这里就介绍一下角色类的设计和持久化。

一、角色类应用场景和设计思想

  游戏中的角色类型不一而足,有不同的技能,有不同的属性等等。有些一个玩家只有一个角色,有些一个玩家可以有多个角色。这里就目前项目来描述一下角色类的构造,思路都是类似的。

  早期我写角色类都是直接一个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 游戏开发构架篇 ——角色类的设计与持久化的更多相关文章

  1. Unity3D 游戏开发架构篇 ——性格一流的设计和持久性

    在游戏开发.游戏人物占了非常大的空间.所有内容都是由主角可以说游戏驱动. 下面来介绍一下一流的设计和持久性的作用. 一.应用场景 游戏中的角色类型不一而足,有不同的技能.有不同的属性等等.有些一个玩家 ...

  2. Unity3D 游戏开发构架篇 ——输入控制

    临近毕业之初.进入Unity3D这个行业,是一家小工作室.老板人非常不错,公司氛围也非常单纯.近期公司开发一款小游戏,初次上手,颇多周折,记录下自己的开发心得.主要涉及一些设计理念,互相交流. 先说下 ...

  3. Unity3D 游戏开发构架篇 —— 动态大场景生成 = 区域加载+对象池管理

    项目做一个类似无尽模式的场景,想了一想,其实方法很简单,做一个相关的总结. 主要先谈一谈构架,后期附上代码. 一.区域加载 其实无尽场景的实现很简单,因为屏幕限制,那么不论何时何地,我们只能看到自己的 ...

  4. Unity3D游戏开发从零单排(四) - 制作一个iOS游戏

    提要 此篇是一个国外教程的翻译,尽管有点老,可是适合新手入门. 自己去写代码.debug,布置场景,能够收获到非常多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一 ...

  5. Unity3D游戏开发初探—2.初步了解3D模型基础

    一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...

  6. [Unity3D]Unity3D游戏开发之飞机大战项目解说

    大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...

  7. [Unity3D]Unity3D游戏开发《反对》说到游戏(上)——目标跟踪

    朋友,大家好.我是秦培,欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 首先博主要自我反省,过了这么久才来更新博客,这段时间主要是在忙着写期末的作业,所以博主基本上没 ...

  8. [Unity3D]Unity3D游戏开发之异步记载场景并实现进度条读取效果

    大家好,我是秦元培.欢迎大家关注我的博客,我的博客地址是:blog.csdn.net/qinyuanpei.终于在各种无语的论文作业中解脱了,所以立即抓紧时间来这里更新博客.博主本来计划在Unity3 ...

  9. 从一点儿不会开始——Unity3D游戏开发学习(一)

    一些废话 我是一个windows phone.windows 8的忠实粉丝,也是一个开发者,开发数个windows phone应用和两个windows 8应用.对开发游戏一直抱有强烈兴趣和愿望,但奈何 ...

随机推荐

  1. git与github

    Git-版本控制,多人协作,分布式: Github-开源项目,远程仓库: 我在github上建立了一个仓库 https://github.com/abcd/2016ife: 现在我要把它下载到本地: ...

  2. http: URL、请求方式

    URL:统一资源定位符,可以从互联网得到和访问资源,是标准资源的位置 结构包括协议.服务器名称(IP地址).端口(有的服务器需要).路径.文件名 协议:告诉浏览器如何处理打开的文件,常用的就是http ...

  3. 反射-Reflect

    1.得到一份Class(同一个类在JVM中只有一份字节码) 三种方式:类名.class, Class.forName("全限定名");, 对象.getClass(); 基本类型 i ...

  4. 【转载】DataGridView 使用集合作为数据源,并同步更新

    原文地址:http://hi.baidu.com/netyro/item/7340640e36738a813c42e239 今天做项目时遇到一个挠头的问题,当DataGridView的数据源为泛型集合 ...

  5. C#各种常用开源框架-支持开源!分享!

    下面罗列了开发及学习过程中所涉及的开源类库的列表! AForge.NET Accord.NET NAudio nVLC Speex C# WebServer FFmpeg FFmpeg.NET Flo ...

  6. linux命令详解之chkconfig命令使用方法

    介绍一个linux常用命令,chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:c ...

  7. svn 清空

    SVN是目前用得比较多的而且很方便的版本管理体系. 在开发过程中遇到了这样的问题: 有时我们需要一个干净的code版本,没有 .svn 这些文件夹记录的版本传到服务器上使用. 这个时候自己一个个去删除 ...

  8. EF-Code First 入门

    本文程序基于VS2015.EF6.1,本文不做过多深入讨论,只是个入门. EF 就是微软的 EntityFramework,主要分为 DB First,Model First,Code First.之 ...

  9. 连续子数组的最大和/1007. Maximum Subsequence Sum (25)

    题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...

  10. 【转载】Powershell设置世纪互联Office365嵌套组发送权限

    Start-Transcript ".\Set-GroupSendPermisionLog.txt" -Force function Get-DLMemberRecurse { $ ...