出于游戏的可玩性、代入感等方面的考虑,现在大部分游戏都允许玩家更改角色的服装、装备甚至是容貌和发型,并且这些更改所造成的角色外观改变都会实时的反映在游戏世界中。我最近有在 UDK 中做到相关的效果,在此写出来和大家分享,同时也是给自己做个笔记。

在 UDN 上有专门的页面讲述这一主题,请参阅 如何创建模块化pawn,本文会应用《如何创建模块化 pawn》中的知识。上图展示了最终完成的“换装”效果 .

我将把一个人物角色分为三个部分:分别是头发、头和身体。其中将身体作为父代 SkeletalMesh,而头和头发作为身体 SkeletalMesh 的子代,游戏中将允许玩家对角色的发型和服装(身体部分)进行更改。下面给出了部分 UnrealScript 代码:

//这里给出的是自定义Pawn类中的部分代码。注释部分使用绿色标识//声明: var(BladeMasterPlayerPawn) const SkeletalMeshComponent BodySkeletalMesh;//父代 var(BladeMasterPlayerPawn) const SkeletalMeshComponent HairSkeletalMesh;//子代 var(BladeMasterPlayerPawn) const SkeletalMeshComponent FaceSkeletalMesh;//子代//DefaultProperties: defaultproperties { //删除 UTPawn 的已定义骨架网格物体 Components.Remove(WPawnSkeletalMeshComponent) //创建父代身体SkeletalMesh组件 Begin Object Class=SkeletalMeshComponent Name=BodySkeletalMeshComponent SkeletalMesh=SkeletalMesh'People.BodySkeletalMesh.StartClothes_KunF_002' AnimTreeTemplate=AnimTree'People.BodyAnimTree.ATK_BladeMaster_Kun_AnimTree' AnimSets(0)=AnimSet'People.BodyAnimSet.Move_BladeMaster_Kun_AnimSet' AnimSets(1)=AnimSet'People.BodyAnimSet.Standard_BladeMaster_JinF_Animset' PhysicsAsset=PhysicsAsset'People.BodyPhAsset.00002_StartClothes_KunN_Physics' Scale=2 bCacheAnimSequenceNodes=false AlwaysLoadOnClient=true AlwaysLoadOnServer=true bOwnerNoSee=true BlockZeroExtent=TRUE CastShadow=true CollideActors=TRUE BlockRigidBody=true bUpdateSkelWhenNotRendered=false bIgnoreControllersWhenNotRendered=true bUpdateKinematicBonesFromAnimation=true bCastDynamicShadow=true RBChannel=RBCC_Untitled3 RBCollideWithChannels=(Untitled3=true) LightEnvironment=MyBSALightEnvironment bOverrideAttachmentOwnerVisibility=true bAcceptsDynamicDecals=false bHasPhysicsAssetInstance=true TickGroup=TG_PreAsyncWork MinDistFactorForKinematicUpdate=0.2 bChartDistanceFactor=true RBDominanceGroup=20 bUseOnePassLightingOnTranslucency=true bPerBoneMotionBlur=true End Object BodySkeletalMesh=BodySkeletalMeshComponent Components.Add(BodySkeletalMeshComponent) Mesh=BodySkeletalMeshComponent  //创建头SkeletalMesh组件 Begin Object  Class=SkeletalMeshComponent Name=FaceSkeletalMeshComponent SkeletalMesh=SkeletalMesh'People.FaceSkeletalMesh.Face_KunF' PhysicsAsset=PhysicsAsset'People.FacePhAsset.Face_KunF_Physics' bCacheAnimSequenceNodes=FALSE AlwaysLoadOnClient=true AlwaysLoadOnServer=true bOwnerNoSee=false CastShadow=true BlockRigidBody=TRUE bUpdateSkelWhenNotRendered=false bIgnoreControllersWhenNotRendered=TRUE bUpdateKinematicBonesFromAnimation=true bCastDynamicShadow=true RBChannel=RBCC_Untitled3 RBCollideWithChannels=(Untitled3=true) LightEnvironment=MyBSALightEnvironment bOverrideAttachmentOwnerVisibility=true bAcceptsDynamicDecals=FALSE bHasPhysicsAssetInstance=true TickGroup=TG_PreAsyncWork MinDistFactorForKinematicUpdate=0.2 bChartDistanceFactor=true RBDominanceGroup=20 bUseOnePassLightingOnTranslucency=TRUE bPerBoneMotionBlur=true //将动画组件赋给父代SkeletalMesh组件。这样可以保证将 pawn 作为一个骨架网格物体组件一样进行处理。 ParentAnimComponent=BodySkeletalMeshComponent //将阴影父代组件赋给父代骨架SkeletalMesh组件。可以使用它加快渲染这个 pawn 的阴影的速度,以防阴影发生折叠现象。 ShadowParent=BodySkeletalMeshComponent  End Object FaceSkeletalMesh=FaceSkeletalMeshComponent Components.Add(FaceSkeletalMeshComponent) //创建头发SkeletalMesh组件 Begin Object Class=SkeletalMeshComponent Name=HairSkeletalMeshComponent SkeletalMesh=SkeletalMesh'People.HairSkeletalMesh.Hair_KunF_018' bCacheAnimSequenceNodes=FALSE AlwaysLoadOnClient=true AlwaysLoadOnServer=true bOwnerNoSee=false CastShadow=true BlockRigidBody=TRUE bUpdateSkelWhenNotRendered=false bIgnoreControllersWhenNotRendered=TRUE bUpdateKinematicBonesFromAnimation=true bCastDynamicShadow=true RBChannel=RBCC_Untitled3 RBCollideWithChannels=(Untitled3=true) LightEnvironment=MyBSALightEnvironment bOverrideAttachmentOwnerVisibility=true bAcceptsDynamicDecals=FALSE bHasPhysicsAssetInstance=true TickGroup=TG_PreAsyncWork MinDistFactorForKinematicUpdate=0.2 bChartDistanceFactor=true RBDominanceGroup=20 bUseOnePassLightingOnTranslucency=TRUE bPerBoneMotionBlur=true  //将动画组件赋给父代SkeletalMesh组件。这样可以保证将 pawn 作为一个骨架网格物体组件一样进行处理。 ParentAnimComponent=BodySkeletalMeshComponent //将阴影父代组件赋给父代骨架SkeletalMesh组件。可以使用它加快渲染这个 pawn 的阴影的速度,以防阴影发生折叠现象。 ShadowParent=BodySkeletalMeshComponent End Object HairSkeletalMesh=HairSkeletalMeshComponent Components.Add(HairSkeletalMeshComponent) } //代码结束,偷懒没有缩进排版了,给您阅读带来不便,深表歉意

通过修改代码中各个 SkeletalMeshComponent 的相关属性就可以轻松实现对角色某个部位的更改(真正在游戏中通常是玩家操纵 UI 来实现“装备”的过程,不过这样会涉及更多的内容,已经超出了本文的讨论范围),且更改会即时的体现于游戏世界。

注意:能够 “模块化” 的前提是这些 SkeletalMesh 有一套共用的“骨架”,否则您可能需要通过 “插槽” 的方式来实现类似的效果。

本文到此结束,最后再贴一张更换发型的图(华兰的哦~~)