项目场景:

提示:该脚本是挂载到相机上的,当相机视野看不到目标的时候,会自动切换不同视野来捕捉目标,直到看见目标物体为止


问题描述

用途:比如当我们相机跟随主角移动的时候,主角走到了一些角落挡住了相机视线,相机就会自动切换其他方位去捕捉主角

using UnityEngine;
using System.Collections;public class CameraMovement : MonoBehaviour
{public float smooth = 1.5f;         // 摄像机跟踪速度private Transform player;           // 引用角色位置private Vector3 relCameraPos;       // 摄像机与角色的相对位置private float relCameraPosMag;      // 摄像机到角色的距离向量长度private Vector3 newPos;             // 摄像机的新位置void Awake(){// 引用角色位置player = GameObject.FindGameObjectWithTag("Player").transform;//获取摄像机与角色的相对位置relCameraPos = transform.position - player.position; // 相对位置 = 摄像机位置 - 角色位置relCameraPosMag = relCameraPos.magnitude - 0.5f; // 相对位置向量的长度 = 相对位置的长度 - 0.5f  防止光线投射碰撞地面}void FixedUpdate(){// 摄像机初始位置 = 角色位置 + 角色与摄像机的相对位置Vector3 standardPos = player.position + relCameraPos;// 俯视位置 = 角色位置 + 角色正上方 * 相对位置向量的长度Vector3 abovePos = player.position + Vector3.up * relCameraPosMag;// 创建长度为5的数组 储存5个摄像机位置Vector3[] checkPoints = new Vector3[7];// 第一个检测 摄像机标准位置checkPoints[0] = standardPos;// 这三个检测位置为 标准位置到俯视位置之间的三个位置 插值分别为25% 50% 75%checkPoints[1] = Vector3.Lerp(standardPos, abovePos, 0.14f);checkPoints[2] = Vector3.Lerp(standardPos, abovePos, 0.28f);checkPoints[3] = Vector3.Lerp(standardPos, abovePos, 0.42f);checkPoints[4] = Vector3.Lerp(standardPos, abovePos, 0.56f);checkPoints[5] = Vector3.Lerp(standardPos, abovePos, 0.70f);// 最后检测位置为 摄像机俯视位置checkPoints[6] = abovePos;// 通过循环检测每个位置是否可以看到角色for (int i = 0; i < checkPoints.Length; i++){// 如果可以看到角色if (ViewingPosCheck(checkPoints[i]))// 跳出循环break;}// 让摄像机位置 从当前位置 平滑转至 新位置transform.position = Vector3.Lerp(transform.position, newPos, smooth * Time.deltaTime);// 确保摄像机朝向角色方向SmoothLookAt();}bool ViewingPosCheck(Vector3 checkPos){RaycastHit hit;// 如果光线投射碰撞到某个对象if (Physics.Raycast(checkPos, player.position - checkPos, out hit, relCameraPosMag))// 如果光线投射碰撞点不是角色位置if (hit.transform != player)// 当前检测位置不合适 返回falsereturn false;//如果光线投射没有碰撞到任何东西 或者碰撞点为角色位置时 更新当前检测位置为摄像机的新位置newPos = checkPos;return true;}void SmoothLookAt(){// 创建从摄像机到角色的向量Vector3 relPlayerPosition = player.position - transform.position;// 根据摄像机到角色的向量 创建旋转角度Quaternion lookAtRotation = Quaternion.LookRotation(relPlayerPosition, Vector3.up);// 让摄像机从 当前角度 平划转至创建的旋转角度transform.rotation = Quaternion.Lerp(transform.rotation, lookAtRotation, smooth * Time.deltaTime);}
}

效果图

Unity摄像机视野切换相关推荐

  1. 在Unity使用键盘控制摄像机的移动以及用鼠标滚轮控制摄像机视野放大和缩小

    首先在Unity中新建一个ViewControl的脚本,并把这个脚本挂载在主摄像机上面,然后复制下列的代码! using System.Collections; using System.Collec ...

  2. Unity摄像机控制

    Unity摄像机控制: 控制摄像机移动,旋转,缩放,跳跃:有视野限制,且摄像机高度越高运动幅度越大. 视野缩放:通过向前滚动鼠标滑轮可拉近视野,向后滚动鼠标滑轮可拉远视野. 视野移动:按住鼠标左键不放 ...

  3. Unity摄像机对象锁定旋转运镜模拟

    问题简述 在3D模式下如何模拟实现Unity摄像机对象锁定旋转运镜,可以分为两个部分,第一是实现对象锁定,第二是实现旋转运镜.对象锁定就是无论摄像机如何运动,始终保持对象位于摄像机成像区域的固定位置, ...

  4. Unity摄像机拍照并显示在小窗口里(RenderTexture和RawImage将摄像机图像渲染到GUI屏幕上小图显示)

    Unity摄像机拍照并显示在小窗口里(RenderTexture和RawImage将摄像机图像渲染到GUI屏幕上小图显示) 1.实现效果和实现思想 1.实现效果和实现思想 实现效果: 本文使用飞机模型 ...

  5. Unity摄像机画面制作全景图片|截图制作全景图

    Unity摄像机画面制作全景图片 目录 效果展示 Unity编辑器中使用脚本部分 Unity编辑器中使用方法 Unity动态存储图片脚本部分 Unity动态存储图片使用方法 目录 你好! 这是你第一次 ...

  6. 【Unity3D 灵巧小知识点】☀️ | Unity 中 怎样切换 天空盒 背景

    Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 . 包括游戏开发.美术.建筑.汽车设计.影视在内的所有创作者,借助 Unity 将创意 ...

  7. unity 摄像机追随指定物体

    unity 摄像机追随指定物体, 摄像机离远离近,围绕物体旋转using System.Collections; using System.Collections.Generic; using Uni ...

  8. Unity(13)-场景切换,保留资源

    文章目录 前言 其他介绍 上一篇笔记 一.项目结构 二.脚本 [1]. 场景切换 [2]. 资源保留 前言 在切换场景的时候会删除上一个场景的所有资源,所以需要给需要的游戏对象上挂载脚本,从而保留游戏 ...

  9. Unity VideoPlayer播放切换视频卡上一帧问题

    一.问题 在Unity 场景中切换播放多个视频,会出现卡上一个视频一帧. 二.解决办法 通过获取VideoPlayer的targetTexture,然后释放.视频停止后加入改代码. public Vi ...

最新文章

  1. Java Review - 并发编程_独占锁ReentrantLock原理源码剖析
  2. Android 编译系统分析(二)
  3. vue定义一个全局价格处理函数
  4. cmd52命令发送 mmc_乾坤合一~Linux SD/MMC/SDIO驱动分析(上)
  5. python杨辉三角_yiduobo的每日leetcode 118.杨辉三角 amp;amp; 119.杨辉三角II
  6. Dubbo下一站:Apache顶级项目
  7. vue 组件高级用法实例详解
  8. 整合vue_直指核心,7天成为Vue高手
  9. 利用jasperreports报表生成pdf文档中文不能显示问题解决方法
  10. 从无到有axure原型设计_Axure|微信原型制作
  11. 仿IOS圆角可自定义扩展对话框
  12. ubuntu软件默认安装位置
  13. 零基础学习编程会遇到的坑
  14. 【C语言】详解 calloc 函数用法
  15. C# 添加Word页眉、页脚和页码
  16. 我学会了用计算机作文,我学会了作文(15篇)
  17. Docker原理及常见命令
  18. 使用 Ruby 开发代码生成器
  19. VS调试C++程序,提示无法启动程序,“xx.exe”。系统找不到指定文件的解决办法
  20. OSI七层模型功能及相关设备

热门文章

  1. 数字音频编辑器GoldWavev6.54免费版
  2. HTTP 文件上传的基本原理
  3. 吴恩达深度学习教程——中文笔记网上资料整理
  4. GRUB Error 28: Selected item cannot fit into memory
  5. 使用uniapp框架搭建浙里办微应用(单点登录、埋点、适老化、RPC网关)
  6. 记一次完整的CISSP备考全过程!
  7. 6、RH850 F1 AD转换功能和配置
  8. C#做的配套C做的SNIFFER(C#)--C#简单而实用
  9. Tkinter教程之Scrollbar篇
  10. android 微信支付键盘,Android 高仿微信支付键盘