跟我一起用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做的一个小游戏,仿照一个样例写的,个人认为文章写的不错,哈哈
随机推荐
- kubernetes/k8s CRI分析-容器运行时接口分析
关联博客:kubernetes/k8s CSI分析-容器存储接口分析 概述 kubernetes的设计初衷是支持可插拔架构,从而利于扩展kubernetes的功能.在此架构思想下,kubernetes ...
- header.mapper 用法
const header= [xxxx,xxxx] 基本用法是 const obj = header.map( item=>{ obj= item+'123'; return obj }) c ...
- Python 爬取 ajax 返回的数据
1 from urllib.request import quote, unquote 2 import random 3 import requests 4 5 #quote 将单个字符串编码转化为 ...
- mysql查询拥有某个字段的所有表
前言:最近遇到一个需求,需要给一个数据库所有的表添加一个字段,但是一些后创建的表已经有了这个字段,所以引发了下文. *注释 columnName 字段名 dbName 数据库名 #查询指定库拥有某 ...
- 论文笔记:(2019CVPR)PointConv: Deep Convolutional Networks on 3D Point Clouds
目录 摘要 一.前言 1.1直接获取3D数据的传感器 1.2为什么用3D数据 1.3目前遇到的困难 1.4现有的解决方法及存在的问题 二.本文idea 2.1 idea来源 2.2 初始思路 2.3 ...
- Cookie、Session、JWT在koa中的应用及实现原理
目录 Cookie 重要属性 实现原理 cookie签名实现原理 注意事项 Session 实现原理 JWT 使用方式 组成 实际应用 实现原理 前端存储方式 cookie session local ...
- 剑指 Offer 39. 数组中出现次数超过一半的数字
剑指 Offer 39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [ ...
- Java面向对象02——回顾方法(定义、调用)及加深
方法的定义 package oop.demon01; //Demon01 类 public class Demon01 { //main 方法 public stati ...
- 53. 最大子序和(剑指 Offer 42)
53. 最大子序和(剑指 Offer 42) 知识点:数组:前缀和:哨兵:动态规划:贪心:分治: 题目描述 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值. 要求 ...
- 控制流程之if判断与while、for循环
一.if判断 1.什么是if判断? 接收用户输入的名字 接受用户输入的密码 如果用户输入的名字=正确的名字 并且 用户输入的密码=正确的密码 告诉用户登录成功 否则, 告诉用户登录失败 2.为何要有i ...