udk剑灵突然变成第一视角俯视视角

[转载]UDK自定义第三人称视角教程
可以说,有非常多的朋友在接触UDK的时候,都希望来个第三人称视角,但是苦于不会编程研究很久不得要领。我最开始也是这样,所以现在分享一下我的做法让更多人少走弯路。
在UDK里实现第三人称视角有多种方法:
1.修改代码,这也是最稳定,效果最好的方法;
2.控制台命令,输入behindview即可实现第三人称视角,缺点是视角固定不可调整;
3.在关卡中设置一个摄影机然后让摄影机绑定到角色身上,缺点是视角不可跟随角色旋转,以及遇到障碍物不会自动调整。
我们在这里直接用第一种方法。
首先我来讲解一下UDK执行游戏时对于代码的运作机制。UDK的程序代码都在Development/Src下面,这里每一个文件夹就相当于一个“包”,比如,与游戏的角色、武器、AI相关的这些脚本,都在UTGame文件夹下面。如果我们需要自定义一个游戏,那么也需要在这里新建一个文件夹(如下图的“UDNSample”)
(这里我强调一下,不管你要修改游戏中的何种参数,都一律请不要在原来的代码上直接改,一定要在你新建的文件夹下面采用“继承”的方式修改。)
然后是配置文件。这些与游戏相关的配置文件都在UDKGame/Config下面,我们这次要改的配置文件是DefaultEngine.ini,这里面决定了我们游戏在进行编译的时候会把哪些“包”算进去。像我们刚刚看到的UDNSample的文件夹,如果你不在配置文件里告诉UDK“我用到它了”,那么它是不知道的。
打开DefaultEngine.ini,找到下图所示的代码并增加一行“+EditPackages=UDNSample”
这样游戏在进行编译的时候就会把UDNSample里的代码也算在内。
在Development/Src下新建文件夹,命名为UDNSample,打开UDNSample,再建立一个文件夹名为Classes。
然后是关键的代码,在UDK的官方说明中,其实就提供了很多种相机的代码,见
然后我们需要借用的是“第三人称相机示例”中的代码。
在UDNSample/Classes下新建一个文本文档,重命名为UDNPawn.uc(注意扩展名为.uc不是.txt,喜欢隐藏扩展名的朋友注意下),然后粘贴如下代码:
class UDNPawn
extends UTP
//覆盖使默认情况下的玩家网格物体可见
simulated event BecomeViewTarget( PlayerController PC )
&& local UTPlayerController
Super.BecomeViewTarget(PC);
if (LocalPlayer(PC.Player) != None)
UTPC = UTPlayerController(PC);
if (UTPC != None)
//将玩家控制器设置在视图后面,并使网格物体可见
UTPC.SetBehindView(true);
SetMeshVisibility(UTPC.bBehindView);
function bool CalcCamera( float fDeltaTime, out vector out_CamLoc,
out rotator out_CamRot, out float out_FOV )
&& local vector CamStart,
HitLocation, HitNormal, CamDirX, CamDirY, CamDirZ,
CurrentCamO
&& local float
DesiredCameraZO
CamStart = L
&& CurrentCamOffset =
DesiredCameraZOffset = (Health & 0) ? 1.2 *
GetCollisionHeight() + Mesh.Translation.Z : 0.f;
&& CameraZOffset = (fDeltaTime
& 0.2) ? DesiredCameraZOffset * 5 * fDeltaTime + (1
- 5*fDeltaTime) * CameraZOffset : DesiredCameraZO
&& if ( Health &=
CurrentCamOffset = vect(0,0,0);
CurrentCamOffset.X = GetCollisionRadius();
CamStart.Z += CameraZO
&& GetAxes(out_CamRot, CamDirX,
CamDirY, CamDirZ);
&& CamDirX *=
CurrentCameraS
if ( (Health &= 0) || bFeigningDeath )
// 调整相机位置,确保它没有剪切到世界中
// @todo fixmesteve.& 注意:如果 FindSpot
失败,您仍然可以获得剪切(很少发生)
FindSpot(GetCollisionExtent(),CamStart);
&& if (CurrentCameraScale
& CameraScale)
CurrentCameraScale = FMin(CameraScale, CurrentCameraScale + 5 *
FMax(CameraScale - CurrentCameraScale, 0.3)*fDeltaTime);
&& else if (CurrentCameraScale
& CameraScale)
CurrentCameraScale = FMax(CameraScale, CurrentCameraScale - 5 *
FMax(CameraScale - CurrentCameraScale, 0.3)*fDeltaTime);
if (CamDirX.Z & GetCollisionHeight())
CamDirX *= square(cos(out_CamRot.Pitch * 0.)); //
0. = 2*PI/65536
out_CamLoc = CamStart - CamDirX*CurrentCamOffset.X +
CurrentCamOffset.Y*CamDirY + CurrentCamOffset.Z*CamDirZ;
if (Trace(HitLocation, HitNormal, out_CamLoc, CamStart, false,
vect(12,12,12)) != None)
out_CamLoc = HitL
defaultproperties
再新建一个文本文档,&命名为UDNPlayerController.uc,粘贴以下代码:
class UDNPlayerController
extends UTPlayerC
state PlayerWalking
ignores SeePlayer, HearNoise, B
&& function
ProcessMove(float DeltaTime, vector NewAccel, eDoubleClickDir
DoubleClickMove, rotator DeltaRot)
if( Pawn == None )
if (Role == ROLE_Authority)
// 为远程客户端更新 ViewPitch
Pawn.SetRemoteViewPitch( Rotation.Pitch );
Pawn.Acceleration = NewA
CheckJumpOrDuck();
function UpdateRotation( float
DeltaTime )
Rotator&& DeltaRot, newRotation,
ViewRotation = R
&& if (Pawn!=none)
Pawn.SetDesiredRotation(ViewRotation);
计算将会应用在 ViewRotation 上的 Delta
DeltaRot.Yaw&& =
PlayerInput.aT
DeltaRot.Pitch&& =
PlayerInput.aLookUp;
ProcessViewRotation( DeltaTime, ViewRotation, DeltaRot );
SetRotation(ViewRotation);
NewRotation = ViewR
&& NewRotation.Roll =
Rotation.R
&& if ( Pawn
Pawn.FaceRotation(NewRotation, deltatime);
defaultproperties
这时我们便有了两段代码,此时我们还需要一个来“告诉”UDK我们调用这两段代码的途径。
新建一个文本文档,命名为UDNGame.uc,键入以下代码:
class UDNGame extends UTG
defaultproperties
&DefaultPawnClass=class'UDNSample.UDNPawn'
&PlayerControllerClass=class'UDNSample.UDNPlayerController'
现在我们的文件夹下面应该是这样:
保存,重新启动UDK编辑器会提示编译,点确定让它编译即可。
没有出错应该会出现绿色的提示,如果出现***警告或者红色报错请检查前面的步骤。
随便新建一个游戏项目(或者打开原有的),测试一下,发现还是第一人称?
这是因为我们的游戏类型还没修改。进入WorldProperties,相信很多用新版本的朋友一开始就改过这里面的值,因为新版本默认的游戏类型是没有角色和武器的。
这里找到游戏类型设置,改成UDNGame即可。新旧版本这个选项的位置不一样,新版本有一个专门的GameType选项卡。反正就把能改的都改了就好了。
再次测试游戏,看看是不是第三人称了
好了,到这里为止都是借鉴官方的做法,下面是我的大招。
想必很多人看这个视角觉得并不顺眼,更喜欢像仙剑4、古剑奇谭的那种视角
没事,这个很简单。官方给的代码中,UDNPawn.uc中间有大段就是设定摄影机位置的,我们改改它就OK了。
找到下面这段代码
这个out_CamLoc的值就是最终视角的位置。后面一长串分别是X、Y、Z三个方向上的值,我们对这三个值进行修改就好,根据我的经验,用数字去进行倍乘就能解决问题,我的代码如下:
(我是将X的值乘以5,Y的值乘以2来解决的)
保存代码,再次编译并测试游戏
看,这回是我们需要的视角了~这里我让主角向左微偏是为了不妨碍观察,如果是RPG的话可以把角色放在正中的位置,大家自己调试吧~~
好了,本次教程到此结束,大家如果有什么疑问或者建议的话可以直接给我留言~~
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。[转载]UDK自定义第三人称视角教程
可以说,有非常多的朋友在接触UDK的时候,都希望来个第三人称视角,但是苦于不会编程研究很久不得要领。我最开始也是这样,所以现在分享一下我的做法让更多人少走弯路。
在UDK里实现第三人称视角有多种方法:
1.修改代码,这也是最稳定,效果最好的方法;
2.控制台命令,输入behindview即可实现第三人称视角,缺点是视角固定不可调整;
3.在关卡中设置一个摄影机然后让摄影机绑定到角色身上,缺点是视角不可跟随角色旋转,以及遇到障碍物不会自动调整。
我们在这里直接用第一种方法。
首先我来讲解一下UDK执行游戏时对于代码的运作机制。UDK的程序代码都在Development/Src下面,这里每一个文件夹就相当于一个“包”,比如,与游戏的角色、武器、AI相关的这些脚本,都在UTGame文件夹下面。如果我们需要自定义一个游戏,那么也需要在这里新建一个文件夹(如下图的“UDNSample”)
(这里我强调一下,不管你要修改游戏中的何种参数,都一律请不要在原来的代码上直接改,一定要在你新建的文件夹下面采用“继承”的方式修改。)
然后是配置文件。这些与游戏相关的配置文件都在UDKGame/Config下面,我们这次要改的配置文件是DefaultEngine.ini,这里面决定了我们游戏在进行编译的时候会把哪些“包”算进去。像我们刚刚看到的UDNSample的文件夹,如果你不在配置文件里告诉UDK“我用到它了”,那么它是不知道的。
打开DefaultEngine.ini,找到下图所示的代码并增加一行“+EditPackages=UDNSample”
这样游戏在进行编译的时候就会把UDNSample里的代码也算在内。
在Development/Src下新建文件夹,命名为UDNSample,打开UDNSample,再建立一个文件夹名为Classes。
然后是关键的代码,在UDK的官方说明中,其实就提供了很多种相机的代码,见
然后我们需要借用的是“第三人称相机示例”中的代码。
在UDNSample/Classes下新建一个文本文档,重命名为UDNPawn.uc(注意扩展名为.uc不是.txt,喜欢隐藏扩展名的朋友注意下),然后粘贴如下代码:
class UDNPawn
extends UTP
//覆盖使默认情况下的玩家网格物体可见
simulated event BecomeViewTarget( PlayerController PC )
&& local UTPlayerController
Super.BecomeViewTarget(PC);
if (LocalPlayer(PC.Player) != None)
UTPC = UTPlayerController(PC);
if (UTPC != None)
//将玩家控制器设置在视图后面,并使网格物体可见
UTPC.SetBehindView(true);
SetMeshVisibility(UTPC.bBehindView);
function bool CalcCamera( float fDeltaTime, out vector out_CamLoc,
out rotator out_CamRot, out float out_FOV )
&& local vector CamStart,
HitLocation, HitNormal, CamDirX, CamDirY, CamDirZ,
CurrentCamO
&& local float
DesiredCameraZO
CamStart = L
&& CurrentCamOffset =
DesiredCameraZOffset = (Health & 0) ? 1.2 *
GetCollisionHeight() + Mesh.Translation.Z : 0.f;
&& CameraZOffset = (fDeltaTime
& 0.2) ? DesiredCameraZOffset * 5 * fDeltaTime + (1
- 5*fDeltaTime) * CameraZOffset : DesiredCameraZO
&& if ( Health &=
CurrentCamOffset = vect(0,0,0);
CurrentCamOffset.X = GetCollisionRadius();
CamStart.Z += CameraZO
&& GetAxes(out_CamRot, CamDirX,
CamDirY, CamDirZ);
&& CamDirX *=
CurrentCameraS
if ( (Health &= 0) || bFeigningDeath )
// 调整相机位置,确保它没有剪切到世界中
// @todo fixmesteve.& 注意:如果 FindSpot
失败,您仍然可以获得剪切(很少发生)
FindSpot(GetCollisionExtent(),CamStart);
&& if (CurrentCameraScale
& CameraScale)
CurrentCameraScale = FMin(CameraScale, CurrentCameraScale + 5 *
FMax(CameraScale - CurrentCameraScale, 0.3)*fDeltaTime);
&& else if (CurrentCameraScale
& CameraScale)
CurrentCameraScale = FMax(CameraScale, CurrentCameraScale - 5 *
FMax(CameraScale - CurrentCameraScale, 0.3)*fDeltaTime);
if (CamDirX.Z & GetCollisionHeight())
CamDirX *= square(cos(out_CamRot.Pitch * 0.)); //
0. = 2*PI/65536
out_CamLoc = CamStart - CamDirX*CurrentCamOffset.X +
CurrentCamOffset.Y*CamDirY + CurrentCamOffset.Z*CamDirZ;
if (Trace(HitLocation, HitNormal, out_CamLoc, CamStart, false,
vect(12,12,12)) != None)
out_CamLoc = HitL
defaultproperties
再新建一个文本文档,&命名为UDNPlayerController.uc,粘贴以下代码:
class UDNPlayerController
extends UTPlayerC
state PlayerWalking
ignores SeePlayer, HearNoise, B
&& function
ProcessMove(float DeltaTime, vector NewAccel, eDoubleClickDir
DoubleClickMove, rotator DeltaRot)
if( Pawn == None )
if (Role == ROLE_Authority)
// 为远程客户端更新 ViewPitch
Pawn.SetRemoteViewPitch( Rotation.Pitch );
Pawn.Acceleration = NewA
CheckJumpOrDuck();
function UpdateRotation( float
DeltaTime )
Rotator&& DeltaRot, newRotation,
ViewRotation = R
&& if (Pawn!=none)
Pawn.SetDesiredRotation(ViewRotation);
计算将会应用在 ViewRotation 上的 Delta
DeltaRot.Yaw&& =
PlayerInput.aT
DeltaRot.Pitch&& =
PlayerInput.aLookUp;
ProcessViewRotation( DeltaTime, ViewRotation, DeltaRot );
SetRotation(ViewRotation);
NewRotation = ViewR
&& NewRotation.Roll =
Rotation.R
&& if ( Pawn
Pawn.FaceRotation(NewRotation, deltatime);
defaultproperties
这时我们便有了两段代码,此时我们还需要一个来“告诉”UDK我们调用这两段代码的途径。
新建一个文本文档,命名为UDNGame.uc,键入以下代码:
class UDNGame extends UTG
defaultproperties
&DefaultPawnClass=class'UDNSample.UDNPawn'
&PlayerControllerClass=class'UDNSample.UDNPlayerController'
现在我们的文件夹下面应该是这样:
保存,重新启动UDK编辑器会提示编译,点确定让它编译即可。
没有出错应该会出现绿色的提示,如果出现***警告或者红色报错请检查前面的步骤。
随便新建一个游戏项目(或者打开原有的),测试一下,发现还是第一人称?
这是因为我们的游戏类型还没修改。进入WorldProperties,相信很多用新版本的朋友一开始就改过这里面的值,因为新版本默认的游戏类型是没有角色和武器的。
这里找到游戏类型设置,改成UDNGame即可。新旧版本这个选项的位置不一样,新版本有一个专门的GameType选项卡。反正就把能改的都改了就好了。
再次测试游戏,看看是不是第三人称了
好了,到这里为止都是借鉴官方的做法,下面是我的大招。
想必很多人看这个视角觉得并不顺眼,更喜欢像仙剑4、古剑奇谭的那种视角
没事,这个很简单。官方给的代码中,UDNPawn.uc中间有大段就是设定摄影机位置的,我们改改它就OK了。
找到下面这段代码
这个out_CamLoc的值就是最终视角的位置。后面一长串分别是X、Y、Z三个方向上的值,我们对这三个值进行修改就好,根据我的经验,用数字去进行倍乘就能解决问题,我的代码如下:
(我是将X的值乘以5,Y的值乘以2来解决的)
保存代码,再次编译并测试游戏
看,这回是我们需要的视角了~这里我让主角向左微偏是为了不妨碍观察射击,如果是RPG的话可以把角色放在正中的位置,大家自己调试吧~~
好了,本次教程到此结束,大家如果有什么疑问或者建议的话可以直接给我留言~~
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。[转载][Unreal3_Kismet]切换游戏视角镜头
作者:朱佳敏
1.本来想做怎么把第一人称视角调成类似于暗黑的固定俯视视角,做了才发现除了调camera还有很多设定要做
2.读者可以了解怎么通过Kismet切换视角镜头
3.我会分析一下第一人称视角镜头和俯视固定镜头在控制角色上的输入设定差别,这也是我目前解决不了的,需要程序员来做
4.平时比较懒,不会主动写教程,有需求的话,尽量把需求详细写明,能提供素材更好,能做的我会完成并将制作流程做成图文教程发到网上
1.制作简单的场景
用BSP创建一个简单地面,加个灯光
添加一个PlayerStart
选择Content Browser&Actor
Classes&CameraActor。在场景中添加摄像机CameraActor_0
激活眼睛后,点击摄像机,进入摄像机视角,以PlayerStart为中心,调整摄像机视角。关闭眼睛,退出摄像机视角。
2.切换镜头
进入Kismet,添加:
New Event&Player&Player
New Action&Camera&Set Camera
Target,用来切换玩家视角
New Action&Actor&Attach to
Actor,将摄像机绑定到玩家角色身上,
New Variable&Player&Player,属性里All
Players勾去掉
&加入CameraActor_0这个量,按下图连接:
【结果】类似于俯视镜头,但是镜头旋转不固定,玩家的瞄准目标在屏幕中心,。
【还要做的】增加瞄准系统和锁定镜头旋转
【分析】第一人称视角(简称A)和俯视固定视角(简称B)在控制角色上的输入设定差别
1.&瞄准,A始终在屏幕中央,通过旋转镜头来移动准心;B,游离状,通过外部输入信息来获取目标,如鼠标点击
2.&镜头变化,A以人物为坐标系参考,输入引起的镜头变化,如位移和旋转都相对于人物;B镜头的位移和人物位移绑定,旋转固定不变;
3.& 人物朝向,A人物始终面朝屏幕,通过旋转输入转向,位移输入控制人物的前进、后退,左右平移;B人物面朝位移输入方向,通过改变位移输入方向转向,没有旋转输入系统,没有后退,左右平移(有也是另外加功能键)。
所以要改镜头的话,就要做一系列的动作。
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

参考资料

 

随机推荐