6. //精灵渲染器
7. private SpriteRenderer mRenderer; 8. //精灵宽度
9. private float mSpriteWidth; 10. //精灵高度
11. private float mSpriteHeight; 12. 13.
14. void Start () 15. {
16. mRenderer=GetComponent
18. mSpriteWidth=mRenderer.sprite.bounds.size.x * transform.localScale.x; 19. mSpriteHeight=mRenderer.sprite.bounds.size.y * transform.localScale.y; 20. //自动调整精灵的位置
21. transform.position=new Vector3(mSpriteWidth/2,mSpriteHeight/2,0); 22. } 23. }
好了,下面我们来继续讲解地图中区域的生成。什么是地图中的区域呢?在塔防游戏中玩家通常情况下都只能在可以放置防守单位的区域放置防守的单位,那么可以放置防守单位的这些地方就是我们接下来要来研究的区域。我们首先需要根据第一步绘制的网格,为每一个网格单元创建一个空物体NodeObject,并为该物体附加GridNode脚本,如果该物体所在的位置在地图上是可以放置防守单位,那么我们就将其GridNodeType设为
CanPlace,否则就设为CantPlace。其实在这里是更喜欢用动态生成的方式来为每个网格单元添加区域属性的,不过这里我们为了将过程讲明白,索性就手动创建吧!哈哈,可是居然手动创建了96个空物体,想想都觉得醉了啊。好了,我们这里需要给每个
NodeObject设置一个GridNode的Tag,这样我们可以在程序中通过Tag来获取所有的NodeObject。最后,我们将这些NodeObject全部放到MeshRoot这个节点下面,使其成为MeshRoot的子节点。下面呢,我们继续回到GridMap脚本中的DrawColor方法中,我们在脚本的Awake方法中首先获取所有的NodeObject,然后根据每一个NodeObject对象附加的GridNode脚本,来判断这个网格单元是可以放置防守单位还是不可以放置防守单位,如果可以放置防守单位就用绿色绘制一个Cube,如果不可以放置防守单位就用红色绘制一个Cube,这样我们编辑器中就可以根据颜色来区分不同的区域了。好了,我们下面来看看实际的效果:
好了,现在大家可以很明确的看到整个地图中区域的分布,红色的部分为不可放置防守单位的区域,绿色的部分为可以放置防守单位区域。大家应该注意到红色的区域中有条白色的线,这条线呢其实就是敌人的寻路路径。那么好下面我们就来讲述敌人寻路路径的生成。相比网格和区域的生成,路径的生成要简单许多。因为路径只需要关注起点、终点和节点即可。具体怎么做呢,首先我们在场景中新建一个空物体命名为PathRoot,接下来我们在红色区域中分别为起点、终点和节点建立一个空物体,命名为PathNode,并设置其Tag为PathNode。
好了,接下来,我们再来一起看一个叫做PathNode的脚本,这个脚本的作用是描述各个路径节点的关系,类似于链表的结构:
[csharp] view plaincopy
1. using UnityEngine; 2. using System.Collections; 3.
4. public class PathNode : MonoBehaviour { 5.
6. public PathNode ThisNode; 7. public PathNode ThatNode; 8.
9. public void SetNode(PathNode _node) 10. {
11. if(ThatNode!=null){
12. ThatNode.ThisNode=null; 13. ThatNode=_node; 14. _node.ThisNode=this; 15. } 16. 17. } 18. 19. }
在这段脚本中,我们让ThisNode指向节点自身,ThatNode指向下一个节点,并提供了一个设置下一个节点的方法SetNode。现在,我们将这个脚本附加到各个PathNode上,通过编辑器可以快速地为每个节点指定ThisNode和ThatNode。那么,现在各个路径节点的关系我们已经很清楚了,接下来要做的是事情就是利用Gizmos将路径画出来,怎么画呢?从当前节点指向下一个节点就可以了。现在我们来看看DrawPath方法具体都做了什么:
[csharp] view plaincopy
1. void DrawPath() 2. {
3. Gizmos.color=Color.white; 4. if(mPaths==null) return;
5. foreach(GameObject go in mPaths) 6. {
7. if(go.GetComponent
10. Gizmos.DrawLine(node.transform.position,node.ThatNode.transform.position); 11. }
12. Gizmos.DrawCube(node.transform.position,new Vector3(0.25F,0.25F,0.25F)); 13. } 14. } 15. }
相信大家都明白了吧,我们首先根据Tag获取了全部的PathNode对象,然后根据PathNode脚本绘制了每个节点指向下一个节点的线段,同时为该节点绘制一个小Cube。好了,我们来看看最终的效果:
到现在为止,所有的关于地图的内容都讲解完了,我们来简单总结下,在这一部分,我们主要学习了可视化辅助类Gizmos在绘制网格、区域、路径等方面的应用,主要利用了DrawLine和DrawCube这两个方法。
好了,这个项目的内容比较多啦,因此决定将敌人篇、防守单位篇放在下一篇文章中来为大家讲解,因为在一篇文章中写完的话,不仅写起来会比较累,大家读起来会更累啊,所以今天的内容就是这样啦,希望大家喜欢啊!最后为大家送上今天的项目演示:
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库Unity3D技术之塔防类项目详解(一)(2)在线全文阅读。
相关推荐: