Unity3D 游戏开发构架篇 ——角色类的设计与持久化

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

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

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

  早期我写角色类都是直接一个Class,然后想到什么属性就往里面添加,如果游戏过程中需要对属性的修改,逻辑判断也写在这个类中,这样必然导致类的庞大和臃肿,最后你自己也忘记了自己写在什么地方了。

  后期的逻辑如果修改了,姑且不论属性之间的互相连带和逻辑连带,你的查找就是一件麻烦事。

  这里我们讨论一下一个玩家账号多个角色的构造。

  定为一个角色类,包括玩家的疲劳,金币,元宝等等。角色类包括多个英雄对象。

  一个英雄类,包括英雄的属性,等级等等,英雄对象包括多个属性对象。

  一个属性类,包括属性的值,下一级属性的值等等。

  对这些类的修改,类的内部只提供接口,逻辑的判断存在于外部的部件中,而不是自己类的内部实现。这样代码就简洁明了不少,同样逻辑修改也只需要查找对应的部件即可。

  当然还有更复杂的,如下图所示:

  一个基础属性类衍生出来了Attribute,Virtal,SKill等等。

二、持久化的应用场景和设计思想


  角色化类创建后,这个类不论游戏的关闭和开启都要和上一次的一样。可以采用持久化的方案。C#中一般采取序列化到本地二进制文件或者XML文件等流序列化。

  当然你也可以采用Unity3D的ScriptableObject方案。

  http://blog.csdn.net/jjiss318/article/details/7195052

三、核心代码

  BaseState.CS

  基础属性类,可以枚举中动态添加

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

[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=0;
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 = 0; 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 <=0)
{
return;
}
try
{
using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
{
BinaryFormatter b = new BinaryFormatter();
//也要一个个反序列化
for (int i = 0; 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);
}

}

  搞完了英雄类和属性类的持久化,角色类的持久化也就大同小异了,不过角色也就是玩家一个游戏只有一个,也就不用枚举了。

四、总结

  考虑到英雄类和属性类的字段动态增长,可能每次游戏开辟的内存不同,那么此时反序列化的出来的数据覆盖会不会有错呢?可以考虑一下。

时间: 2024-10-10 03:56:30

Unity3D 游戏开发构架篇 ——角色类的设计与持久化的相关文章

Unity3D游戏开发之详解 Animation类和Animator类

Unity3D游戏开发之详解 Animation类和Animator类 Animation类 animation组件用于播放动画.可以指定动画剪辑到动画组件并从脚本控制动画播放.在Unity的动画系统基于权重并且支持动画融合,叠加动画,动画混合,标签和完全控制动画播放的各个方面. 如果想播放一个简单的动画,可以使用Animation.Play:如果想在动画之间交叉淡入,可以使用Animation.CrossFade:如果想改变动画模式(循环,一次,乒乓),可以改变动画导入设置里面的动画帧的Wra

Unity3D游戏开发之自由视角状态下的角色控制

在上一篇文章Unity3D游戏开发之基于Trigger的触发式动画设计一文中,博主与大家分享自己在这方面方面的一些感悟.今天呢,我们来探讨Unity3D角色控制的内容,如图是博主非常喜欢的<古剑奇谭>游戏截图,在这款游戏中就使用了博主今天要讲解的自由视角,所谓自由视角是指玩家可以按照自身坐标系向着四个不同的方向移动,当玩家按下鼠标右键时,可以绕Y轴按照一定的角度旋转摄像机,在旋转的过程中,角色将旋转相应的角度.在移动的过程中,摄像机会保持与玩家间的一定距离,然后跟随角色进行移动.好了,下面我们

第一篇:Unity3d游戏开发之移动端完整包更新方案

由于Unity没法进行热更新,也就是局部更新,所以如果你在设计之前没有考虑好使用Lua,反射,或者其他方式实现热更新,但是又要面临游戏上线那么你可以考虑使用完整包更新,其实这对于游戏包不是很大的情况下,也是一个不错的选择,当然设计者在设计之初都想好了热更新那就宁当别论了. Unity3d 在移动端考虑Android和Ios平台的完整包更新 实现逻辑: 首先检查本地的版本和服务器的版本是否相同,如果相同则直接进入游戏,如果不同则下载服务器的最新文件,然后根据最新文件到资源服务器下载最新的安装包 我

Unity3D游戏开发之自由视角状态下的角色控制(二)

在测试Unity3D游戏开发之自由视角状态下的角色控制这个项目的时候意外地发现了一个Bug.Bug出现在如下位置: [csharp] view plaincopyprint? //设置玩家跟随角度 if(Target.GetComponent<NoLockiVew_Player>().State==NoLockiVew_Player.PlayerState.Walk) { Target.rotation=Quaternion.Euler(new Vector3(0,mX,0)); } 该方法主

【Unity3D游戏开发】—— PlayerPrefs类实现本地持久化数据存储

在很多游戏中都会有"存储进度","读取进度"等菜单,或者当我们进入下一个场景时有些数据需要带入下一个场景.这就需要数据储存.Unity中提供了一个用于本地持久化保存于读取数据的类--PlayerPrefs. 它是以键值对的形式将数据保存在文件中. 下面来看看PlayerPrefs的简单用法.. //得到存储的数据 Grade = PlayerPrefs.GetFloat("mGrade", 0.0f).ToString(); //获取浮点型 Ag

Unity3D游戏开发之如何截屏的技能培训

下面我们开始今天的Unity3D技能培训. 我们学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发. 今天我们来做点简单的东西,做个什么呢?答案就是截屏.作为一名热爱单机游戏的玩家,每次在玩游戏的同时截取游戏中比较喜欢的画面,特别是学习了Unity3D以后玩游戏的时候更多地是从一个游戏设计者的角度来看待游戏,换句话说,可能关注技术的成分更多一点吧.比如在写<Unity3D游戏开发之自由视角下的角色控制>和<

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

提要 此篇是一个国外教程的翻译,虽然有点老,但是适合新手入门.自己去写代码,debug,布置场景,可以收获到很多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一篇中,我们学会了怎么在Unity中搭建游戏的场景,并且设置模型的物理属性. 在第二篇中,我们学会了怎么在unity中使用脚本,并且创建了大部分的游戏逻辑,包括投球和得分! 在这最后一节中,我们将会为用户创建一个菜单系统,并且和GameController进行交互,我们开始吧. 在设备上测试 到目前为止,

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

一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被.机械等等,比如一个大楼的3D模型图.3D模型也包括玩具和电脑模型领域. 互联网的形态一直以来都是2D模式的,但是随着3D技术的不断进步,在未来的时间里,将会有越来越多的互联网应用以3D的方式呈现给用户,包括网络视讯.电子阅读.网络游戏.虚拟社区.电子商务.远程教育等等.甚至对于旅游业,3D互联网也能

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

大家好,我是秦元培.欢迎大家关注我的博客,我的博客地址是:blog.csdn.net/qinyuanpei.终于在各种无语的论文作业中解脱了,所以立即抓紧时间来这里更新博客.博主本来计划在Unity3D游戏开发之从<魂斗罗>游戏说起(上)--目标追踪这篇文章后再写一篇<Unity3D游戏开发之从<魂斗罗>游戏说起(下)>,只是眼下博主的项目进度有些缓慢,所以想等项目稳定下来以后再和大家分享. 作为大家等待博主更新博客的回报,我们今天来说一说Unity3D中的游戏场景异步