unity3d摄像机跟随角色时被物体遮挡解决方案

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

在看此文章时请先看上面的参考文章。更多精彩请关注【狗刨学习网】看完以上文章后,你也许会想人家都已经给出所有代码了,你还写个毛啊别急,现在进入主题在我的项目中,我采用的是物体遮挡作半透明处理,如果按照上述文章中的思路来写代码的话,那么结果就是当多个物体遮挡角色时,只有第一个物体会半透明,如图:角色被墙和屋顶遮挡住了,但是可以清楚的看见左下角的墙呈半透明状态,而屋顶依旧不透明为了解决这个问题,我们不采用上述文章中的physics.Linecast,在这里我们需要用到Physics.RaycastAll;使用方法详见圣典ok,现在我们开始敲代码首先,我们引入命名空间System.Collections.Generic,然后在声明三个需要用到的变量1.fontface=新宋体size=2usingSystem.Collections.Generic;//引入命名空间2.3.publicclassMyCamera1:MonoBehaviour4.{5.//观察目标6.publicTransformTarget;7.8.//上次碰撞到的物体9.privateListGameObjectlastColliderObject;10.11.//本次碰撞到的物体12.privateListGameObjectcolliderObject;13.}/font复制代码我们需要发射一条射线,这条射线从角色当前位置发射置摄像机的方向1.fontface=新宋体size=2/*射线可以从头部起始*/2.23.3//这里是计算射线的方向,从主角发射方向是射线机方向4.4Vector3aim=Target.position;5.5//得到方向6.6Vector3ve=(Target.position-transform.position).normalized;7.7floatan=transform.eulerAngles.y;8.8aim-=an*ve;9.910.10//在场景视图中可以看到这条射线11.11//Debug.DrawLine(target.position,aim,Color.red);12.1213.13RaycastHit[]hit;14.14hit=Physics.RaycastAll(Target.position,aim,100f);//起始位置、方向、距离/font复制代码射线发送完毕后,我们获取发送射线时碰撞到的所有物体,并且添加进本次碰撞到的物体(colliderObject)变量中因为我的地图、护栏碰撞(不可见)、地面碰撞(不可见)是三个模型,也就是说地图本身是没有任何碰撞的所以当碰撞到的物体名为护栏或地面时,就不修改其透明度,因为他本身就不可见这里我偷懒了,直接判断物体名称,可自行改为判断物体tag当视角旋转的时候,射线有时候会碰撞到角色,所以,我们获取tag判断是否碰撞的物体为角色1.fontface=新宋体size=21//将colliderObject中所有的值添加进lastColliderObject2.2for(inti=0;icolliderObject.Count;i++)3.3lastColliderObject.Add(colliderObject[i]);4.45.5colliderObject.Clear();//清空本次碰撞到的所有物体6.6for(inti=0;ihit.Length;i++)//获取碰撞到的所有物体7.7{8.8if(hit[i].collider.gameObject.name!=EditablePoly1//护栏9.9&&hit[i].collider.gameObject.name!=EditablePoly//地面10.10&&hit[i].collider.gameObject.tag!=Player)//角色11.11{12.12//Debug.Log(hit[i].collider.gameObject.name);13.13colliderObject.Add(hit[i].collider.gameObject);14.14SetMaterialsColor(hit[i].collider.gameObject.renderer,0.4f);//置当前物体材质透明度15.15}16.16}/font复制代码当获取到所碰撞到的所有物体后,我们要修改他的材质透明度,有些物体有很多材质,不知道怎么解决的请看我下面这个方法:1.fontface=新宋体size=21///置物体所有材质球颜色summary2.2///置物体所有材质球颜色3.3////summary4.4///paramname=_renderer材质/param5.5///paramname=Transpa透明度/param6.6privatevoidSetMaterialsColor(Renderer_renderer,floatTranspa)7.7{8.8//获取当前物体材质球数量9.9intmaterialsNumber=_renderer.sharedMaterials.Length;10.10for(inti=0;imaterialsNumber;i++)11.11{12.12//获取当前材质球颜色13.13Colorcolor=_renderer.materials[i].color;14.1415.15//设置透明度取值范围:0~1;0=完全透明16.16color.a=Transpa;17.1718.18//置当前材质球颜色19.19_renderer.materials[i].SetColor(_Color,color);20.20}21.21}/font复制代码如果本次碰撞到的物体存在于上个物体,那么则说明当前物体还处于遮挡角色状态,所以我们赋值为null1.fontface=新宋体size=21//上次与本次对比,本次还存在的物体则赋值为null2.2for(inti=0;ilastColliderObject.Count;i++)3.3{4.4for(intii=0;iicolliderObject.Count;ii++)5.5{6.6if(colliderObject[ii]!=null)7.7{8.8if(lastColliderObject[i]==colliderObject[ii])9.9{10.10lastColliderObject[i]=null;11.11break;12.12}13.13}14.14}15.15}/font复制代码还处于遮挡状态的物体已被赋值为null,那么剩下的物体就是没有处于遮挡状态的,所以我们要重置该物体材质为不透明1.fontface=新宋体size=21//当值为null时则可判断当前物体还处于遮挡状态2.2//值不为null时则可恢复默认状态(不透明)3.3for(inti=0;ilastColliderObject.Count;i++)4.4{5.5if(lastColliderObject[i]!=null)6.6SetMaterialsColor(lastColliderObject[i].renderer,1f);//恢复上次物体材质透明度7.7}/font复制代码好了,所有代码已完成,我们看一下运行结果未遮挡时:遮挡时:怎么样,有木有感觉很酷炫呢,哈哈哈

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功