Welcome Guest ( Log In | Register )

欢迎访问本站。游客仅能浏览首页新闻、版块主题、维基条目与资源信息,需登录后方可获得内容发布、话题讨论、维基编辑与资源下载等权限。若无账号请先完成注册流程。
 
Reply to this topicStart new topic
> 《斧头人(Axe Man)》八月开发日志
Bozar
2019-08-20, 14:19
Post #1


GEEKs will Eventually Evolve into Kryptonians. | All my jokes are cries for help.
Group Icon
 1214
   72

Group: Avatar
Posts: 1102
Joined: 2008-05-18
Member No.: 21346




## 游戏简介

《斧头人(Axe Man)》([Github 页面](https://github.com/Bozar/AxeMan),[英文博客](https://github.com/Bozar/DevBlog/wiki/Latest))是一款正在开发的单人回合制 Unity Roguelike 游戏。[上个月](https://trow.cc/board/showtopic=48588) 以来,大部分时间都在开发技能系统。目前玩家人物可以使用技能,但是还不能用“基本元素”自行组装技能。这个系统是《斧头人》的核心特色,挺复杂的,以后有机会详细讲一讲。另外这个月还写了三篇文章,接下来分享一下其中两篇文章的内容(略有删减)。

* [Programmer's Toolbox](https://github.com/Bozar/DevBlog/wiki/Program_SoftwarePlugin)
* [How To Create An Object In Unity](https://github.com/Bozar/DevBlog/wiki/Program_CreateObjectInUnity)
* [How To Handle Player Input In Unity](https://github.com/Bozar/DevBlog/wiki/Program_HandlePlayerInputInUnity)

» Click to show Spoiler - click again to hide... «

图 1:演示动画,八月。

» Click to show Spoiler - click again to hide... «

图 2:演示动画,七月。

## 创建游戏对象

为了通过 prefab 创建游戏对象,我们可以这样做:

» Click to show Spoiler - click again to hide... «

图 3:创建游戏对象。

但是这里有几个问题。首先,输入参数是字符串,一不留神会弄错。其次,我们可能希望在创建对象时设定对象的位置,并添加更多组件。所以说,从外部看,我们需要一个黑盒子接受数据标签作为输入,输出游戏对象。盒子内部的结构如下:

» Click to show Spoiler - click again to hide... «

图 4:对象工厂框架。

本章节涉及到以下代码:

* [CreateObject](https://github.com/Bozar/AxeMan/blob/master/Assets/Scripts/CreateObject.cs)
* [Blueprint](https://github.com/Bozar/AxeMan/blob/master/Assets/Scripts/Blueprint.cs)
* [ObjectPool](https://github.com/Bozar/AxeMan/blob/master/Assets/Scripts/ObjectPool.cs)
* [ActorComponent](https://github.com/Bozar/AxeMan/blob/master/Assets/Scripts/ActorComponent.cs)
* [BlueprintActor](https://github.com/Bozar/AxeMan/blob/master/Assets/Scripts/BlueprintActor.cs)

首先,我们把黑盒子的输入参数从字符串改成自定义对象:

» Click to show Spoiler - click again to hide... «

图 5:使用自定义对象作为输入参数。

接下来,我们发布事件(AddingComponent)给当前对象添加更多组件:

» Click to show Spoiler - click again to hide... «

图 6:添加组件。

事件的订阅者根据对象标签添加相应组件:

» Click to show Spoiler - click again to hide... «

图 7:订阅事件。

最后,我们使用 Blueprint 生成每个对象的位置:

» Click to show Spoiler - click again to hide... «

图 8:生成对象坐标。

现在生成对象需要两个步骤:

» Click to show Spoiler - click again to hide... «

图 9:创建游戏对象,最终版。

## 处理玩家按键输入

最简单的输入系统是这样的:

» Click to show Spoiler - click again to hide... «

图 10:输入系统的简单实例。

但是随着游戏逻辑变得复杂起来,我们需要把代码拆分成更小的模块,比如:

» Click to show Spoiler - click again to hide... «

图 11:输入系统框架。

本章节涉及到以下代码:

* [InputManager](https://github.com/Bozar/AxeMan/blob/master/Assets/Scripts/InputManager.cs)
* [MovementInput](https://github.com/Bozar/AxeMan/blob/master/Assets/Scripts/MovementInput.cs)
* [PCInputManager](https://github.com/Bozar/AxeMan/blob/master/Assets/Scripts/PCInputManager.cs)
* [PCInputSwitcher](https://github.com/Bozar/AxeMan/blob/master/Assets/Scripts/PCInputSwitcher.cs)

首先,我们把接受输入和执行命令拆分成三个环节:

* [接受输入 --> 把输入转化成命令] --> [发布事件广播命令] --> [执行命令]

第一个环节需要至少一个命令转换器:

» Click to show Spoiler - click again to hide... «

图 12:把输入转化成命令。

接下来,PCInputManager 把命令发送给订阅者:

» Click to show Spoiler - click again to hide... «

图 13:发布命令。

执行命令与本章节无关,所以不谈了。

为了控制代码长度,我们可以创建多个转换器,每一个都实现了 IConvertInput,负责把某一组按键转化成相应的命令,比方说 MovementInput,SkillInput 和 InventoryInput。同时,稍微修改图 13 的代码:

» Click to show Spoiler - click again to hide... «

图 14:发布命令,修订版。

还有一个问题。同一个按键,比方说左方向键,既可以在地下城里让玩家人物向左移动,也可以在物品栏里让光标向左移动。我们为每种游戏模式创建一个游戏对象,每个对象有独立的输入管理器,但是共享一套转换器。考虑到转换器内部有一个 Update() 方法,我们用另一个对象 XInputSwitcher 订阅某些事件,启用或禁用管理器,就这样解决了按键冲突的问题。

» Click to show Spoiler - click again to hide... «

图 15:输入切换器。

最后献上心の俳句:高一的暑假,人生中只有 NaN 次,千万要珍惜。



This post has been edited by Bozar: 2019-08-20, 22:07
TOP
Fast ReplyReply to this topicStart new topic
 


Time is now: 2019-08-25, 04:11