1.ini文件解读
感谢Trendy,感谢Jeremy Stieglitz的慷慨。给我们提供了另一款珍贵的虚幻开源游戏ChickenCoup。今天我要开始解刨这款游戏。
先从配置文件研究起,在DefaultGame.ini文件中有一行[ChickenGame.ChickenGame]下
+RequiredMobileInputConfigs=(GroupName="MainGroup",RequireZoneNames=("MainView")) 这里添加了一个主界面,as I know。回头我再仔细看看和代码中是怎样结合的。
当然他们的游戏类型和包的目录在ChickenGame.ChickeGame中。
2.代码分类
总的来说,ChickenCoup的代码比DungeonDefense的要少不少。毕竟这属于迷你游戏。要是能找到珍贵的IAP代码段就最好不过了。程序员要善于利用工具和摸索自己的套路。zuckerberg在黑别人宿舍的照片时不正是这样吗;)
有一个成就管理器AchievementManager让你能学会怎么解锁成就。AntGame中可能很需要这个玩意。例如关卡解锁,武器解锁(IAP少不了),主角技能在满足一定条件的解锁。
当然AIControlle是必不可少的,据我所知,这个游戏中除了有三种不同的鸡和狐狸。另外主角pawn是否会有呢?带着这个疑问我将继续往下挖掘。
因此狐狸和鸡分别继承了ChickenAIController,在我的AntGame中AI的集成还非常的乱,因此我得重新组织一下类的继承关系。AIControllerFox,AIControllerChicken。
ChickenGame是定义游戏规则的地方。在这款游戏中有玩家的得分,无论对于什么类型的游戏开发,积分系统意味着很多,包括金钱,里程碑。因此这一部分得认真的研究。
这里好像还有一个生命系统,玩家玩了多少条命。以及鸡的生成器,这似乎对线性关卡的AntGame暂时用不到。不过谁又知道呢,多学学是有好处的。
看到了一个变量var Font FloatingScoreFont 关于字体的知识一直是我要想办法解决的。这肯定是一个切入点。var Color HighScoreColor 给字体赋予颜色,也非常棒,主角快要死的时候显示血。不过我认为现在的血槽也工作的非常棒。
写了一个GetAchievementManager方法。在PostBeginPlay中写了很多和Achievement相关的SetTimer函数。记录了LostChicken函数。
PostRender准备在HUD中做一些准备。
DoGameOver函数,便利了WorlInfo.AllControllers(class'ChickenPlayerController',PC)从来没有使用过这个先mark一下。因为在Controller中实现了OpenMenuScene,Controller对于iOS的Menu很重要。
有一个音乐函数PlayHighScoreMusic对于在特殊事件中播放一段特制音乐非常有帮助,应该学习一下。
一直没有学习过LeaderBoard现在可以见识了。
以前说过一个牛逼的函数,可以让一款游戏有不同的类型,SetGameType。适合的时候这个功能非常强大。
LoadMenu就是ConsoleCommand中打开一张新地图。
最后在defaultproperties中看到了pawn和controller,hud。以及各种变量。archetypes原型是必不可少的地方。
ChickenGameOverHUD游戏结束HUD。这里像定义基本的AntGame按钮一样,Event OnTouch函数,分别是leaderboard,restartLevel,MainMenu。
ChickenHighScore是继承自Object的。
ChickenHUD继承自MobileHUD。这里定义了字体Font,最高分,透明度,bFadingOUt这可是非常珍贵的变量,后边要使用一种时间停止技能让屏幕显示一些特效HUD。
LeaderBoard有两个类,分别是Read和Write。我最后再研究这个系统。
MainMenu同样继承自MobileMenuBase关于MobileMenuScene只间的区别。现在就去搜(似乎在这个破网速下我没有得到自己想要的答案)
但我学到的新内容是,这两个类都可以使用。但是最大的问题来了只有MobileMenuScene才能显示我自定义的按钮,对于这一点的应用我只能说在设计界面的时候我将会用到MobileMenuBase,而在做游戏中使用的按钮时使用MobileMenuBase.
前面提到过SetGameType函数在GameInfo中,因为这款游戏有两套游戏类型。ChickenMenuGame就是一种,他继承自MobileMenuGame,有必要研究一下MobileMenuGame到底是怎么回事。还得思考一下,为什么不使用ChickenGame游戏类型,仅仅是因为游戏控制的需要吗?的在该函数中定义了加载地图,获取最高分,排名榜。
这个游戏中有三种Pawn,Chicken,Rooster,Fox。为了更好的学习原型(看到评论中有一个伙计问我问题,我没有理他sorry。我现在再讲一讲让你看看能不能学动。)得认真的学习这个类。 每个pawn都能被玩家拖动drag 以及将东西拖动,的速度。其实这个类中有许多有用的功能需要学习,例如拖动一个东西。拖动的动画执行SetAnimState,改变一个物体的碰撞SetCollisionType(COLLIDE_BLOCKALL)。
因为每个pawn被拖动的时候都会执行一个动画状态,研究动画树然后在代码中学习看看物体是怎样被执行动画的,真的简洁明了。
狐狸和鸡分别将pawn中的内容细化。
PlayerController是非常重要的内容,细化到具体的操作。 MobilePlayerInput是iOS设别的输入操作,在变量里面进行了声明。MobileInputZone是输入操作的区域。
var vector TraceExtent;
非常重要的函数:
function bool ProcessInput(MobileInputZone Zone,float DeltaTime,int Handle,EZoneTouchEvent EventType,Vector2D Touchlocation)
function Actor TraceTouchLocation(pawn TraceOwner,out vector HitLocation,out vector HitNormal,vector End,vector Start)
鸡仔生成器。有一个注册函数需要注意一下。
鸡仔生成器管理器。
enum GameRate{GR_Slow,GR_MEDIUM,GR_FAST};调节游戏的速率。
关系到控制生成pawn的量,生成某pawn的速率。pawn的生成区域。调节游戏节奏。
危险体积。感谢强大的虚幻引擎,体积是最好写的类之一。单单定义两个函数Touch和UnTouch便可以实现体积给你的强大功能。
接口到现在还是让我头疼的地方,在这个游戏中。因为实现了一种酷炫的拖曳链而不得不采取接口这种方式,不过也好,正好得加强这部分的知识点。
记着之前实现过kismet结合改变主角衣服的系统,kismet节点在这里重写用于调节游戏的速率变化和音乐变化。