参考: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();
配合自定义按键,轻而易举实现本功能。