Unity3D技术之塔防类项目详解(一)

2019-05-18 16:41

Unity3D技术之塔防类项目详解(一)

通常意义上讲,塔防游戏是指一类在地图上建造炮台或者类似建筑物来阻止敌人进攻的策略类游戏。从这个概念中,我们可以快速地抽离出来三个元素,即地图(场景)、敌人、炮台(防守单位)。当我们抽离出来这样三个元素后,现在塔防游戏就变成了这样的一种描述,即敌人按照地图中设计的路径进攻,玩家利用防守单位进行防守的一类策略游戏。经典的塔防游戏有哪些呢?比如我们最为熟悉的《植物大战僵尸》、《保卫萝卜》都是塔防类游戏的经典游戏。如果我们将塔防游戏中的防守单位的范围扩大到玩家,那么像《英雄联盟》这样的游戏同样是可以称之为塔防游戏的,因为敌我阵营的最终目的都是要摧毁敌方的防御塔,只是敌我双方都从炮台或者怪物变成了有血有肉的人物,加之角色扮演(RPG)和即时战略(RTS)等元素的混合渗透,使得这样的游戏从单纯的塔防游戏变成了一款可玩度极高的游戏(天啊,我居然在夸这个游戏.....)。好了,那么我们就来尝试着做出一个简单的塔防游戏吧,注意是简单的塔防游戏哦,既然塔防游戏的三个要素是地图、敌人和防守单位,那么我们就从这三个方面来着手设计这个游戏吧!在本篇文章中,我们将用到下面的知识:

? ? ? ? ?

Unity2D中的Sprite动画

Unity3D中的可视化辅助类Gizmos 塔防游戏中敌人按路径寻路的实现 Unity3D uGUI的初步探索 简单的AI算法

一、地图篇

地图是一个塔防游戏中玩家最为关注的地方,因为地图和敌人将直接影响到玩家的策略。如图是从《保卫萝卜》游戏中提取的一张游戏地图。在这张地图中我们可以清楚看到怪物进攻的路径,怪物将沿着地图中的路径向我方防守单位发起攻击。那么,在游戏中,我们该怎样确定怪物的攻击路径呢?首先我们可以对地图进行下分析,在地图中基本上基本上只有两种类型的区域,即可以放置防守单位的区域和不可放置防守单位的区域两种。由此我们可以设计出下面的结构:

[csharp] view plaincopy

1. using UnityEngine; 2. using System.Collections; 3.

4. [SerializeField]

5. public class GridNode : MonoBehaviour 6. {

7. public enum NodeType 8. {

9. CanPlace, 10. CantPlace 11. } 12.

13. public NodeType GridNodeType=NodeType.CanPlace; 14. }

可以看出,我们在GridNode类中定义了一个称为NodeType的枚举类型,这个枚举类型有两个值,CanPlace表示可以放置防守单位,CantPlace表示不可以放置防守单位。在GridNode类中只有一个NodeType类型的成员变量GridNodeType,该成员变量的默认值是CanPlace,即可以放置防守单位。那么,现在问题来了,我们找到了一种可以用来描述地图中不同区域的方法,可是这些区域在哪里呢?所以我们需要一种方法来生成这些区域。这里隆重向大家介绍Gizoms类,Gizmo是Unity中一个用于在场景视图可视化调试或辅助设置的工具类。简单的说,当我们需要在编辑器环境中实现某种可视化调试的时候,

我们就可以使用Gizmo类。所以的Gizmo绘制都需要在OnDrawGizmos或

OnDrawGizmosSelected函数里完成。从这两个函数的名称我们就可以看出它们的区别,OnDrawGizmos在每一帧都调用,所有在Gizmos里渲染的Gizmo都将被渲染,而

OnDrawGizmosSelected仅在脚本附加的物体被选中时渲染。好了,在了解了Gizmos的基本概念和用法后,我们回到我们的游戏中。我们刚刚提到,我们需要一种方法来生成区域以便于我们可以使用GridNode类来描述每个区域的属性,那么具体怎么做呢?其实思路就是在地图上画出网格,这样网格便可以将整个地图分割成不同的区域,然后我们就可以使用GridNode来描述每个区域的属性啦。好了,下面我们来看具体的脚本:

[csharp] view plaincopy

1. using UnityEngine; 2. using System.Collections; 3.

4. public class GridMap : MonoBehaviour { 5.

6. public static GridMap Instance=null; 7.

8. public int MapSizeX; 9. public int MapSizeZ; 10.

11. [HideInInspector]

12. public GameObject[] mNodes; 13. [HideInInspector]

14. public GameObject[] mPaths; 15.

16. void Awake() 17. {

18. Instance=this;

19. mNodes=GameObject.FindGameObjectsWithTag(\20. mPaths=GameObject.FindGameObjectsWithTag(\21. } 22.

23. void DrawGrid() 24. {

25. Gizmos.color=Color.blue; 26. for(int i=0;i<=MapSizeX;i++) 27. {

28. Gizmos.DrawLine(new Vector3(i,0,0),new Vector3(i,MapSizeZ,0)); 29. }

30. for(int j=0;j<=MapSizeZ;j++) 31. {

32. Gizmos.DrawLine(new Vector3(0,j,0),new Vector3(MapSizeX,j,0)); 33. } 34. } 35.

36. void DrawColor() 37. {

38. if(mNodes==null) return;

39. foreach(GameObject go in mNodes) 40. {

41. Vector3 mPos=go.transform.position; 42. if(go.GetComponent()!=null){

43. if(go.GetComponent().GridNodeType==GridNode.NodeType.CanPlace){ 44. Gizmos.color=Color.green; 45. }else

if(go.GetComponent().GridNodeType==GridNode.NodeType.CantPlace){ 46. Gizmos.color=Color.red; 47. }

48. Gizmos.DrawCube(mPos,new Vector3(1,1,1)); 49. } 50. } 51. } 52.

53. void DrawPath() 54. {

55. Gizmos.color=Color.white; 56. if(mPaths==null) return;

57. foreach(GameObject go in mPaths) 58. {

59. if(go.GetComponent()!=null){ 60. PathNode node=go.GetComponent(); 61. if(node.ThatNode!=null){

62. Gizmos.DrawLine(node.transform.position,node.ThatNode.transform.position); 63. } 64. } 65. } 66. } 67.

68. void OnDrawGizmos() 69. {

70. DrawGrid(); 71. DrawColor(); 72. DrawPath(); 73. } 74. 75. 76. }

文章出处【狗刨学习网】

在这段脚本中,我们首先定义了两个int类型的变量MapSizeX,MapSizeZ,这两个变量分别用来表示需要绘制网格的大小。下面我们来重点关注OnDrawGizmos方法,在这个方法中我们定义了3个方法DrawGrid、DrawColor和DrawPath。其中DrawGrid方法负责绘制地图网格,DrawColor方法负责绘制地图区域、DrawPath方法负责绘制敌人寻路路径。我们首先来说DrawGrid,DrawGrid负责绘制地图网格,默认从原点开始绘制,要绘制网格只需要绘制交错的横线和竖线即可,这里我们使用的Gizmos类下的DrawLine方法我们首先在场景中创建一个MeshRoot的空物体,将GridMap脚本附加到该物体上,我们下面来看看绘制的效果:

因为Gizmos为我们提供了可视化的调试功能,因此我们可以直接在编辑器窗口中看到实际的效果,这样我们就利用Unity绘制出了地图的网格。为了让地图的左下角和场景原点能够完全匹配,这里写了一个简单的工具类AutoPlace来实现地图的位置计算和调整:

[csharp] view plaincopy

1. using UnityEngine; 2. using System.Collections; 3.

4. public class AutoPlace : MonoBehaviour { 5.


Unity3D技术之塔防类项目详解(一).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:邮政储汇业务员中级复习题2

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: