第六步:
现在我们已经成功了部署整体架构,还记得我们之前的那个'Isometric'吗?我们现在就得来处理它,完成最后一步,实现自己的摄像机模式。
找到我们之前编写的KWCamera.uc文件,对继承的Camera类点右键,选择转到定义。
(或者打开KingdomWorld\\Development\\Src\\Engine\\Classes\\Camera.uc)
按下键盘的Ctrl+F找到UpdateViewTarget方法,复制进我们的KWCamera.uc 因为我们要在中间部分修改,所以不好直接调用super.UpdateViewTarget()了。
找到switch( CameraStyle )部分,添加我们前面定义的那个'Isometric'的case 1. /**************************************************************
***
2. *自定义摄像机模式开始
3. *****************************************************************/
4. //从自定义的Pawn类(KWPawn)的GetDefaultCameraMode传来 5. case 'Isometric': 6. //修改摄像机位置
7. Rot.Pitch = (-55.0f *DegToRad) * RadToUnrRot; 8. Rot.Roll = (0 *DegToRad) * RadToUnrRot; 9. Rot.Yaw = (30.0f *DegToRad) * RadToUnrRot; 10.
11. //修改摄像机的位置和角色的偏移
12. Loc.X = PCOwner.Pawn.Location.X - 64; 13. Loc.Y = PCOwner.Pawn.Location.Y - 64;
14. Loc.Z = PCOwner.Pawn.Location.Z + 156; //距离位置 15.
16. //设置缩放
17. Pos = Loc - Vector(Rot) * FreeCamDistance; 18. OutVT.POV.Location = Pos; 19. OutVT.POV.Rotation = Rot; 20. break;
21./*****************************************************************
22.*自定义摄像机模式结束
23.*****************************************************************/
复制代码
由于复制过来的代码使用了一个成员变量OutVT.POV.FOV = DefaultFOV;
所以,在Camera类里,找到赋值他的地方添加进我们重写的KWCamera类里。添加DefaultProperties方法。这样方便我们以后如果对这个值进行修改而不动底层的东西。
1. DefaultProperties 2. {
3. DefaultFOV=90.f 4. }
复制代码
/***************************************************************** *
* UpdateViewTarget()方法介绍 *
* 这个类继承了基类的Camera摄像机类.
* 当这个类创建的时候,则会自动调用基类GamePawn的虚方法GetDefaultCameraMode(需要重载)(ps.其实UE3里,没有虚函数,他们extends后,都属于重写,本身他就有这方法,可以进基类的uc文件看他怎么写的).
* 如果想自己创建新的摄像机模式,则需要重载GamePawn的GetDefaultCameraMode的方法.
* /** Camera Mode */var Name CameraStyle;
* Camera类里的CameraStyle成员变量,就是通过GamePawn的GetDefaultCameraMode实现的。(ps.我觉得这个方法名用Set更合适,不过他不是方法,是需要继承的,所以Get也没错)
* 我在继承的GamePawn类(KWPawn)里返回了Isometric,那么,我们在Camera.uc里,找到UpdateViewTarget方法,将其复制过来(其实也可以不复制,复制的好处是原始的摄像机模式保留) * 在switch( CameraStyle )的地方添加对Isometric的处理(Isometric随便定义,不过你怎么case的就在你定义的Pawn里怎么Get * 在这个类里可以设置
* 这是一个可以简单使用且有品质保证的摄像机类上的基本功能,增加或者说是扩展了另一款同等级GameCamera的功能
*****************************************************************/
我大概说下我的自定义视角里面的代码含义。
首先是Rot
在这里我们固定摄像机角度进一个或多或少等角的固定角度之内。(Pitch Roll Yaw你可以理解为三个面的旋转方式,就类似UDK里面的旋转三跟线)
然后是Loc
在这里我们定义一个默认的摄像机位置距离Pawn(我们的角色)的位置。
最后是Pos = Loc – Vector(Rot) * FreeCamDistance;
它做的是以现在的摄像机旋转作为方向矢量然后借着 FreeCamDistance 来加大。
FreeCamDistance在父类定义中默认值是 256.0 f。
最后,当我们按下F5进行调试,就可以发现我们可以通过键盘的WSAD键来控制角色进行行走了,并且已经固定为斜45度角了。
如果你想修改你的视角,那么对'Isometric'里的代码进行修改。
如果你想添加多种视角,那么添加这里的case进行处理,然后在继承了Pawn类的KWPawn类里控制GetDefaultCameraMode的返回值来进行完成。
总结:
我们已经通过修改完成了使用自己的视角来进行游戏,在下一章节中,我们将重写我们的控制方法,使用鼠标来进行角色的移动。并且初步谈谈关于HUD(界面渲染)。
在前面的教程中,我们已经把我们创建的角色放入置我们的场景之中了。
现在,我们将重写我们的控制方式,使用我们自定义的方式来控制我们的角色。
第一步:
我们先把制作好的鼠标指针模型(可以参考其他教程或者等待其他人更新模型制作教程,在此系列就不涉及大部分UDK编辑器 部分的操作,本系列留给程序员)放入KingdomWorld\\UTGame\\Content\\Effect中。(KingdomWorld
\\UTGame\\Content后的路径随便你定义,你直接放在Content里也行,这样做的目的仅仅是便于管理而已) 附带一个我随便制作的模型:
第二步:
2.1.打开工程。在Classes文件夹里添加一个KWHud类。并编写如下代码
1. class KWHud extends GameHUD; 2.
3. simulated event PostBeginPlay() 4. {
5. super.PostBeginPlay(); 6. `Log(\界面类运行\7. }
复制代码
我们编写了一个继承了界面类的的类,在这里我们可以在渲染事件里做一些东西(比如UI,文字等)
2.2.接着,我们添加一个方法
1. function vector2D GetMouseCoordinates() 2. {
3. local Vector2D mousePos;
4. local UIInteraction UIController;
5. local GameUISceneClient GameSceneClient;
6. UIController = PlayerOwner.GetUIController(); 7. if ( UIController != None) 8. {
9. GameSceneClient = UIController.SceneClient; 10. if ( GameSceneClient != None ) 11. {
12. mousePos.X = GameSceneClient.MousePosition.X; 13. mousePos.Y = GameSceneClient.MousePosition.Y; 14. } 15. }
16. return mousePos; 17.}
复制代码
/****************************************************************** *
* GetMouseCoordinates()方法介绍 *
* 这是我们自己定义的一个方法。 * 通过这个方法返回一个vector2D
* vector2D包含了我们鼠标在当前场景中的正确位置。
* 其实就是PlayerOwner.GetUIController().SceneClient.MousePosition;