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

上传人:scccc 文档编号:12144440 上传时间:2021-12-02 格式:DOC 页数:9 大小:275KB
返回 下载 相关 举报
unity3d摄像机跟随角色时被物体遮挡解决方案.doc_第1页
第1页 / 共9页
unity3d摄像机跟随角色时被物体遮挡解决方案.doc_第2页
第2页 / 共9页
unity3d摄像机跟随角色时被物体遮挡解决方案.doc_第3页
第3页 / 共9页
unity3d摄像机跟随角色时被物体遮挡解决方案.doc_第4页
第4页 / 共9页
unity3d摄像机跟随角色时被物体遮挡解决方案.doc_第5页
第5页 / 共9页
亲,该文档总共9页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《unity3d摄像机跟随角色时被物体遮挡解决方案.doc》由会员分享,可在线阅读,更多相关《unity3d摄像机跟随角色时被物体遮挡解决方案.doc(9页珍藏版)》请在三一文库上搜索。

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.gameObject.name != "Editable Poly 1"/护栏9. 9                 && hiti.collider.gameObject.name != "

11、Editable Poly"/地面10. 10                 && hiti.collider.gameObject.tag != "Player")/角色11. 11             12. 12               

12、  /Debug.Log(hiti.collider.gameObject.name);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           

23、60;     14. 14             15. 15         </font>复制代码       还处于遮挡状态的物体已被赋值为null,那么剩下的物体就是没有处于遮挡状态的,所以我们要重置该物体材质为不透明1. <font face="新宋体" size="2">1 /当值为null时则可判

24、断当前物体还处于遮挡状态2. 2         /值不为null时则可恢复默认状态(不透明)3. 3         for (int i = 0; i < lastColliderObject.Count; i+)4. 4         5. 5             if (lastColliderObjecti != n

25、ull)6. 6                 SetMaterialsColor(lastColliderObjecti.renderer, 1f);/恢复上次物体材质透明度7. 7         </font>复制代码      好了,所有代码已完成,我们看一下运行结果      未遮挡时:         遮挡时:                 怎么样,有木有感觉很酷炫呢,哈哈哈9 / 9文档可自由编辑打印

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1