unity3d学习笔记(十一)-NGUI结合Shader制作小map

【Unity3d】随机生成地图(Map) 随机地图效果图1图2图3图4图5图6图7总结 可改变地图的大小尺寸(new vector2(x,y))——图1 可改变地图上障碍物的个数(Obstacle(Random(0,1)))——图2 可改变障碍物位置随机摆放(seed)——图3 可改变地图上障碍物随机不同高度(min,max)——图4,5 可改变地图上障碍物渐变颜色(Color)——图6,7 提示:以下是本篇文章正文内容,下面案例可供参考 效果 图1 图2 图3 图4 图5 图6 图7 总结 ... 阅读详情
在做这个demo的过程中,制作小地图着实刁难了我一把,百度了很多文章,花了好长的时间,需要的知识点实在太多了,尤其是shader语言,好在最后成功把它啃下来了,先声明一下,本篇文章将会是这个系列中最难的,不过如果成功做出来成就感也是大大的,其实按照我的步骤一步一步来也没那么复杂啦,接下来我把这个过程分享给大家,下面上一张截图:

  950x610

  看右上角,那个就是小地图,也许有点不太好看,没办法,谁让我不是美术啊,需要的图素都是自己用Photoshop做的,记得有人说过,不会美术的程序不是好策划,所以自己来吧。

  先说一下原理,我们做小地图用的技术就是遮罩,玩过flash的对这个词应该不新鲜,何为遮罩呢,通俗一下讲,你有两张纸,一张纸上画了漂亮的山川河流,另一张纸就是张白纸,中间挖个圆洞,然后你把白纸盖在那张画满山川河流的纸上,只有中间圆洞的地方你能看到,其他地方都被盖住了,保持白纸不动,移动后面的画纸,你会看到连续的不同的地貌,我们的小地图原理就是这样的,时刻保持角色在中间,动的只是后面的背景罢了。只是这里需要多处理一下,就是除了那个圆洞,其他的部分我们要透明掉。

  相信这么解释应该没有不懂的了吧。如果还不清楚那要么是我的表达能力有问题,要么你的智商。。。咳咳,言归正传,按照上面的理论,我们都该准备些什么呢。最起码的得有一张完整的地图吧,得有个圆形的遮罩吧,再漂亮点圆形遮罩需要个圆框,地图上得有个小标志显示玩家的位置和方向。

  地图好搞,在unity中调到场景的顶视图,然后截个图就好了,缩放一下比例,我的地图是512*512的,取名map,如下图:

  512x512

  丑是丑了点,谁让我的地形简单呢,再一次声明,我是个程序。

  遮罩就需要你自己画个了,要保证它和背景图一样大,我这里也是512*512的,中间是个白色的圆,其他地方alpha是透明的。如图:

  233x220

  我这里并没有截全部512的图,不要以为只这么小啊,除了白圆,其他地方都是透明的,其实什么颜色的无所谓,只要是圆的就行。

  然后做个圆框,也是512的,圆框和白圆大小一致,中间和其他地方都是透明的。

  233x215

  最后是角色的那个小标记

  72x57

  资源就这些,准备好就可以开干了。

  关于NGUI我这里就不解释了,看过我前面文章的童鞋应该知道怎么用了,我们要把小地图放在右上角的锚点上,不是简单的放几个sprite的事情,那我们需要做些什么呢。来,我们倒着说,先看结果,我希望我的右上角先有个Panel,然后Panel下有个Textrue,而我的小地图就是绘制在这个Texture上;那小地图是以什么方式绘制到这个Texture上的呢,当然是靠material(材质),而且是一个能实现遮罩,透明,动态渲染的材质。那只能靠材质中的shader了;先不说遮罩和透明,先说动态渲染,我们以前用到的材质都是静态的,而现在我们要用到的是地图可以移动的动态材质,所以要用动态渲染,要说动态渲染,那最先想到的就是Render Texture,要说什么是Render Texture,看这里好了:渲染纹理。由果推因,我们就知道都该做些什么了,一个一个攻克吧,现在我们由因及果。

  1、绘制渲染纹理(Render Texture)

  a、先在MainCamera下创建一个UI,选择NGUI->Open the UI Wizard,保持设置,点Create Your UI,然后Anchor下的Panel改名为MiniMapRenderPanel。

  b、创建一个Atlas,不知道什么是Atlas的可以看我前面的文章,选NGUI->Open the Atlas Maker,新弹出的界面上修改你的atlas名称,点击那个完整的地图,就是我上面的那个map,然后点Create。

  327x314

  c、在MiniMapRenderPanel下建一个sprite,NGUI->Open the Widget Wizard,Atlas选刚建的那个Atlas,Template选sprite,Sprite选map,其他默认。最后建完了是这个结构。

  337x97

  d、在资源里新建个Render Texture,Assets->Create->Render Texture,起名MiniMapRenderTexture。

  e、设置camera,那个NGUI的camera设置如下:

  309x294

  Clear Flags设为Solid Color,Background设为黑色,这样当你走到地图的边缘时,没有地图的地方会绘制成黑色。Projection设为平行投影Orthographic,不了解平行投影和透视投影的话需要补一下3d基础了。Target Texture那里把之前做的那个Render Texture拖上去。这样摄像机投影的地方就会绘制在这个Render Texture上,也就是地图会绘制在它上面了,然后我们就可以做material了。

  f、有一点差点忘了,Anchor那里的Side一定要选择TopLeft,地图的原点是从左下角开始的。

  312x152

  2、制作材质(material)

  这是本篇的难点,要用到shader语言,如果没有3d基础的可能理解起来有点费劲,不懂也没关系,按着操作也能做出来。

  a、创建一个Shader,Assets->Create->Shader。

  b、打开shader,把下面的代码覆盖过去。

  Shader "Transparent/Mask"{ Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _Mask ("Culling Mask", 2D) = "white" {} _Cutoff ("Alpha cutoff", Range (0,1)) = 0.1 } SubShader { Tags {"Queue"="Transparent"} Lighting Off ZWrite Off Blend Off AlphaTest GEqual [_Cutoff] Pass { SetTexture [_Mask] {combine texture} SetTexture [_MainTex] {combine texture, previous} } }}

你百度遮罩shader的话会有很多,但基本没有解释的,我这里解释一下,第一行是设置你的shader的路径和名称,比如上面的shader就建在了Transparent下,起名Mask,大括号里面有两个部分,第一个部分是属性Properties,第二部分是SubShader。

  Properties里是设置渲染的属性,比如这里设置了两张图片和一个滑动条,第一张图片用来加载背景图片,就是我们之前做的那个Render Texture,用来显示地图,第二张图片就是遮罩图片,用我们之前的那个白圆,滑动条范围从0到1,初始值0.1,再看一下语法。

  _MainTex ("Base (RGB)", 2D) = "white" {}


_MainTex是属性名,会在SubShader中用到,Base (RGB)是在界面上显示的名称,你会在属性面板上看到,2D是图片维数,white是默认值。
SubShader是处理渲染的主体,Tags是标签,Queue标签决定被渲染的次序,而Transparent是四个预定义的渲染队列之一,任何有关alpha混合的对象都应该在这里处理,看这里可以了解的更多:SubShader Tags,关闭光照,关闭z缓冲器的写操作,关闭混合,Alpha测试是当Alpha大于等于你之前设定的_Cutoff时有效,也就是说这里当alpha大于等于0.1的图素会被渲染出来,其他的就透明了。Pass通道里处理混合,先设置第一张图片:SetTexture [_Mask] {combine texture},这里是遮罩图片,然后第二张图片和前一张混合:SetTexture [_MainTex] {combine texture, previous},而我们之前关闭了混合,所以第二张图片只是纯粹的显示,但大括号里第二个参数表示alpha,这里previous表示我们用之前那张图片的alpha,而第一张图片的alpha除了白圆部分,其余部分都是0,所以这张图片除了与白圆 重合的地方,其他地方alpha也是0,这样就透明了,只剩下了圆的地方,想了解Pass看这里:着色器语法:Pass,想了解SetTexture看这里:着色器语法:Texturing。

  写了这么多,纯粹手打,觉得好的麻烦支持一下,哈哈。Shader有一定难度,但据说会shader的程序员薪水都在2万以上啊,望眼欲穿啊,所以大家努力学吧。

  如果上面的没看懂,你又不想学,那就跳过吧,反正把代码粘过去就可以了。

  c、创建一个material,Assets->Create->Material,然后Shader那里找到你建的那个shader,在Transparent下面。

  d、这时界面上会出现Base(RGB)和Culling Mask,Base(RGB)里把你之前那个Render Texture拖上去,Culling Mask把那个白圆的图片拖上去,如下图:

  310x294

  这样你的材质就做完了。坚持到这步的为自己鼓个掌吧,你离成功不远了。

  3、在界面的右上角用NGUI建地图

  终于到了最后一步了,剩下的工作就简单多了,回到你的界面布局那里,有关NGUI界面布局不了解的看我前面的文章,在右上角的Anchor下建个Panel,起名MiniMapPanel,然后下面加两个sprite和一个Texture,一个sprite是圆框,一个sprite是小箭头,表示地图上的玩家,Texture用来接收之前的材质显示地图,如下图:

  253x212

  310x278

  Texture那里大小调成512*512的,Material那里把之前做的材质拖上去就ok了,如果显示顺序有问题别忘了调Depth或Z值。

  现在你应该可以看到东西了,但小箭头位置不对,当然,还没上代码呢。

  创建一个MiniMap的脚本,我把全部代码贴上来。

  public class MiniMap : MonoBehaviour {// Use this for initializationpublic GameObject point;public GameObject map;private GameObject hero;private float miniMapScaleRatio;void Start () {map.transform.localScale = new Vector3(Screen.height, Screen.height, 1);hero = GameObject.Find("/Blade_Girl_Prefab");GameObject terrain = GameObject.Find("Terrain");Terrain script = terrain.GetComponent<Terrain>();miniMapScaleRatio = (float)map.transform.localScale.x / script.terrainData.size.x;}// Update is called once per framevoid Update () {if (hero && point && map) {point.transform.rotation = Quaternion.Euler(0, 0, -hero.transform.rotation.eulerAngles.y);map.transform.localPosition = new Vector3(){x = -hero.transform.position.x * miniMapScaleRatio,y = -hero.transform.position.z * miniMapScaleRatio,z = 0,};}}}

代码不多吧,point是玩家标志小箭头,map是地图面板,就是1里面那个MiniMapRenderPanel,public属性的,自己拖上去吧。hero是我们的主角,miniMapScaleRatio是地图和真实地形尺寸比例,start里的第一句是在干吗呢,虽然我们的地图是512*512的,但经过实测,发现这个尺寸会随着屏幕的高度而有误差,需要设置成屏幕的高度这种尺寸,好吧,我也需要有人帮我解释下,Update里时刻获得主角的转向,主角在世界中是绕y轴旋转的,小标志是绕z轴旋转的,并且方向相反,这里要注意一下。然后按照角色在地形上的位置乘以地图与地形的比例获得小标志在地图上的位置,噢啦,大功告成,打完收工。
Unity标准 Shader 下的十种贴图类型 一、Main Maps 主贴图区域 1.Albedo 贴图 ** Albedo:反照率[贴图];用于体现模型的纹理,颜色。 反照率贴图本身是一张颜色与纹理的贴图。   该选项有贴图属性,也有颜色属性。 两个属性可以单独使用,也可以组合使用; 当颜色属性为纯白色时,则不影响贴图的效果; 当颜色属性为其他颜色时,则叠加贴图效果。   2.Metallic 贴图 ** 金属度[贴图... 阅读详情

相关推荐

NGUI扩展:为面板(Panel)添加自定义图片遮罩

前一阵开发遇到一个需求需要shix

Sparrowfc的专栏 1万+

【unity3D】TileMap基础知识(详细版)

💗希望我记录下来的笔记可以帮到你

zhurouwanzi的博客 7549

unity ugui/ngui图片抖动shader

unity ugui/ngui图片抖动shader、通过uv偏移实现图片抖动。

Unity 3D,小地图,制作教程

    笔者的Unity 3D课程已经结束,这里记录下几个比较常用的功能教程并分享给大家。    接下来我们说一说小地图的制作,具体思路为:在角色头顶创建一个摄像机,并选择二维显示跟踪角色运动。然后将场景中的元素分为多个layer并根据需要去渲染,最后通过更改摄像机的size放大或缩小小地图。    1.创建一个Camera,通过宣传其视角,将它垂直于地面,Projection选择Orthegra...

VM_Alike的博客 1万+

如何搭建一个vue项目(完整步骤)

查看版本的两种方式 出现版本号则说明安装成功(最新的以官网为准) 这里注意:安装vue-cli对node.js的版本是有要求的 装的两种方式:输入cmd命令 查看安装的版本(显示版本号说明安装成功) 如果你原来有版本或者版本比较低,可以升级...

m0_67392661的博客 5585

SAP MM委外加工保姆级教程:从BOM配置到MIGO发货的完整避坑指南

本文提供SAP MM模块中委外加工的完整操作指南,涵盖从BOM配置到MIGO发货的全流程。详细解析委外采购和工序委外两种模式,包括主数据配置、采购订单创建及物料移动等关键步骤,帮助用户规避常见错误,提升供应链管理效率。特别适合制造业企业实施SAP外包业务参考。

weixin_26905487的博客 527

Unity 生成随机房间、洞穴(2D、3D地图)总结

Unity 编写代码,生成随机洞穴(类似蜂巢)(2D、3D地图迷宫),平滑地图块,渲染地图。 参考官网教程:Procedural Cave Generation tutorial 完整Github工程:CaveGeneration   跟着官方教程走了一遍,基本明白如何创建一个随机地图了。主要是算法的问题,如用广度优先获取区域(房间或墙)大小,用深度优先递归查找区域边界,还有计算两点之间

l773575310的博客 4万+

NumPy 与 Pandas 的详细应用(含实例)

本文系统介绍了Python数据分析中NumPy和Pandas两大核心库的应用。NumPy专注于高效数值计算,提供多维数组和向量化运算功能;Pandas则擅长结构化数据处理,支持数据清洗、分组统计等操作。文章详细讲解了库的安装、基础操作(数组/DataFrame创建、索引切片)、进阶功能(缺失值处理、分组聚合),并通过电商销售分析案例演示了实际应用场景。最后总结了二者的协同优势:NumPy负责底层数值计算,Pandas处理高级数据操作,配合使用可显著提升数据处理效率。建议读者从基础操作入手,结合实际案例练习,

weixin_42030577的博客 2298

[Shader]对NGUI的UISprite和UITexture进行裁剪

版权所有,转载须注明出处!喜欢火影、喜欢Java、喜欢unity3D、喜欢游戏开发的都可以加入木叶村Q群:3790762270、随便聊本人真正学习Shader的时间莫过于今年春节在家的两天时间,虽然短短两天。但是已经深深喜欢上Shader。深受其魅力吸引。但是平常主要做的还是服务端和客户端的开发,偏逻辑向。所以好久也没碰Shader了。但是昨天在一个群里有人讨论NGUI不能对Sprite进行裁剪。

游戏开发者 1万+

AS7341光谱传感器实战:如何用STM32F103精准测量环境色温(附完整代码)

本文详细介绍了如何使用STM32F103驱动AS7341光谱传感器实现环境色温的精准测量。从硬件连接到驱动开发,再到色温计算算法的实现,提供了完整的代码示例和优化建议,帮助开发者在智能照明、农业监测等领域快速应用AS7341进行高精度色温检测。

weixin_30352645的博客 478

DB2__基本概念——联邦

建立联邦 优点:优点是数据仍然保留在原来的存储位置,而不必建立一个集中的式数据仓储。  缺点:数据联邦查询反映会慢,不适合频繁查询,而且容易出现锁争用和资源冲突等问题 建立联邦表步骤 前提条件:知道两个数据库的ip,用户名,密码及被连数据库的版本 eg:  数据库  qqdb  ip: 22.5.225.225   端口:50000    密码:123456        数据库   ...

qq_38569524的博客 1255

unity3d学习笔记(十一)--NGUI结合Shader制作小地图

在做这个demo的过程中,制作小地图着实刁难了我一把,花了好几天的时间,需要的知识点实在太多了,尤其是shader语言,好在最后成功把它啃下来了,接下来我把这个过程分享给大家,下面上一张截图: 看右上角,那个就是小地图,也许有点不太好看,没办法,谁让我不是美术啊,需要的图素都是自己用Photoshop做的,记得有人说过,不会美术的程序不是好策划,所以自己来吧。 先说一下原理,我

lzhq1982的专栏 1万+

世界职业院校技能大赛商贸赛道项目参考逐字稿一

商贸赛道“智选优品”—基于大数据与AI驱动的跨境电商平台项目参考逐字稿您订阅本专栏后即可`永久享有所有文章的查阅权`,希望我们更新的参考资料能帮助到您。如果您需要我们团队赋能培训可联系我(企业一线工程师及国一获奖选手在线培训支持:每周直播精讲(可回放,支持弹幕答疑)、代码Review+技术售后(拉群随时问,12h内响应)、④路演PPT+答辩话术一对一点评,评委视角提前彩排、适合:中职/高职赛项选手、指导老师带队、校企工作室、整校打包另谈(可开发票))

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 1586

[Shader]对NGUI的UISprite和UITexture进行裁剪(scrollview + 遮罩)

由于最近比较忙,所以很多我在其它地方发布的博文都没有同步到这里。我会在后面慢慢重新补回来。对各位关注我博客的读者也表示抱歉! 版权所有,转载须注明出处! 喜欢火影、喜欢Java、喜欢unity3D、喜欢游戏开发的都可以加入木叶村Q群:379076227 0、随便聊 本人真正学习Shader的时间莫过于今年春节在家的两天时间,虽然短短两天。但是已经深深喜欢上Shader。深受其魅

张涵的博客 5529

SSH 远程登录报错:kex_exchange_identification: Connection closed.....

不知道为啥会出现这样的情形,最近这段时间登录都是正常的,不知道哪里抽风了,就提示这个。错误信息 kex_exchange_identification: Connection closed by remote host 出现在尝试使用 SSH 连接到远程服务器过程中,表明在密钥交换阶段的一开始,远程主机就关闭了连接。服务器的sshd_config文件中配置错误,可能是不允许的加密算法、修订文件中的语法错误,或者未正确指定用于SSH的HostKey。如果当前已有太多活动连接,新的连接尝试可能会被拒绝。

飞越蓝天的专栏 8297

DeepQA: A Unified Transcriptome-Based Aging Clock Using Deep Neural Networks

摘要: 本研究针对转录组衰老时钟存在的关键局限——仅在健康样本训练导致对患病个体预测偏差的问题,提出DeepQA,一种基于专家混合架构与新型Hinge-MAE损失函数的深度学习模型。通过同时利用健康与患病个体的异质数据训练,DeepQA显著提升预测精度:在健康个体上MAE比现有方法低1.5年,且是首个能正确处理五类疾病条件的模型。其创新性体现在: 方法学突破:Hinge-MAE损失函数消除健康/患病样本的训练偏差,专家混合架构高效整合多队列数据; 流程革新:摒弃传统基因预筛选步骤,通过显著图分析直接识别衰老

qq_44050612的博客 125

Unity3D使用NGUI制作小地图

本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢。 http://blog.youkuaiyun.com/lzhq1982/article/details/12783493 在做这个demo的过程中,制作小地图着实刁难了我一把,百度了很多文章,花了好长的时间,需要的知识点实在太多了,尤其是shader语言,好在最后成功把它啃下来了,先声明一下,本篇文章将

yuxikuo_1的专栏 1221

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Unity3D学习笔记(十八)使用插件NGUI制作小地图

原本只是想用Unity自带的GUI功能实现魔兽世界的小地图效果,结果折腾了一个晚上。 原来的思路如下: 根据玩家坐标,计算出应显示的地图缩略图部分(128×128); 用GUI遮罩将非白色的部分剔除(这样可以实现任意形状的小地图); 将地图框叠加到第二步中的纹理上; 将玩家指示物放置在地图中心,并根据当前玩家的Transform.Rotation计算出指示物的旋转角度

mysouling的专栏 1106

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Unity3D-NGUI动态加载图片

NGUI提供了很方便的UIAtlas,其主要作用是改进DrawCall,把众多图片整合在一张贴图上,由于UNITY3D简单易用的好处,所以只是用原生的GUI很容易忽视DrawCall的问题,所以NGUI为了改进,才有了UIAtlas。当然NGUI还做了很多优化。 这里主要还是介绍如何利用UISprite来动态的加载图片。NGUI所提供的UIAtlas虽然好用,但只能在Editor内生成贴图和

huang9012的专栏 1782

Unity3d NGUI的使用(四)(TexturePacker与UIAtlas生成prefabs)

TexturePacker可以将游戏素材零碎的图片打包在一块,这样更方便读取 而与Unity3d prefabs组合起来使用,使得读取图片达到一个速率更高的层次 TexturePacker: a.下载最新版的TexturePacker软件 b.打开软件后,点击Add Sprites,添加一些图片 c.然后点击View-textureSettings打开设置面板 d.选择Unit

Unity3d 攻城师一枚 6569

Unity制作小地图

这个小地图同样需要一个渲染的场景贴图作为地图,然后需要一个带圆形孔的面片,这个面片需要一个带Transparent Alpha_Cancel的shader的材质球,贴图同样也是地图贴图,接下来就需要一个看这个地图的摄像机了,相机保持和角色在同一XZ坐标,小孔面片永远保持在摄像机相同位置,这样运行起来后就可以看到小地图跟着动了,如果需要BootCamp里面那种带方位指示的东西的话,就只需要再创建一个透明通道的面片,带上喜欢的样式的指针贴图。真正处理地图运动的就是17行和18行的代码,2行代码全部搞定定位。

小小姑娘 1627

【NGUI源码剖析】NGUI的drawcall

前言 在使用unity3d开发实际的项目中,性能优化一直是一项不得不考虑的重点,而其中UI的优化又是绕不过去的坎,很多看似简单的UI为何会占用大量的cpu开销?本文以NGUI这套UI的解决方案为例,从源码出发,分析影响性能的原因,看清问题的本质,对症下药。NGUI的drawcall 在Unity中,每次引擎准备数据并通知GPU的过程称为一次Draw Call。这一过程是逐个物体进行的,对于每个物

coffeecato的个人博客 2091
上一篇: unity3d 在UGUI中制作自适应调整大小的滚动布局控件
下一篇: Unity3D脚本中文字符乱码的解决方案
Rains卍Soft
博客等级 码龄19年 486粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值