前文:https://blog.csdn.net/Jaihk662/article/details/87632727(摄像机跟随)

前面已经提到了摄像机跟随角色的多种方法以及优化,但是很多时候摄像机与玩家之间可能会存在一些实体物体,这样子玩家的视野就会被遮挡,还有就是在切换视角的时候,摄像机最好可以平滑移动,这些问题当然是要被解决的……

一、当摄像机被遮挡时,调整摄像机与玩家之间的距离

核心:使用射线

前提条件:障碍物(阻挡物)存在BoxCollider组件,或者存在空气墙,建议前者效果更好

一些重要的API:

  • Physics.RaycastAll(当前目标,方向,射线长度):当前目标和方向都是Vector3向量,API返回一个数组RaycastHit[]
  • Vector3.normalized:向量归一化

代码中有注释

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraCtro : MonoBehaviour
{Vector3 dis;RaycastHit[] hits;private int type;private float temp;         //摄像机与人之间的距离参数public float myUp;public float myForward;public float mySpeed;private Transform playerTran, myTran;void Start(){type = 1;temp = 1;playerTran = GameObject.Find("Player").transform;myTran = this.GetComponent<Transform>();LookPlayer(temp);}void FixedUpdate(){CameraAsix();if (Input.GetKey(KeyCode.LeftControl) && Input.GetKeyDown(KeyCode.Z))           //切换摄像机模式,自由模式:可以随时调节视角,但是人转向不会影响视角方向type ^= 1;                                                                              //    固定模式:视角方向始终朝向人正方向if (Check(-1.7f) && temp > 0.3f)            //通过判断摄像机看不看的到主角(是否被建筑遮挡),调整摄像机与人的距离temp -= 0.017f;else if (!Check(1.7f) && temp != 1)             //这些参数根据实际情况要进行调整,调整好之后建议定死,不同游戏可能不一样,切记temp += 0.017f;LookPlayerInPlay(temp);}bool Check(float p)         //摄像机与人之间是否存在碰撞体,用来判断视野是否被遮挡{Vector3 dir = -(playerTran.position - myTran.position).normalized;          //向量归一化,也就是返回单位向量hits = Physics.RaycastAll(playerTran.position, dir, Vector3.Distance(playerTran.position, myTran.position)+p);      //+p放抖if (hits.Length > 0 && hits[0].collider.name != "Player")return true;return false;}void CameraAsix(){float left, up, forward;if (Input.GetMouseButton(1) && type==0)            //通过获得鼠标横纵轴移位,来控制摄像头视角移动,z轴保持不变,只能在自由模式下编辑{up = Input.GetAxis("Mouse Y");left = Input.GetAxis("Mouse X");myTran.RotateAround(playerTran.position, playerTran.up, left * mySpeed);if ((myTran.position.y >= 2.5 || up < 0) && (myTran.position.y <= 7.5 || up > 0))myTran.RotateAround(playerTran.position, myTran.right, -up * mySpeed);dis = myTran.position - playerTran.position;}forward = Camera.main.fieldOfView;forward -= Input.GetAxis("Mouse ScrollWheel") * 8;forward = Mathf.Clamp(forward, 10, 80);Camera.main.fieldOfView = forward;}void LookPlayer(float p)            //初始化{myTran.position = playerTran.position;myTran.position += Vector3.up * myUp * p;myTran.position += playerTran.forward * myForward * p;myTran.LookAt(playerTran);dis = myTran.position - playerTran.position;}void LookPlayerInPlay(float p){if (type == 0)          //两种摄像机跟随方式{myTran.position = playerTran.position + dis;transform.LookAt(playerTran);}else{Vector3 temp;temp = playerTran.position;temp += Vector3.up * myUp * (p+(1-p)/2);temp += playerTran.forward * myForward * p;myTran.position = Vector3.Lerp(myTran.position, temp, 0.2f);        //实现摄像机平滑移动,如果仍然出现摄像机抖动情况,可能是因为主角移动方式非刚体移动,解决方法为将该方法放入LastUpdate中myTran.LookAt(playerTran);dis = myTran.position - playerTran.position;}}
}

二、当摄像机被遮挡时,将遮挡物半透明化

……

Unity3D实践1.1:解决摄像机跟随中的视野遮挡问题相关推荐

  1. Unity3D实践1:摄像机跟随

    前文:https://blog.csdn.net/Jaihk662/article/details/86749803(摄像机与Game视图) 后篇:https://blog.csdn.net/Jaih ...

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

    unity3d 摄像机跟随角色时被物体遮挡解决方案 未被遮挡时 为了解决这个问题,在这里我们需要用到 Physics.RaycastAll:使用方法详见圣典 首先 ,我们引入命名空间 System.C ...

  3. 关于UNITY3d摄像机跟随人物转动的脚本

    首先,我也是一名初学者,最近刚刚开始下手实战,今天分享一下关于人物视角跟随摄像机视角转动的脚本. 以下为简单的摄像机跟随脚本: using UnityEngine; using System.Coll ...

  4. unity3D摄像机跟随

    为摄像机添加一个脚本. 先定义一个跟随的目标,以及一个三维向量. 在初始时刻,先让该三维向量等于摄像机初始位置与目标(角色)位置的差向量. 接下来定义一个根据物理帧刷新频率的函数,让摄像机位置向量每一 ...

  5. 第一人称射击游戏中实现摄像机跟随

    实现摄像机跟随 首先在unity的Hierarchy面板创建一个3D Object的Capsule,命名为Player. 把Main Camera重命名为Gun camera并作为Player的子物体 ...

  6. Unity中控制摄像机跟随人物主角的移动

    首先进入场景中,把摄像机挂载到人物主角的下方,先作为主角的一个子物体存在,然后新建一个脚本CameraFllow,用于控制摄像机跟随,然后把这个脚本挂载摄像机上面,打开脚本,并复制以下的代码: usi ...

  7. Unity小地图映射到Canvas中去,并完成摄像机跟随物体。

    OK!这次的方式是通过Renderer Texture和Material来配合实现摄像机内容映射到Canvas的UI元素中,炒鸡简单. 适用于任何场景. 首先:摄像机映射 新建一个Camera 新建一 ...

  8. Unity3D摄像机跟随人物

    本篇文章和大家介绍的是摄像机跟随人物,这里的视角主要是从人物的背后跟随的. 首先新建一个C#脚本,命名为MyFollow,然后把以下代码粘贴进去,保存: AخA 1 using UnityEngine ...

  9. Unity3D摄像机跟随物体移动的代码控制

    摄像机跟随物体方法一是把摄像机设置为物体Player的子物体,给Player添加移动脚步就可以摄像机跟随Player移动.移动的简单脚步 using UnityEngine; using System ...

最新文章

  1. 要立刷金组flag了T_T
  2. 别学前端了!前端程序员:凭啥??网友:来钱太快你会飘!
  3. 多个反斜杠的消除处理
  4. asp.net Urlrewriter在虚拟主机上的使用方法
  5. java 外螺旋矩阵_螺旋矩阵的java实现
  6. NPM是什么?我们该怎么使用呢
  7. zoj 2313 Chinese Girls' Amusement
  8. vb红绿灯自动切换_VB红绿灯程序.doc
  9. 匿名内部类 可以访问外部类_Java——内部类详解
  10. 林超贤携彭于晏带《紧急救援》再度征战2020春节档
  11. 一个C++的ElasticSearch Client
  12. Retrofit之CallAdapter简单解析
  13. Flink Forward Asia Hackathon 正式启动,10W 奖金等你来!
  14. Linux学习笔记5-linux中的磁盘
  15. 【C#】使用OWIN创建Web API
  16. PSPNet 使用问题
  17. 基于目标检测的回归创新实验感想(基于yolo v1)
  18. Android中的像素密度,屏幕密度,屏幕大小,分辨率,ldpi,mdpi,xhdpi,xxhdpi
  19. ptcms自动采集小说系统源码 电脑版+手机版
  20. Node与Express学习笔记3_版本控制与质量保证

热门文章

  1. python编程语言-Python成为2018年度编程语言,遥遥领先于其他语言
  2. python工资这么高为什么不学-推崇Python这么多人,为什么他们找不到工作!
  3. python编程入门教程下载-Python编程从入门到实践的PDF教程免费下载
  4. 自学python考哪些证书-Python自学难吗?有哪些课程内容?
  5. python发音-Python如何实现文本转语音
  6. 腾讯游戏人脸识别系统更新!刷脸的同时语音提示付款成功_游侠网 Ali213.net
  7. 亚马逊的人工智能将实时语音识别错误率降低了6.2%
  8. 【miscellaneous】语音识别工具箱综述和产品介绍
  9. php生成站点地图,php生成百度站点地图sitemap.xml
  10. 软件测试用例模板和例子_如何编写测试用例?