zoukankan      html  css  js  c++  java
  • 0:地牢守卫者开发框架

      最近要着手开发一款塔防游戏,之前还没有过塔防类型游戏开发经验。因此从开源的《地牢守卫者》代码研究。

      《地牢守卫者》的制作人写了一组博客对其源码进行了大概阐述。我在这里先进行解读。

      地牢守卫者是一款虚幻引擎开发的游戏,代码主要由unrealscript书写。为了方便观察源码,我使用了UnCodeX来进行观察。

      

      GameInfo中进行了pawn和controller的生成,作者使用了UpdateViewTarget改变摄像机视角,我将会使用controller中的GetPlayerViewPoint函数进行视角的改变。同时提到了使用RinterTo和VinterpTO来进行插值。

      同时作者重写了PlayerMove函数,使Pitch方向无效只是改变yaw方向,还记得PlayerMove中的NewAccel和PlayerInput结合决定了玩家的移动方向。因为地牢守卫者是使用鼠标的方式映射的,所以使用了canvas中的deprojected来进行投影的,这通过了屏幕坐标到游戏世界坐标的映射。

      有一个重要的功能vector>>rotation可以将现今的全局坐标以rotation为局部参考系进行转换。在这里将进行摄像机的转换。

      接下来是武器系统,继承了Weapon类,同时让魔杖有蓄力攻击的技能。并且细分了projectile类,使射弹以后有不同的特性。

      使用Archetype将会比硬编码更为方便以及直观调试,这只需要在spawn中标明生成多个actor template。

      AIController是敌人类的控制器,完善了近战goblin。AIcontroller用一套state来完成,在选择敌人时将会foreach AllActors,每个actor的属性都完成了自己的接口函数interface,这些接口都返回了他们的权重以便让敌人选择自己的TargetEnemy。AIController的另一项重要功能是要完成寻路。最让制作人得意地可能是goblin的近战攻击了,结合动画编辑器给goblin进行了一个动画notify,同时在手上有一个插槽socket,每次执行一次攻击动画来跟踪其位置,这样插槽扫过敌人将会对敌人造成伤害,同时在攻击动画发起时,会组建一个Actors列表以使一个actor每次只挨一下打击。 

      下来是建立一个Turret了,用一个Timer来让其选择其敌人,并且在动画书中建立一个骨骼叫做LookAt Bone Conroller,只是让其告诉塔朝哪里看即可。

      最后是需要保护的奶酪了,用interface的好处是不同类的分支可以实现一些类似的函数机制这里是TargetWeighting,这里可以标注玩家和奶酪的不同权重。 

      最重要的是怎样生成敌人攻击波,这可以使用kismet或是单独写一个spawner了。

      自动瞄准系统的算法通常如下:这要根据目标点的位置以及玩家角色的转向来判断,Normal(Enemy.location-Location) Dot vector(Rotation);如果还有需要可以增加目标权重因素。

      使用自动寻路的方法比较简单,仅仅将Pylon Actor放置在场景中然后编译路径即可。将这些代码写在Controller中。

    function InitNavigationHandle()
    {
    if( NavigationHandleClass != None && NavigationHandle == none )
    NavigationHandle = new(self) class'NavigationHandle';
    }

    event vector GeneratePathToActor( Actor Goal, optional float WithinDistance, optional bool bAllowPartialPath )
    {
    local vector NextDest;

    //set our return value equal to our destination Actor’s Location.
    //In case it’s directly reachable or pathfinding fails, we’ll just return this.

    NextDest = Goal.Location;

    if ( NavigationHandle == None )
    InitNavigationHandle();

    //if the Actor isn’t directly reachable, then try to find the next navigation point towards it.
    //Otherwise we’ll just return its location to go there directly.

    if(!NavActorReachable(Goal))
    {
    class'NavMeshPath_Toward'.static.TowardGoal( NavigationHandle, Goal );
    class'NavMeshGoal_At'.static.AtActor( NavigationHandle, Goal, WithinDistance, true );
    if ( NavigationHandle.FindPath() )
    NavigationHandle.GetNextMoveLocation(NextDest, 60);
    }

    NavigationHandle.ClearConstraints();

    return NextDest;
    }

    下面这些代码写在状态中:

    //WithinRange just checks a small distance from the TargetActor,
    //
    otherwise just keep moving whereever GeneratePath tells us to go.

    while(!WithinRange(TargetActor))
    {
    MoveTo(GeneratePathToActor(TargetActor),none,30,false);
    Sleep(0);
    }

     接下来做一个塔的抽象类TowerPlacementHandler,TPH类包含了所有放置的抽象功能实现,在PlayerController的PostBeginPlay中将会对TPH进行初始化。TPH没有物理表现,但是有component来表现其放置状态。同时在TPH中建立了一个名为TowerPlacementEntry的结构体,该结构体中描述了塔类的mesh,碰撞,原型。以及一个SkeletalMeshComponent。

    同时在playerController中添加了TPH放置状态,该状态会锁定playerInput操作,同时会重新布置摄像机的视角。利用映射的技术来塔选定后的放置贴花,以及建立一个碰撞检验看他是否能在那个区域放置。使用一个materialInstance颜色表现能否放置该塔。

      将敌人杀死后能生成金币,改金币继承KActorSpawnable类,该类设置bWakeOnLevelStart=true,并且关闭碰撞,同时使用一个VRand函数和OverLapping将他吸向玩家,接触到玩家后Destroy(),但是PlayerController中添加相应的分数。

      升等级状态UpgradeWeapon是一个PlayerController下召唤塔状态的一个子状态,该状态下将会播放一个召唤动画。增加了一个武器列表结构WeaponEntry,该结构定义了武器升级的消耗,升级用时,引用的武器Archetype。建立了一个enum来指定当前的WeaponEntry,该枚举共有5个等级,这是选定不同武器等级的索引,通过与PlayerController通信给玩家角色选取对应等级的武器原型。

      有一个查询观看类MapInfo,该类以后可以标注关卡。

      在奶酪遭到攻击的时候用HUD来提示玩家。Player HUD的PostRender便利DynamicActor实现DrawOverlay函数,DrawRotateMaterialTile。

      远程攻击敌人,他在攻击范围内将会生成射弹,Attacking状态和动画相结合。同时在遭受攻击的时候不会再发出射弹。同时让射弹攻击的方向具备一些误差。

      选取Player的生成点,GameInfo中有一个ChoosePlayerStart()可以选择玩家的生成点。

      积分系统Score利用SaveConfig()功能对此进行保存,这也是存档系统的根本。积分类的名称Data_HighScores类衍生于Object,具有一个HighScoreEntry结构体,该结构体具备玩家的名字,分数,到达的敌人波数。这里面的HighScoreEntry的config数列会在DefautlHighScores.ini中出现。

      

  • 相关阅读:
    【批处理】批处理遍历指定文件夹下的文件
    Win10删除文件显示删除确认对话框
    【makefile】make程序的命令行选项和参数
    【批处理】获取当前目录的绝对路径
    Win10怎样显示此电脑
    单片机普通行列矩阵键盘驱动
    ADS1.2与MDK4.7冲突问题的解决方法
    Cortex-M3 咬尾中断 与 晚到中断
    Cortex-M3 SVC与PendSV
    安卓渗透测试工具——Drozer(安装和使用)
  • 原文地址:https://www.cnblogs.com/NEOCSL/p/2364032.html
Copyright © 2011-2022 走看看