Unity3D中的高级摄像机跟随
在Unity3D中,先调整MainCamera在场景中的位置,然后把脚本挂到MainCamera上,摄像机跟随分为简单的摄像机跟随和高级摄像机跟随。
public class CameraFollow:MonoBehaviour()
{
//设置摄像机跟随速度
private float moveSpeed = 3f;
//设置摄像机旋转速度
private float turnSpeed = 10f;
//设置摄像机跟随的物体
private Transform target;
//定义方向向量
private Vector3 dir;
void Awake(){
//获取物体
target = GameObject.FindWithTag(Tags.Player).transform;
}
void Start(){
//获取方向向量
dir = transform.position - target.position;
}
void Update(){
//跟随目标
transform.position = Vector3.Lerp(transform.position, target.position+dir, moveSpeed * Time.deltaTime);
//摄像机旋转
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(dir), turnSpeed * Time.deltaTime);
}
}
public class Camera : MonoBehaviour{
//设置摄像机的移动速度
private float moveSpeed = 3f;
//设置摄像机的旋转速度
private float turnSpeed = 10f;
//摄像机跟随目标
private Transform target;
//方向向量
private Vector3 dir;
//设置档位
private int gears = 5;
//射线碰撞检测器
privatr RaycastHit hit;
void Awake(){
//照到摄像机跟随目标
target = GameObject.FindWithTag(Tags.Player).transform;
}
void Start(){
dir = transform.position - target.position;
}
void Update(){
//起始坐标
Vector3 beginPos = target.position + dir;
//摄像机的投影向量
Vector3 projectDir = Vector3 Project(dir, Vector3.up);
//计算头顶摄像机与target之间的距离
float distance = projectDir.mignitude;
//target头顶坐标
Vector3 endPos = target.position + Vector3.up * distance;
//所有档位
Vector3[] allPos = new Vector3[gears];
//起点
allPos[0] = beginPos;
//终点
allPos[allPos.Length - 1] = endPos;
//填充中间点
for(int i = 1; i < allPos.Length - 1; i++){
allPos[i] = Vector3.Lerp(beginPos, endPos, i/(gears - 1f));
}
//默认结果点为起点
Vector3 resultPos = beginPos;
//遍历所有点
for(int i=0; i < allPos.Length - 1; i++){
if(CanSeeTarget(allPos[i])){
resultPos = allPos[i];
break;
}
}
//摄像机移动
transform.position = Vector3.Lerp(transform.position, resultPos + dir, moveSpeed * Time.deltaTime);
//获取方向向量
Vector3 lookDir = target.position - resultPos;
//摄像机旋转
transform.rotation=Quaternion.Lerp(transform.rotation,Quaternion.LookRotation(lookDir), turnSpeed * Time.deltaTime);
//将欧拉角Y置零
transform.eulerAngles = new Vector3(transform.eulerAngles.x, 0, transform.eulerAngles.z);
}
//能否看到玩家
void CanSeeTarget(Vector3 pos){
//发射射线(起点,方向向量,射到的物体)
if(Physics.Raycast( pos, target.position - pos ,out hit)){
//能否看到玩家
if(hit.collider.CompareTag(Tags.Player)){
return true;
}
}
return false;
}
}
Unity3D中的高级摄像机跟随的更多相关文章
- Unity3d中使用摄像机制作实时显示小地图
Unity3d中使用摄像机制作实时显示小地图,以之前的tank为例.开始制作之前场景中物体如图. 开始制作,步骤1:新建一个camera及一个plane.对齐位置,将camera改名为camera_U ...
- Unity3D中的shader基础知识
1.Unity中配备了强大的阴影和材料的语言工具称为ShaderLab,以程式语言来看,它类似于CgFX和Direct3D的效果框架语法,它描述了材质所必须要的一切咨询,而不仅仅局限于平面顶点/像素着 ...
- Unity3D中Mathf数学运算函数总结
引入: 看到一个案例注意到函数Mathf.SmoothDamp的使用,游戏中用于做相机的缓冲跟踪和boss直升机跟踪士兵.该函数是Unity3D中Mathf数学运算函数中的一个.一些游戏使用了smoo ...
- Unity3D中可重载虚函数的总结
重载虚函数:Unity3D中所有控制脚本的基类MonoBehaviour有一些虚函数用于绘制中事件的回调,也可以直接理解为事件函数,例如大家都很清楚的Start,Update等函数,以下做个总结. A ...
- Unity3D中C#和js方法相互调用
通过查找资料,Unity3D中C#和js要相互调用彼此的方法,js文件必须放在"Standard Assets". "Pro Standard Assets" ...
- 【转】Unity3D中Layers和LayerMask解析
http://blog.csdn.net/yupu56/article/details/50441151 Unity中是用int32来表示32个Layer层.int32表示二进制一共有32位(0-31 ...
- unity3d中的Viewport
Camera属性中有个Viewport Rect,如下图: X.Y为(0, 0)代表左下角,(1, 1)代表右上角:W和H分别是Viewport的宽(Width)和高(Height),摄像机的Aspe ...
- Unity3D中事件函数的运行顺序
Unity3D中脚本的生命周期是依照预先定义好的事件函数的运行流程来演化的,详细流程例如以下: Editor模式下Reset: 当脚本第一次被挂到GameObject上或用户点击Resetbutton ...
- Unity3D中的Coroutine详解
Unity中的coroutine是通过yield expression;来实现的.官方脚本中到处会看到这样的代码. 疑问: yield是什么? Coroutine是什么? unity的coroutin ...
随机推荐
- Unity3D的断点调试功能
断点调试功能可谓是程序员必备的功能了.Unity3D支持编写js和c#脚本,但很多人可能不知道,其实Unity3D也能对程序进行断点调 试的.不过这个断点调试功能只限于使用Unity3D自带的Mono ...
- 8.2.优化SQL语句
8.2.优化SQL语句 数据库应用程序核心操作逻辑都是通过执行SQL语句来执行,不管是直接通过解释器还是通过后台API提交. 调优手册里面的这一节内容帮助各种各样MySQL程序加快速度.手册包括SQL ...
- PHP微信公共号发送模板消息。
1.首先从微信公共平台(https://mp.weixin.qq.com/)添加模板. 2. /** * 经纪人生成电子合同通知租客.业主 * @param string $openid openid ...
- C# 趣味小程序(4)——遍历特定目录及其子目录
//递归方法遍历目录,并统计其中文件的数目 private int statisticFiles(string directory) { int st ...
- django之ReverseOneToOneDescriptor
class ReverseOneToOneDescriptor(object): """ Accessor to the related object on the re ...
- scrapy工作原理探秘
def _next_request_from_scheduler(self, spider):#engine从调度器取得下一个request slot = self.slot request = sl ...
- oracle 相关操作
1,SqlPlus 的使用 1.01,软登入:sqlplus /nolog 1.02,登入 dba 用户:sqlplus /as sysdba 2,用户相关操作 2.01,创建用户:create us ...
- 【ASP.NET 插件】分享一款富文本web编辑器UEditor
UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码... <%@ Page Language ...
- react-navigation,StackNavigator,TabNavigator 导航使用
StackNavigator 参考这里 TabNavigator 参考这里 是一个组合,我把这2个写在一起了 代码: import React, { Component } from 'react ...
- element el-upload组件获取文件名
组件的连接:http://element-cn.eleme.io/#/zh-CN/component/upload 需求:点x按钮,获取文件名传到后端服务,把文件从服务器删除 分析: 仔细看文档,会发 ...