[Unity项目整理] MMORPG类——客户端(二)(基础模块)

角色控制系统

协议

配置表

模型层
User 单例类
字段:NUserInfo网络用户信息消息
字段:NTeamInfo网络团队信息消息
属性器:NCharacterInfo网络当前角色信息消息
属性器:MapDefine当前地图信息
属性器:GameObject当前角色的游戏对象

AddGold方法(参数:增量)
当前角色金币增加

SetupUserInfo方法(参数:NUserInfo)
对网络用户信息消息进行赋值

实体层
Entity 实体类,基类
字段:实体ID(同一个地图)、UnityEngine.Vertor3Int类型的位置pos、方向dir、速度speed
属性:网络消息实体数据NEntity,get调用UpdateEntityData方法,set调用SetEntityData方法
构造函数(参数:网络消息NEntity):对维护的字段进行赋值,调用SetEntityData方法
服务器端的数据转换到客户端上的数据

SetEntityData方法(参数:NEntity)(先执行)
NVector3格式数据转换成Vector3Int类型数据

UpdateEntityData方法(参数:NEntity)(后执行)
Vector3Int格式数据转换成NVector3类型数据

【注释】Vector3Int类型表示Vertor3数据只要INT整形

Character 角色类,继承Entity
字段:NCharacterInfo网络传输角色信息消息
字段:角色配置表CharacterDefine
属性器:只读Get,返回角色名称Name和ID
属性器:只读Get,是否是玩家,返回bool
构造函数(参数:NCharacterInfo):base并调用的父类Entity的构造函数,赋值角色信息,角色配置表赋值

MoveForward方法 :设置速度为配置表默认速度
MoveBack方法:设置速度为配置表默认速度
Stop方法:速度为0
SetDirection方法(参数:Vector3Int):方向赋值
SetPosition方法(参数:Vector3Int):位置赋值

游戏对象层

EntityController 实体控制器
脚本(绑定在玩家角色身上),主要是用来控制实体对象的动画、行为。
字段:动画、刚体、动画当前状态、实体、客户端的位置、方向、旋转、上一个位置、上一个旋转量、速度、动画速度、跳跃力量、是否为玩家

Start初始化
如果实体不为空
将实体注册到实体管理器当中EntityManager,RegisterEntityChangeNotify
然后更新角色的变换组件UpdateTransform方法
如果这个实体不是玩家,就禁用重力

UpdateTransform方法
将实体的位置、方向数据转换到世界坐标系当中
将刚体移动到指定位置
实体forward复制
上一个位置和旋转赋值

在FixedUpdate中更新角色变化组件
动画实体事件OnEntityEvent,播放动画用~

PlayerInputController脚本类
字段:刚体Rigidbody、角色状态CharacterState、Character、旋转速度、转向角度、速度、是否在空中
字段:实体控制器

Start方法
默认站立姿势
GameObjectManager传过来的Character数据,如果没有角色Character数据,新建一个,主要就是防止报错

FixedUpdate物理更新
要判断是否在打字中,禁用输入控制
获取垂直方向的GetAxis
如果>0 状态设为移动,调用角色移动方法,发送实体事件(播放动画)
刚体实际移动rb.velocity速度
如果<0 如果=0的情况,同理

获取水平方向的GetAxis
将这个游戏对象transform.Rotate绕Y轴旋转,X轴和Z轴为0
角色方向从逻辑坐标Vertor3Int转换成世界坐标
创建一个四元数旋转SetFromToRotation
判断这个四元数旋转的欧拉角.y 是否大于定义的旋转角度
如果是,就对角色重新设置direction
角色刚体的前方重新设置成transform的forward
发送实体事件为none

LateUpdate最后更新,计算位置数据
位置偏移量、速度,如果位置大于50,就需要强制同步,设置角色的位置并保存在character里
发送实体事件:播放动画并且还需要像其他人发送同步事件SendEntityEvent

SendEntityEvent方法(EntityEvent entityEvent,int param=0)
如果实体控制器不为空,调用OnEntityEvent方法
调用MapService的SendMapEntitySync方法,同步动画事件

管理器层
GameObjectManager游戏对象管理器(单例类)
字典,存储每一个游戏中的角色对象,并在GameObjectManager对象下实例化

进入地图时进行角色对象初始化
初始化在CharacterManager角色管理器中所有的角色
先判断字典中是否已经存在了这个游戏对象
读取资源文件中的预制体
判断资源是否存在
实例化游戏对象,在GameObjectManager的根节点下
名称自定义
将游戏对象存储到字典当中
创建出对象的同时,还要创建出伴随角色的血条
初始化角色对象的其它信息
位置信息
获取entityController,并将character信息传递给实体控制器
获取PlayerInputController,并将character信息传递给输入控制器

离开地图时销毁角色信息

9、客户端GameObjectTool工具类
网络数据传过来的数值,转换成世界坐标

10、客户端MainPlayerCamera
LateUpdate中更新
判断摄像机是否存在角色对象
为空,就把当前游戏对象赋值,或者在GameObjectManager里初始化时赋值
然后将玩家的位置信息传递给摄像机的位置信息

11、客户端CharacterManager角色管理器
字典:存储所有进入地图角色,key是实体ID
监听角色进入和离开的地图事件
Clear方法:清空字典,并移除所有角色对象
RemoveCharacter方法:实体管理器移除这个实体ID的游戏对象、回调方法角色离开地图(通知其他实体)
AddCharacter方法:字典添加新的游戏对象,实体管理器添加这个游戏对象,回调方法角色进入这个地图(通知其他实体)

服务层
MapService 地图服务
MapService角色进入地图来自服务器端的响应OnMapCharacterEnter
遍历在这个地图上的所有角色List
判断进入的角色是否是当前玩家信息NCharacterInfo
加入角色管理器CharacterManager当中
判断角色ID所在地图ID
加载地图资源,切换场景

角色、NPC、野怪信息显示

客户端UINameBar
客户端UIWorldElement
客户端UIWorldElementManager

小地图

客户端UIMiniMap
客户端MiniMapManager

移动同步

状态同步,较多逻辑在服务器,较为安全,服务器压力大,客户端需要做一下插值,卡顿优化等

协议NEntitySync 实体同步消息
实体id,实体事件,实体消息NEntity
响应和请求
地图同步请求和响应
请求 NEntitySync 一个
响应 多组NEntitySync集合

同步流程
PlayerInputController发送SendEntityEvent事件并播放动画
MapService中转一下,发送SendMapEntitySync(同步事件,角色实体数据)
网络端发送给服务端
服务端将实体同步转发给其它的实体,发送响应,包含实体同步集合
遍历每一个实体同步集合
EntityManager对实体先进行更新实体数据OnEntityEvent
实体管理器更新位置进行动画事件,对订阅Notifier的观察者回调方法,传入数据
EntityController对实体管理器发送动画事件变化,已经实体发生变化

通过一个接口来对事件作管理
EntityController注册了实体管理器中的接口通知

道具系统

背包系统

商品系统

1.配置表和对应的类
Excel表格ShopDefine和ShopItemDefine
Shop包含了Key1,id、name、description、icon目录、status状态
ShopItemDefine表格包含了Key1代表哪一个商店、Key2代表顺序、ItemID、Count、Price、Status和描述
Status状态1表示启用、0代表禁用,1启用某道具某商店
对应的ShopDefine和ShopItemDefine无其他扩展

2.Protobuf协议
商店道具购买请求和响应ItemBuyRequest/Response
客户端发出的请求包含ShopID和ShopItemId和ShopItemCount
商店ID,商店道具ID和数量

3.客户端ShopManager
注册NPC管理器,进行交互,ShopManager提供给NPC管理器回调方法:打开商店的功能:判断数据管理器是否有这个商店ID,显示商店界面并设置商店界面
发送购买请求的方法,传入ShopID和ShopItemID和ShopItemCount
接收购买响应的方法,提示成功或者失败

4.客户端ItemService
向服务端发送购买消息SendBuyItem
收到服务端响应的消息,成功或者失败

装备系统

Protobuf协议
道具类型添加一个装备

客户端
DataManager需要从Data文件夹里读取装备定义表格

状态消息通知系统

1.ProtoBuf协议
NStatus状态消息,包含STATUS_TYPE、STATUS_ACTION、ID、Value
状态类型(钱、经验、技能点、道具等等),状态行为(增加、删除、更新)
StatusNotify状态通知消息
状态消息的集合,repeated NStatus
放在NetMessageResponse里,说明这是从服务端发给客户端的内容

2.客户端StatusService
状态服务层用来接收服务端发来的状态变化
注册状态通知事件方法:用来在字典中存储回调方法
订阅服务端的传输事件,回调OnStatusNotify方法
调用通知,状态类型是否金钱,是否增加或减少

3.ItemManager
初始化的时候,注册状态通知消息,调用OnItemNotify,钱增加还是减少

任务系统

在这里插入图片描述

UI层
UINpcDialog类,Npc对话框
UIQuestDialog类,任务详情框
UIQuestSystem类,任务系统界面
UIQuestInfo类,任务系统界面右侧任务系统界面
UIRewardItem类,单个奖励道具
UIQuestItem类,单个任务道具
UIQuestStatus类,NPC头上显示任务状态

配置表
QuestDefine配置表=
任务ID,任务类型(枚举),前置任务,职业限制,等级限制
任务接取NPC,任务提交NPC
各种情况下的任务对话
任务目标1类型(枚举)以及数量
任务奖励道具,金币以及数量

协议
NQuestInfo网络消息
任务ID
任务状态
任务目标数组
网络响应和请求消息
QuestListResponse任务列表响应消息
QuestAcceptRespnse接受任务响应消息
QuestSumbitRespnse提交任务响应消息

模型层
Quest 任务
存储:任务配置表和任务网络消息
构造函数重载初始化(参数:任务网络消息)
构造函数重载初始化(参数:任务配置表)

管理器层
QuestManager 任务管理器
枚举:NPC任务状态(拥有已完成可提交任务,拥有可接受任务,拥有未完成任务)
列表存储:任务网络消息
字典存储:玩家身上可以拥有的的任务,key为npcID,(包括已接取的任务,为接取但可以接取的任务)
字典内嵌字典存储:Dictionary< int , Dictionary < NpcQuestStatus , List < Quest > > >

Unity事件:任务状态改变(回调某方法)

Init初始化(参数:网络消息列表)
网络消息列表赋值
玩家身上可以拥有的的任务清空
Npc身上所拥有的任务清空

InitQuests初始化任务(Npc和玩家)
遍历任务消息列表,实例化任务模型
重新存储:所有任务[任务ID和任务对象]
CheckAvailableQuest 查找符合要求的任务,存储到玩家所拥有的任务中
遍历所有任务
AddNpcQuests添加到各个对应的NPC任务当中,AcceptNPC和SubmitNpc(任务发布NPC和任务提交NPC)

CheckAvailableQuest方法
遍历数据管理器读取的任务配置表
检查任务的职业限制,玩家的等级是否不符合
检查是否所有任务是否已存在这个任务
判断该任务是否有前置任务
前置任务是否未接取,是否未完成
如果不符合以上要求,就把这个任务加入到玩家身上的所有任务字典中

AddNpcQuest添加NPC任务(参数 :npcID,任务)
先判断Npc任务字典中是否存在这个NpcID为Key值的内嵌字典,没有就new一个
三个任务列表,分别表示可接受任务,已完成任务,未完成任务
如果在NPC任务中[NpcId],不存在可接受任务,就将其填入内嵌字典
同理已完成任务和未完成任务
如果网络任务消息为空,那就是说明是发布任务的NPC,分可接受任务状态,将其存储到NPC字典当中
如果网络任务消息不为空,那就是说明是提交任务的NPC,分进行中,和已完成状态,将其存储到NPC字典当中

GetNpcStatusByNpc方法(参数:npcID)
字典< NpcQuestStatus , List< Quest > > 临时存储状态
判断NPC所有任务中是否存在传入的NPCID,输出到上面字典
根据NPC当前某个任务状态数量>0 ,就返回当前对应的状态
比如任务完成的数量>0 就返回 NpcQuestStatus.Complete

OpenNpcQuest方法(参数:npcID)
作用:点击NPC显示相应的对话框
字典< NpcQuestStatus , List< Quest > > 临时存储状态
判断NPC所有任务中是否存在传入的NPCID,输出到上面字典
根据NPC当前某个任务状态数量>0 ,显示对话框调用ShowNpcDialog方法,就返回true

ShowNpcDialog方法(参数:Quest)
作用:显示对话框
如果是还没有网络任务消息,那就是还没接收新任务
NpcDialog类,显示对话内容
点击下一步,显示具体任务ShowQuestDialogInfo方法
同理,已完成任务,进行中任务,打开相应对话内容

ShowQuestDialogInfo方法(参数:Quest)
判断是否是新任务还是任务已完成
UIManager打开UIQuestDialog界面,设置任务对话,预制体设置可见,注册关闭时间
判断是否是进行中任务,判断任务进行中的对话框是否为空字符串,NpcDialog类调用Show对话框

RefreshQuestStatus方法(参数:NQuestInfo)
刷新任务状态
临时字段:Quest quest
先清空NPC身上的所有任务
判断所有任务中如果包含此questInfo任务ID
存在,所有任务的任务信息赋值,且将allQuests的对应值 赋值给临时变量 quest
调用自身方法,检查可用的任务,CheckAvailableQuest方法
遍历所有的任务,添加到对应npc任务里
如果状态改变事件不为空,被注册了,就调用此委托传参临时变量quest (由UI来注册并回调方法传入参数)
返回临时变量quest

OnQuestDialogClose方法
关闭对话框
选择yes就是接受任务或者提交任务
调用QuestService的SendQuestAccept方法和SendQuestSubmit方法
选择no显示拒绝对话内容

OnQuestAccepted方法
接受网络消息传来的接受任务信息,QuestService来调用此方法,并传入参数
刷新并显示接完任务后的对话

OnQuestSubmited方法
接受网络消息传来的提交任务信息,QuestService来调用此方法,并传入参数
刷新并显示接完任务后的对话

服务层
QuestService 任务服务
单例类,继承IDisposable
构造函数:
给QuestAcceptResponse响应注册事件OnQuestAccept
给QuestSumbitResponse响应注册事件OnQuestSumbit

OnQuestAccept方法
日志
判断如果响应结果是成功的
调用QuestManager的OnQuestAccepted方法,传入参数response.Quest
响应结果失败,就显示警告框

OnQuestSumbit方法
日志
判断如果响应结果是成功的
调用QuestManager的OnQuestSubmited方法,传入参数response.Quest
响应结果失败,就显示警告框

SendQuestAccept方法(参数:Quest)
日志
新建包NetMessage
实例包请求
实例包任务接受请求
填充包任务接受请求数据,任务ID
NetClient发包

SendQuestSubmit方法(参数:Quest)
日志
新建包NetMessage
实例包请求
实例包任务提交请求
填充包任务提交请求数据,任务ID
NetClient发包

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity3D格斗游戏源码是一种让开发者能够开发自己的格斗游戏的一种资源,而“仿最终幻想”是模仿最终幻想系列游戏来设计和开发的游戏。这种源码提供了许多基本的游戏元素和功能,开发者可以根据自己的需求来创建自己想要的游戏。 在Unity3D格斗游戏源码中,主要包含了以下几个方面的内容: 1. 角色控制:开发者可以通过源码来实现角色的移动、攻击、防御等基本动作。游戏中的角色可以使用键盘、鼠标或者手柄进行操控,使得玩家能够与游戏世界进行交互。 2. 动画系统:为了增强游戏的流畅性和真实感,该源码还提供了动画系统。开发者可以根据需要创建角色的各种动画,例如攻击动画、受伤动画和死亡动画等,使得游戏体验更加逼真。 3. AI系统:为了让游戏增加一定的挑战性,该源码还提供了AI系统。开发者可以通过代码设置敌方角色的行为和策略,使得游戏中的敌人具有一定的智能和反应能力。 4. 特效和音效:为了提升游戏的视听效果,该源码还包括了一些特效和音效资源。开发者可以根据自己的需要添加各种特效和音效,增强游戏的氛围和乐趣。 5. 可定制性:该源码还提供了一些可配置的参数和选项,开发者可以根据自己的需求来调整游戏的各种设置,包括角色属性、技能系统和游戏难度等,以便创造出不同的游戏体验。 总之,Unity3D格斗游戏源码可以帮助开发者快速搭建一个仿照最终幻想系列的格斗游戏。通过使用该源码,开发者可以省下许多开发时间和精力,同时也能够在这个基础上进行次开发,实现自己的创意和想法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值