在上一篇文章中,我们从Unity3D为我们提供的相机原型实现了非编码式的小地图更多精彩请关注【狗刨学习网】,如果结合GUI在这个小地图下面绘制一些背景贴图,相信整体的效果会更好一些。博主希望这个问题大家能够自己去做更深入的研究,因为贴图的绘制在前面的文章中,我们已经已经提到了,所以这里就不打算再多说。今天呢,我们继续为这个小项目加入一些有趣的元素。首先请大家看一下下面的图片:
相信熟悉国产单机游戏的朋友看到这幅图片一定会有种熟悉的感觉,博主在本系列的第一篇文章中,就已经提到了博主是一个国产单机游戏迷,博主喜欢这样有内涵、有深度的游戏。或许从操作性上来说,仙剑系列的回合制在很大程度上落后于目前的即时制,但是我认为回合制和即时制从本质上来说没有什么区别,即时制是不限制攻击次数的回合制,所以从玩法上来讲,回合制玩家需要均衡地培养每一个角,在战斗中寻最优策略,以发挥各个角的优势,因此博主认为如果把即时制成为武斗,那么回合制在某种程度上就可以称之为文斗,正是因为如此,仙剑系列注重剧情、注重故事性,为玩家带来了无数感动。鉴于国内网游玩家的素质,博主一贯反感网游,所以比较钟情于武侠/仙侠单机游戏,虽然仙剑同样推出了网络版,但是在游戏里开着喇叭、挂着语音、相互谩骂的网游环境,实在让我不回仙剑的感觉。好了,闲话先说到这里,今天我们来说一说现价奇侠传四里面的角控制。玩过仙剑奇侠传的人都知道,仙剑奇侠传真正进入3D界面的跨时代作品当属上海软星开发的仙剑奇侠传四,该公司之前曾开发了仙剑奇侠传三、仙剑奇侠传三外传等作品,后来由于某些原因,该公司被迫解散。而这家公司就是后来在国产单机游戏中
的新锐——上海烛龙科技的《古剑奇谭》。有很多故事,我们不愿意相信结局或者看到了结局而不愿意承认,青鸾峰上蓝衣白衫、白发苍苍的慕容紫英,随着魔剑幽蓝的剑影御剑而去的身影,我们都曾记得,或许他真的去了天墉城,只为一句:承君此诺,必守一生。好了,我们正式开始技术分享(博主内心有很多话想说)!
在仙剑奇侠传四中,玩家可以通过鼠标右键来旋转场景(水平方向),按下前进键时角将向着朝前(Forward)的方向运动,按下后退键时角将向着朝后(Backword)的方向运动、当按下向左、向右键时角将向左、向右旋转90度。从严格意义上来说,仙剑四不算是一部完全的3D游戏,因为游戏视角是锁死的,所以玩家在平时跑地图的时候基本上是看不到角的正面的。我们今天要做的就是基于Unity3D来做这样一个角控制器。虽然Unity3D为我们提供了第一人称角控制器和第三人称角控制器,但是博主感觉官方提供的第三人称角控制器用起来感觉怪怪的,尤其是按下左右键时那个旋转,感觉控制起来很不容易,所以博主决定自己来写一个角控制器。首先我们打开项目,我们还是用昨天的那个例子:
很多朋友可能觉得控制角的脚本很好写嘛,这是一个我们通常见到的版本:
1.<font face="宋体" size="2">//向左
2.if(Input.GetKey(KeyCod e.A))
3.{
4. SetAni matio n(LeftAn im);
5. this.mState=Person State.Walk;
6. mHero.transf orm.Transl ate(Vector3.right*Time.deltaT ime*mSpeed);
7.}
8.//向右
9.if(Input.GetKey(KeyCod e.D))
10.{
11. SetAni matio n(RightA nim);
12. this.mState=Person State.Walk;
13. mHero.transf orm.Transl ate(Vector3.right*Time.deltaT ime*(-mSpeed));
14.}
15.//向上
16.if(Input.GetKey(KeyCod e.W))
17.{
18. SetAni matio n(UpAnim);
19. this.mState=Person State.Walk;
20. mHero.transf orm.Transl ate(Vector3.forwar d*Time.deltaT ime*(-mSpeed))
;
21.}
22.//向下
23.if(Input.GetKey(KeyCod e.S))
24.{
25. SetAni matio n(DownAn im);
26. this.mState=Person State.Walk;
27. mHero.transf orm.Transl ate(Vector3.forwar d*Time.deltaT ime*(mSpeed));
28. Vector3 mHeroP os=mHero.transf orm.positi on;
29.} </font>
复制代码
那么,我们姑且认为这样写没什么问题,那么现在我们导入官方提供的Script脚本资源包,到MouseLook脚本,在Update()方法中添加对右键是否按下的判断,这样我们就可以实现按下鼠标右键时视角的旋转。修改后的脚本如下:
1.<font face="宋体" size="2">
2.usingUnityE ngine;
3.usingSystem.Collec tions;
4.
5./// MouseL ook rotate s the transf orm basedon the mousedelta.
6./// Minimu m and Maximu m values can be used to constr ain the possib le
rotati on
7.
8./// To make an FPS stylecharac ter:
9./// - Create a capsul e.
10./// - Add the MouseL ook script to the capsul e.
11./// -> Set the mouselook to use LookX. (You want to only turn charac ter
but not tilt it)
12./// - Add FPSInp utCon troll er script to the capsul e
13./// -> A Charac terMo tor and a Charac terCo ntrol ler compon ent will be
automa tical ly added.
14.
15./// - Create a camera. Make the camera a childof the capsul e. Resetit's
transf orm.
16./// - Add a MouseL ook script to the camera.
17./// -> Set the mouselook to use LookY. (You want the camera to tilt up
and down like a head. The charac ter alread y turns.)
18.[AddCom ponen tMenu("Camera-Contro l/MouseLook")]
19.public classMouseL ook : MonoBe havio ur {
20.
21. public enum Rotati onAxe s { MouseX AndY= 0, MouseX = 1, MouseY= 2 }
22. public Rotati onAxe s axes = Rotati onAxe s.MouseX AndY;
23. public floatsensit ivity X = 15F;
24. public floatsensit ivity Y = 15F;
25.
26. public floatminimu mX = -360F;
27. public floatmaximu mX = 360F;
28.
29. public floatminimu mY = -60F;
30. public floatmaximu mY = 60F;
31.
32. floatrotati onY = 0F;
33.
34. void Update ()
35. {
36. if(Input.GetMou seBut ton(1))
37. {
38. if (axes == Rotati onAxe s.MouseX AndY)
float up39. {
40. floatrotati onX = transf orm.localE ulerA ngles.y +
Input.GetAxi s("MouseX") * sensit ivity X;
41.
42. rotati onY += Input.GetAxi s("MouseY") * sensit ivity Y;
43. rotati onY = Mathf.Clamp(rotati onY, minimu mY, maximu mY);
44.
45. transf orm.localE ulerA ngles= new Vector3(-rotati onY,
rotati onX, 0);
46. }
47. else if (axes == Rotati onAxe s.MouseX)
48. {
49. transf orm.Rotate(0, Input.GetAxi s("MouseX") * sensit ivity X,
0);
50.
51. }
52. else
53. {
54. rotati onY += Input.GetAxi s("MouseY") * sensit ivity Y;
55. rotati onY = Mathf.Clamp(rotati onY, minimu mY, maximu mY);
56.
57. transf orm.localE ulerA ngles= new Vector3(-rotati onY,
transf orm.localE ulerA ngles.y, 0);
58. }
59. }
60. }
61.
62. void Start()
63. {
64. // Make the rigidbody not change rotati on
65. if (rigidb ody)
66. rigidb ody.freeze Rotat ion = true;
67. }
68.}
69.</font>
复制代码
接下来,我们将这个脚本拖放到我们的角上,运行游戏,我们发现了一个问题:当旋转视角后,角并没有如我们期望地向朝前的方向移动,相反,角依然沿着世界坐标系里的Vector3.forward向前运动。按照我们的想法,当旋转视角以后,角应该可以朝着前方运
动。怎么办呢?这里我们在上面的代码中加上这样的代码:
1.<font face="宋体" size="2">
2.//计算旋转角
3. if(Input.GetMou seBut ton(1))
4. {
5. //计算水平旋转角
6. mAngle s+=Input.GetAxi s("MouseX") * 15;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论