跟我一起用unity做小地图!
lol的小地图
转载爬虫请自重,未问先转没排面
不爱多做铺垫,小地图对于一些游戏来说多重要大家都懂,不然你也不会来看我这篇文章的,对不对?
话不多说,开搞!
一、主体功能
一般来说,游戏里的迷你地图都是平面的。但是,默认的摄像机模式,即perspective
(透视),是得不到这样的效果的。那怎么办?使用orthographic
(正交)模式就好啦。
修改后,控制视野的参数由Field of View
变成了Size
。
选择性显示
如果把游戏中的所有东西都在小地图上渲染一遍,难免显得杂乱,失去了小地图的简明扼要这个特点。那怎么办呢?
可以选择使用Layer
(图层)来实现选择性显示。即给需要显示的物体加上特定的图层,这样的话,就可以在小地图里只显示具有指定图层的物体啦。
最简单的做法,给要显示的物体加上图层showInMiniMap
,只在迷你地图中渲染这些物体就可以了。但是呢,我不会这么做的...因为我衡量了一下,其实大部分物体都是要渲染的,所以...你懂得,我们给无需渲染的物体加上图层hideInMiniMap
,然后过滤掉他们就好了!
这个
showInMiniMap
后面还有用处。
引申:给NPC加上特定标记
举一反三是一个很好的习惯,相信有些机智的小伙伴已经能想到了。如果给特定的NPC加上特定的图层,是不是就可以在地图上显示不同的标记呢?
比如:
- 敌人:红色点点
- 自己:绿色长三角(三角尖指向当前朝向)
- 商店老板:金袋icon
- 装备升级:剑盾icon
一种很简单的做法,就是给这些物体加上相应的icon
模型,位置就和本物体重合,然后将icon
模型设置为showInMiniMap
,然后在主摄像机里剔除,让他们不会出现在视野里。然后给本来模型,加上hideInMiniMap
图层,这样他们就不会出现在小地图了。
如此一来就实现了游戏视图里看到的是模型,而小地图里看到的是icon了。
二、进阶功能
给小地图加个圆框
让小地图和主角一起转动
transform.rotation = Quaternion.Euler(
new Vector3(
transform.rotation.eulerAngles.x,
playerTransform.rotation.eulerAngles.y,
transform.rotation.eulerAngles.z
)
);
加上指南针
有些人,看到小地图,就想到圆;看到圆,就想起转动;看到转动,就想起指南针。 —— 鲁迅
没错,接下来我们就做指南针。
让指南针更逼真
现实中的指南针并不会一瞬间指向南的,而是有个慢慢晃动校准的过程,我们也可以做出这样的效果来!
compass.rotation = Quaternion.Lerp (
compass.rotation,
Quaternion.Euler (0, 0, playerTransform.rotation.eulerAngles.y+compassOrientationOffset),
Time.deltaTime * compassRotationSpeed
);
Quaternion.Lerp
是个非常棒的函数, 处理旋转问题呱呱叫!比如说,120度转到-120度,我们无需自己判断是顺时针转动240度,还是逆时针转动120度,这个函数会自动帮您选择最小的度数(120度)转过去。
三、完善功能
为啥是先讲进阶,后讲完善呢?
处理小地图灯光
如果你的游戏世界里存在白天黑夜循环,比如dota2
,你又不希望你的小地图黑夜比白天黑很多,顶多视野变得狭隘点。那么就需要给小地图设置另一套灯光渲染。
void OnPreCull (){
foreach(Light l in minimapLightsNotVisible)
l.enabled = false;
foreach(Light l in minimapLightsNoShadows)
l.shadows = LightShadows.None;
foreach(Light l in minimapLightsVisible)
l.enabled = true;
}
void OnPostRender(){
foreach(Light l in minimapLightsNotVisible)
l.enabled = true;
foreach(Light l in minimapLightsNoShadows)
l.shadows = LightShadows.Soft;
foreach(Light l in minimapLightsVisible)
l.enabled = false;
}
处理在屋子里情况
这里应该要分好几种情况,先说两种:
- 低矮的屋子
- 高楼
首先,我们进了矮屋子咋办,因为小地图是头顶的摄像机渲染的,所以摄像机会被屋顶挡住。我在小地图里只能看到一个屋顶。这个根据业务需要,解决方法如下:
- 你可以选择进入某个屋子后,就不渲染这个屋子的屋顶了(需要在代码中做相应的控制),这貌似是很多生存类游戏的解决方案。
- 也可以选择就是要显示屋顶,都进了屋子里,这个屋子就是个地标,还要啥小地图?
我们这里先提供第一种解决方案的实现。
然后我进了一个高楼咋办?如果我停在1楼,因为摄像机高度是有限的,它很可能停留在3楼或者4楼,那就很诡异了,我在1楼某个屋子走来走去,摄像机却显示了3楼空无一人的场景。这显然是无法接受的。
进入地下城
下面就是个特殊例子了,进入地下城或者蜿蜒曲折的山洞咋办?
众所周知,地下城都是带“盖子”的,天生带屋顶,如果你还是把摄像机放在天空,就有点像进入高楼那种情况了,诡异。而且地下城里高高低低,上上下下,摄像机卡在隔壁房间,甚至卡在你根本没设计的墙外世界,看到外面诡异的天空盒子,这就很像某部科幻电影里的场景了...这是完全无法接受的!
怎么办呢?碰撞检测
吧!从摄像机发射一根射线到人物,如果中间碰撞了设定为墙壁图层的物体,就是穿墙了,这时候就把摄像机前移到碰撞点前面一些的位置,这样就不会有问题了。
下面我们开始实现。
结语
其实小地图上可以玩的花样肯定还有很多,这些就等各位大佬慢慢挖掘,自己实现啦。也欢迎大家不吝分享自己的经验,一起进步~
跟我一起用unity做小地图!的更多相关文章
- Unity做AR
Unity做AR呢这里借助了高通的AR包 这里是视频教程 http://www.tudou.com/programs/view/dnvEbIubNzI/ 这里是结果演示 http://www.tu ...
- 使用Unity做项目的时候,一些好的建议
内容来自这个网站http://devmag.org.za/2012/07/12/50-tips-for-working-with-unity-best-practices/ ,我选取了目前我看得懂的一 ...
- 使用Unity做2.5D游戏教程(二)
最近在研究Unity 3D,看了老外Marin Todorov写的教程很详细,就翻译过来以便自己参考,翻译不好的地方请多包涵. 这是使用Unity 游戏开发工具制作一个简单的2.5D 游戏系列教程的第 ...
- 使用Unity做2.5D游戏教程(一)
最近在研究Unity 3D,看了老外Marin Todorov写的教程很详细,就翻译过来以便自己参考,翻译不好的地方请多包涵. 如果你不了解2.5D游戏是什么,它基本上是个3D游戏而你可以想象是压扁的 ...
- Unity游戏小地图生成
孙广东 2015.6.25 这个在AssetStore上有几个不错的插件, 除了知道原理,能自己实现还是好的. 非常多插件是不会直接使用的.而是要依据自己项目的需求进行改动或者就是自己写. 那么我们 ...
- 用Unity做游戏,你需要深入了解一下IL2CPP
这次我们翻译了一篇Unity官方博客上的文章,原文题目为AN INTRODUCTION TO IL2CPP INTERNALS ,作者是从事Unity软件开发的Joshua Peterson.文章的看 ...
- unity简易小地图的实现(NGUI)
首先,我们在场景中添加一个摄像机叫做minimapCamera, 把上面的Audio Listener组件去掉,调整摄像机位置,将其置于角色正上方,如图 新建一个Texture我们叫做minimapT ...
- Unity做360度的全景照片
这里推荐两种方法,第一种是用鼠标滑动,第二种是用手机的陀螺仪进行全景查看 第一种: 1.新建一Sphere,然后为其赋予材质,注意材质的Shader类型为:Mobile/particles/Alpha ...
- 用Unity做的一个小游戏,仿照一个样例写的,个人认为文章写的不错,哈哈
随机推荐
- Spring解决Attribute tx bound to namespace httpwww.w3.org2000xmlns was already specified
Spring|解决Attribute "tx" bound to namespace "http://www.w3.org/2000/xmlns/" was a ...
- POJ1456 Supermarket 题解
思维题. 关键在于如何想到用堆来维护贪心的策略. 首先肯定是卖出的利润越大的越好,但有可能当前这天选定了利润最大的很久才过期而利润第二大的第二天就过期,这时的策略就不优了. 所以我们必须动态改变策略, ...
- 虚拟机安装的kali操作系统实现共享文件夹
虚拟机共享文件夹设置. 1.[虚拟机]-->[设置] 2.先在本地新建一个共享文件夹,然后将此文件夹的路径添加到虚拟机 3.进入kali操作系统,运行命令sudo vmhgfs-fuse .ho ...
- tomcat与springmvc 结合 之---第18篇 StandContext容器和SpringMVC的监听器的模型
writedby张艳涛 如何使用tomcat的监听器 public class BootStrap_ex06 { public static void main(String[] args) { Ht ...
- No_1 手写Proxy
手写动态代理主要原理: userDAO=(UserDAO)Proxy.newProxyinstance(classloader,interfaces[],new MyInvocationHandler ...
- java try_catch 分析
1.若一段代码前有异常抛出,并且这个异常没有被捕获,这段代码将产生编译时错误「无法访问的语句」.如 public class try_catch_Demo { public static void m ...
- koa踩坑记录
1.koa热更新用nodemon 2.koa中暂不支持import/export 3.只发送options请求,没有后续请求 当ctx.set('Access-Control-Allow-Cred ...
- 线性反馈移位寄存器(LFSR)
LFSR用于产生可重复的伪随机序列PRBS,该电路有n级触发器和一些异或门组成,如下图所示. 其中,gn为反馈系数,取值只能为0或1,取为0时表明不存在该反馈之路,取为1时表明存在该反馈之路:这里的反 ...
- pwnable.kr之simple Login
pwnable.kr之simple Login 懒了几天,一边看malloc.c的源码,一边看华庭的PDF.今天佛系做题,到pwnable.kr上打开了simple Login这道题,但是这道题个人觉 ...
- SVG和Canvas的区别?
什么是SVG? SVG(可缩放矢量图形)编辑可缩放矢量图形是基于可扩展标记语言(标准通用标记语言的子集),用于描述二维矢量图形的一种图形格式.它由万维网联盟制定,是一个开放标准. 什么是 Canvas ...