本项目复刻了经典卡牌桌游《三国杀》,玩法类似于《三国杀》中的“统帅三军”模式,即双人对战,一人操作多名角色。游戏同时支持单机模式和联网模式,实现了BP系统、多人回合制、出牌系统、武将技能等核心游戏逻辑,以及注册登录、游戏大厅、房间系统等服务。
开发环境: Unity2021.3.2f1c1
下载源码:
git clone https://github.com/wyx-0203/sgs-unity.git --depth 1
用Unity打开项目,导入 sgs.unitypackage (包含武将、皮肤等资源):
进入Game
场景,运行项目,即可开始游戏 (单机模式)
游戏由3个场景组成,分别是登录界面Home
、大厅界面Lobby
、游戏界面Game
。
脚本部分分为4个程序集:
GameCore
: 游戏逻辑模块。
Skills
: 武将技能模块,依赖于GameCore
。
Unity
: 视图模块,用于接收消息并更新游戏场景。
Model
: 模型模块,定义GameCore
和Unity
之间的各种消息体,通常会序列化为json
。
其中,GameCore
、Skills
、 Model
都不包含Unity引擎代码,并作为类库项目被服务端程序引用。
调用GameCore.Game
对象的Run()
方法即开始一局游戏。单机模式下,进入场景时自动执行。联网模式下,由服务端执行。
所有卡牌、武将的基本信息,以json
或ScriptableObject
的形式存储在StreamingAssets
中,
技能的具体实现写为C#
脚本。
若要实现联网功能,需在服务器(或本地)运行服务端程序。本项目的服务端部分(暂未开源)使用.Net Core
和SignalR
实现房间系统,使用Go
语言实现网关、鉴权等常规后端服务。服务之间通过gRPC
通信。
Game
游戏主类: 进入游戏场景时开始执行async void Run()
,并由其调用BP系统、回合系统等,类似于Main()
函数
BanPick
BP系统: 玩家将在BP阶段依次禁用一名武将,选择八名武将,最终挑选三名武将出战
CardPile
牌堆
TurnSystem
回合系统
GameOver
游戏结束
PlayQuery
出牌请求: 需要玩家操作时(如出牌、询问技能),创建一个PlayQuery对象,并调用async Task<Bool> Run()
函数,这将暂停当前线程,直到收到玩家操作后返回一个PlayDecision
对象
Player
玩家类
PlayerAction
玩家行为基类: 例如摸牌、受到伤害等
Card
卡牌基类
Skill
技能基类
BanPick
BP界面
PlayArea
操作区: 包括进度条、确认/取消等按钮,轮到自己操作时显示
CardArea
手牌区
EquipArea
装备区
SkillArea
技能区
DestArea
目标区
DiscardArea
弃牌堆
CardPanel
卡牌面板: 需要选中其他角色卡牌时显示,例如使用”过河拆桥“、“突袭”时
Audio
音效
Player
玩家
Card
卡牌
CardSystem
卡牌动画系统: 卡牌的位置由其父对象的位置和布局组决定,而通过这种方式只能瞬间移动卡牌,没有过渡效果。这里的解决方案是每张卡牌对应一个透明等长的Target
对象,由Target
在布局组中切换,卡牌实体则逐帧向Target
靠近。
ABManager
AssetBundle管理器
Singleton
单例模式基类
WebRequest
向服务器发送HTTP请求,并返回响应
Connection
SignalR
客户端,用于连接房间服务器
HttpResponse
Http响应消息基类Message
游戏消息基类 (SignalR)Card
卡牌信息General
武将信息