UDK ——脚本入门

参考:http://v.youku.com/v_show/id_XNTMwMTU0OTIw.html


前边的话:

 

Unreal Script,即虚幻脚本,后缀名UC,以下用UC代替。

 

写这篇帖子的目的是为了让更多的想学习UC但没有UC使用经验的爱好者对UC有个理性认识,不再认为UC是个门槛


高的东西,如果读完这篇文章,你有信心和欲望开发自己的UC工程,我的初衷就达到了。

 

事实上,Epic设计UC目的是牺牲游戏性能,实现程序开发效率。所以,我会从业余角度出发,以实用性为主,用最简


洁、易懂的语言来表达,有些地方肯定不规范,甚至违背了

 

程序开发的扩展性、规范性,请见谅。


本文依个人情况而定:

      

一、无编程经验,无游戏编程经验,本文章最适合你,你将会从这里学到最多。

 

二|、有编程经验,无游戏编程经验,如果你会点C++、java或任意一种面向对象语言,甚至还知道MVC,读了本文你


将会在UC学习效率上很快,少走弯路。

 

三、有编程经验,有游戏编程经验,甚至懂得设计模式,恭喜你,你可以粗读本文,看附带的学习资料,踏上UC之旅


吧,那里有你熟悉的单例、工厂、代理、原型。


UC学习资料:

 

官方文档:http://apacudn.epicgames.com/Three/WebHome.html(最权威的技术指引,利用好搜索,你会发现UDN


内涵比门面更精彩,例如,关键词MasteringUnrealScript)

 

官方论坛:http://forums.epicgames.com/forum.php(人气极旺,技术高,这里没有最牛只有更牛,全英文)

 

UDK中文网 http://www.udkcn.com/forum.php(内容较老,但是技术都很有用,而且是中文)

 

AboutCG社区 http://www.aboutcg.com/(商业UDK教学,质量上乘,但是要米)

 

博客:http://hfun.me/(目测是剑灵开发人员的博客)

 

视频:

 

YouTube(如果有条件上国外网站、社区,最好不过了)

 

风之神韵视频教程(推荐免费前两章)

 

Eat3D – UnrealScrip虚幻脚本应用教程(英文)

 

Eat3DRe-creating Assault in UDK(英文,高难度,开发一个类似CS的局域网对战游戏,

 

网络部分在这里有重要的应用,虽然我专业是网络,但是很难懂,看懂3部你就是大神了)

 

GA只推荐那两本书


一、UC、游戏编程简介:

 

UC是一个面向对象编程语言(OOP),对象、继承、多态是此类语言最大的特点。(百度一下,你就知道)

 

世间的一切东西都可以看成某个对象,只不过是具象与抽象之分,我举个简单的例子:

 

汽车是一个类(class),你的汽车就是一个实例,汽车类的每个实例都是一个对象。

 

你的汽车跟别人的汽车肯定不同,颜色、车胎、速度等,这些叫属性(property)。

 

你还要对汽车进行操作,驾驶、加油、维修,这些叫方法或函数(function)。

 

目前流行的游戏编程语言都是OOP的,拿虚幻来说,小到相机、灯光、导航点,大到每个角色、武器、游戏类型,都


是一个Class。事实上,Kismet里的任何一个东东都是通过UC定义Class实现的。(插个笑话,epic官方论坛上两个老


外就一个第三方Kismet组件产权吵了快20页)

 

知道这些已经足够,或通过自学(任何语言编一个2d小游戏是推荐的方法),加深OOP的思想,结合虚幻分析一个典


型的游戏逻辑(如何建立空工程在下文):

 

类UTGame中:

 

PlayerControllerClass=class'UTGame.UTPlayerController'

 

DefaultPawnClass=class'UTPawn'

 

class'UTPawn'定义UTGame里的机器人,模型、动画、生命、速度都在里面,仅仅如此,

 

它是不会听从玩家指挥来行动的,class'UTGame.UTPlayerController'定义抽象的控制器,负

 

责给UTPawn下达行动命令,自定义AI就在这里添加。

 

可以看出,两个类一抽象、一具体,横版小游戏大都采用这种设计思路。


二、建立一个UC新工程

 

工具:VS2008或VS2010 nFringe合适版本

 

见风之神韵教程前两章,直接传送门:

 

http://v.youku.com/v_show/id_XNTA1OTY0ODky.html

 

http://v.youku.com/v_show/id_XNTA1OTY2NTAw.html


三、UC基础类、文件系统解析

 

官方文档说明:http://apacudn.epicgames.com/Three/UnrealScriptFoundationsCH.html

 

现在你已经有了一个新工程,对文件目录应该还不太清楚,我来说明:

 

E:\UDK\UDK-2012-10是我的UDK目录

 

E:\UDK\UDK-2012-10\Development\Src是UDK脚本文件夹

 

这里有好多文件夹,不用担心我们基本都用不到他们,但我要说明其中一些文件夹,因为有助于我们理解整个UC架


构。

 

Core中存放了核心类(抽象的),Object是UC一切其他类的超类(父类),这里你看不到关于游戏的影子。

 

Engine中存放了继承自Core的游戏元素类,如Actor、ActorFactory、Light、Material、Pawn、GameInfo等,理论


上,继承这个目录内的类来开发游戏是可行的,但代价巨大,因为类还是太抽象。

 

UDKBase中存放了继承自Engine和其他文件目录的类,可以理解为专门为UDK的开发而建立的工程,UDK的Demo里


除了射击游戏(UTGame)外,还有移动、漫游等其他项目,都涵盖在这一目录下。

 

UTGame中存放了我们最常接触的射击游戏的类继承自UDKBase工程,作为新手,我们的工程也将继承自这里。重要


的类:UTGame、UTPawn、UTWeapon、UTVehicle、UTProjectile,他们的实际意义跟类名完全一样,我的游戏开发


用到的类比这些还少,个人UC开发就是这么简单

 

UTGameContent中存放的是UTGame的一种扩展,在不影响UTGame的基础上开发,这也体现了一种设计思路,事


实上,我们新建工程的目的就在于此,概括一下里面类的作用:定义拾取物、载具、载具弹药等,尽管我没用过老版


本,但我猜测老版本的滑板就在这一目录下,那一直是我认为很酷的一个东西。

 

总结:UC目录和类的设计充分体现了OOP的特点,甚至对于丰富编程经验的人来说,无限实践了设计模式。但对于


新手来说,理解这些好像意义不大,事实也正是如此,(不要喷,如果将来有一天你转行或者踏入码农这一领域,再


来看这一部分你会顶我)下面来看具体类的内容和作用吧。


四、游戏类型、自定义初始武器


UTGame->ShootGameInfo指出了俩个类,以及继承关系,UTGame实际就是UDK里的游戏类型(本质上是一个


类),并指定一些重要游戏信息,ShootGameInfo是我的工程的游戏类型。


code:


class ShootGameInfoextends UTGame;


///方法意义:更改初始武器,替换掉林肯枪,这里涉及武器库概念,UDN

simulatedfunction AddDefaultInventory(pawn PlayerPawn )

{

         local int i;

         for(i=0; i<DefaultInventory.Length; i++)

         {

                   if(PlayerPawn.FindInventoryType( DefaultInventory[i] ) ==None)

                   {

                            PlayerPawn.CreateInventory(DefaultInventory[i],(i > 0));

                   }

         }

         PlayerPawn.AddDefaultInventory();

}

 

DefaultProperties

{

         DefaultPawnClass=class'ShootGame.UDNPawn_UpDown'

         PlayerControllerClass=class'ShootGame.UDNPlayerController_UpDown'

         Acronym="IT"

    MapPrefixes[0]="IT"

         DefaultInventory(0)=class'ShootGame.ShootWeap_LinkGun'   

}


DefaultProperties里是设置本类的默认属性 

 

DefaultInventory(0)=class'ShootGame.ShootWeap_LinkGun'(ShootGame是我的工程名)


simulatedfunction AddDefaultInventory()是一个方法 ,simulated指出此方法继承自父类,通过VS的搜索功能,你


能找到这个方法的全貌


ShootGameInfo改变的信息:玩家Pawn类型,玩家PawnController类型,玩家初始武器。


五、玩家角色、自定义视角、自定义角色模型


UTPawn->UDNPawn_UpDown 


UDNPawnUpDown是我的游戏角色类型


官方相机视角:http://udn.epicgames.com/Three/CameraTechnicalGuideCH.html


关于视角网上教程比较多,我的游戏视角是融合了第三人称视角、和自上而下视角,代码较杂,不发了。


自定义角色模型:


//在你的角色类里声明以下变量

var SkeletalMeshdefaultMesh;

var AnimTreedefaultAnimTree;

var array<AnimSet> defaultAnimSet;

var PhysicsAssetdefaultPhysicsAsset;

 

//加入这个方法,这就是设置角色模型、动画的方法

simulated functionSetCharacterClassFromInfo(class<UTFamilyInfo>Info)

{

         Mesh.SetSkeletalMesh(defaultMesh);

         Mesh.SetPhysicsAsset(defaultPhysicsAsset);

         Mesh.AnimSets=defaultAnimSet;

         Mesh.SetAnimTreeTemplate(defaultAnimTree);

 

}

//默认属性里加入UDK里资源文件的路径

defaultproperties

{

         //这里是骨架模型文件地址(绑定的骨骼各名称要和UDK默认的一样)

         defaultMesh=SkeletalMesh'CH_Man.Mesh.SK_Male'

         defaultAnimTree=AnimTree'CH_AnimHuman_Tree.AT_CH_Human'

         defaultAnimSet(0)=AnimSet'CH_AnimHuman.Anims.K_AnimHuman_BaseMale'

         defaultPhysicsAsset=PhysicsAsset'CH_AnimCorrupt.mesh.SK_CH_Corrupt_Male_Physics'

}


完成!


六、自定义武器、弹幕游戏基础


自定义武器:


官方武器指南:http://udn.epicgames.com/Three/WeaponsTechnicalGuideCH.html


优酷的yellowy-UDK自定义武器


看完这俩个对UTGame的武器就熟悉了:机制、模型、音效、特效。


再通过看UTWeapom的defaultproperties里的属性名称加不断测试你会更加自由的开发武器。


弹幕游戏基础:


UC里生成Actor的函数是Spawn()


UTWeapom里生成一个弹丸的语句:


SpawnedProjectile =Spawn(GetProjectileClass(),,, RealStartLoc);


通过重新构造我们的射弹函数,来生成多个子弹,code:


simulated functionProjectileFire(){

                localint n;

                localint range;

                localint i;

            localrotator MyRot;

          localUTProj_LinkPlasma MyShockBall;

                local vector    RealStartLoc;

                   n=3;

                   range=3072;

                   RealStartLoc =GetPhysicalFireStartLoc();

                   MyRot=GetAdjustedAim(RealStartLoc );

                   MyRot.Yaw-=range/2+range/(n-1);   

        for(i=0;i<n; i++)

        {

                            MyRot.Yaw+=range/(n-1);

                            MyShockBall=spawn(class' UTProj_LinkPlasma ',/*self*/,,(RealStartLoc)/*Location*/);

                            MyShockBall.Instigator=UTPawn(Instigator);

                            MyShockBall.Init(Vector(MyRot));

            }

}


以上代码实现了一枪发出3个弹丸,除了击发多个弹丸,弹丸本身的属性也非常重要,通过对自定义武器的学习,你


应该有信心独自开发自定义弹丸了吧。


七、自定义按键、鹰眼功能的实现


自定义按键:


http://udn.epicgames.com/Three/KeyBindsCH.html


http://hfun.me/udk-input-custom-keybinds.html


鹰眼功能:


此功能实际就是减缓游戏速度,核心代码:


WorldInfo.Game.SetGameSpeed();


配合自定义按键,轻而易举实现本功能。


你可能感兴趣的:(UDK ——脚本入门)