版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、在看此文章时请先看上面的参考文章。更多精彩请关注【狗刨学习网】 看完以上文章后,你也许会想人家都已经给出所有代码了,你还写个毛啊 别急,现在进入主题 在我的项目中,我采用的是物体遮挡作半透明处理,如果按照上述文章中的思路来写代码的话,那么结果就是当多个物体遮挡角色时,只有第一个物体会半透明,如图: 角色被墙和屋顶遮挡住了,但是可以清楚的看见左下角的墙呈半透明状态,而屋顶依旧不透明
2、; 为了解决这个问题,我们不采用上述文章中的 physics.Linecast,在这里我们需要用到 Physics.RaycastAll;使用方法详见圣典 ok,现在我们开始敲代码 首先 ,我们引入命名空间 System.Collections.Generic,然后在声明三个需要用到的变量1. <font face="新宋体" size="2">using System.Collections.Generic;/引入命名
3、空间2.3. public class MyCamera1 : MonoBehaviour4. 5. /观察目标6. public Transform Target;7.8. /上次碰撞到的物体9. private List<GameObject> lastColliderObject;10.11. /本次碰撞到的物体12. private List<GameObject> colliderObject;
4、13. </font>复制代码 我们需要发射一条射线,这条射线从角色当前位置发射置摄像机的方向1. <font face="新宋体" size="2"> /*射线可以从头部起始*/2. 2 3. 3 /这里是计算射线的方向,从主角发射方向是射线机方向4. 4 Vector3 aim = Target.position;5
5、. 5 /得到方向6. 6 Vector3 ve = (Target.position - transform.position).normalized;7. 7 float an = transform.eulerAngles.y;8. 8 aim -= an * ve;9. 9 1
6、0. 10 /在场景视图中可以看到这条射线11. 11 /Debug.DrawLine(target.position, aim, Color.red);12. 12 13. 13 RaycastHit hit;14. 14 hit = Physics.RaycastAll(Targe
7、t.position, aim, 100f);/起始位置、方向、距离</font>复制代码 射线发送完毕后,我们获取发送射线时碰撞到的所有物体,并且添加进本次碰撞到的物体(colliderObject)变量中 因为我的地图、护栏碰撞(不可见)、地面碰撞(不可见)是三个模型,也就是说地图本身是没有任何碰撞的 所以当碰撞到的物体名为护栏或地面时,就不修改其透明度,因为他本身就不可见 这里我偷懒了,
8、直接判断物体名称,可自行改为判断物体 tag 当视角旋转的时候,射线有时候会碰撞到角色,所以,我们获取 tag 判断是否碰撞的物体为角色1. <font face="新宋体" size="2"> 1 /将 colliderObject 中所有的值添加进 lastColliderObject2. 2 for (int i = 0; i < c
9、olliderObject.Count; i+)3. 3 lastColliderObject.Add(colliderObjecti);4. 4 5. 5 colliderObject.Clear();/清空本次碰撞到的所有物体6. 6 for (int i = 0; i < hit.Length; i+)/获取碰撞到的所有
10、物体7. 7 8. 8 if (hiti.collider.gameO != "Editable Poly 1"/护栏9. 9 && hiti.collider.gameO != "
11、Editable Poly"/地面10. 10 && hiti.collider.gameObject.tag != "Player")/角色11. 11 12. 12
12、 /Debug.Log(hiti.collider.gameO);13. 13 colliderObject.Add(hiti.collider.gameObject);14. 14 SetMaterialsColor(hiti.collider.gam
13、eObject.renderer, 0.4f);/置当前物体材质透明度15. 15 16. 16 </font>复制代码 当获取到所碰撞到的所有物体后,我们要修改他的材质透明度,有些物体有很多材质,不知道怎么解决的请看我下面这个方法:1. <font face="新宋体" size="2"> 1
14、; / 置物体所有材质球颜色 <summary>2. 2 / 置物体所有材质球颜色3. 3 / </summary>4. 4 / <param name="_renderer">材质</param>5. 5 / <param name="Transpa">透明度</
15、param>6. 6 private void SetMaterialsColor(Renderer _renderer, float Transpa)7. 7 8. 8 /获取当前物体材质球数量9. 9 int materialsNumber = _renderer.sharedMaterials.Length;10. 10
16、160; for (int i = 0; i < materialsNumber; i+)11. 11 12. 12 /获取当前材质球颜色13. 13 Color color = _renderer.materialsi.color;14. 14 1
17、5. 15 /设置透明度 取值范围:01; 0 = 完全透明16. 16 color.a = Transpa;17. 17 18. 18 /置当前材质球颜色19. 19
18、 _renderer.materialsi.SetColor("_Color", color);20. 20 21. 21 </font>复制代码 如果本次碰撞到的物体存在于上个物体,那么则说明当前物体还处于遮挡角色状态,所以我们赋值为null1. <font face="新宋体" size="2">
19、 1 /上次与本次对比,本次还存在的物体则赋值为null2. 2 for (int i = 0; i < lastColliderObject.Count; i+)3. 3 4. 4 for (int ii = 0; ii < colliderObject
20、.Count; ii+)5. 5 6. 6 if (colliderObjectii != null)7. 7 8. 8
21、60; if (lastColliderObjecti = colliderObjectii)9. 9 10. 10
22、60; lastColliderObjecti = null;11. 11 break;12. 12 13. 13 14. 14 15. 15 </font>复制代码 还处于遮挡状态的物体已被赋值为null,那么剩下的物体就是没有处于遮挡状态的,所以我们要重置该物体材质为不透明1. <font face="新宋体" size=&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 全国交通安全课件
- 高德导航推广话术
- 拼团购买引导话术
- 移民案例面试应对策略
- 英国人工智能战略布局
- 光纤技术教学课件
- 英语翻译应用就业前景
- 消防安全关爱行动倡议书
- 光伏行业安全员培训课件
- 期末考试财产分配问题及答案
- 2025年变电检修笔试题及答案
- 含酚污水处理操作规程
- 江苏省苏州市吴中学、吴江、相城区2024-2025学年化学九上期末质量检测模拟试题含解析
- 建筑公司发展策划方案
- 肿瘤常见症状管理
- 机械进出场管理制度
- 教育培训机构董事会决策机制范文
- 胰岛素皮下注射团体标准解读
- 《电气安装与维修》课件 项目四 YL-G156A 型能力测试单元-智能排故板
- 海洋能技术的经济性分析
- 云南省昭通市2024-2025学年七年级上学期期末历史试题(含答案)
评论
0/150
提交评论