简介

unity中经常会用到固定视角的相机跟随,然后百度发现大家都是自己写的,然后偶也写咯一个,分享一下

PS: 由于刚学C#不久,才发现delegate这个东东,也不知道对性能影响大不大,但是看MS自己的界面库中各种使用,脑补了下估计可以用吧,就用了

Code

先上代码:

先是使用if进行判断的版本,支持实时锁定xyz的位置

using UnityEngine;

public class FixedFollowCamera : MonoBehaviour
{ // 需要跟随的目标对象
public Transform target; // 需要锁定的坐标(可以实时生效)
public bool freazeX, freazeY, freazeZ; // 跟随的平滑时间(类似于滞后时间)
public float smoothTime = 0.3F;
private float xVelocity, yVelocity, zVelocity = 0.0F; // 跟随的偏移量
private Vector3 offset; // 全局缓存的位置变量
private Vector3 oldPosition; // 记录初始位置
private Vector3 startPosition; void Start()
{
startPosition = transform.position;
offset = transform.position - target.position;
} void LateUpdate()
{
oldPosition = transform.position; if (!freazeX)
{
oldPosition.x = Mathf.SmoothDamp(transform.position.x, target.position.x + offset.x, ref xVelocity, smoothTime);
} if (!freazeY)
{
oldPosition.y = Mathf.SmoothDamp(transform.position.y, target.position.y + offset.y, ref yVelocity, smoothTime);
} if (!freazeZ)
{
oldPosition.z = Mathf.SmoothDamp(transform.position.z, target.position.z + offset.z, ref zVelocity, smoothTime);
} transform.position = oldPosition;
} /// <summary>
/// 用于重新开始游戏时直接重置相机位置
/// </summary>
public void ResetPosition()
{
transform.position = startPosition;
}
}

然后再来个delegate的版本,不支持实时锁定xyz的位置,具体性能升降也未知...但是感觉用着很不错的感觉

using UnityEngine;

// 更新位置委托,用于减少判断次数,具体性能升降未知
delegate void UpdatePosition(); public class FixedFollowCamera : MonoBehaviour
{ // 需要跟随的目标对象
public Transform target; // 需要锁定的坐标(无法实时生效)
public bool freazeX, freazeY, freazeZ; // 跟随的平滑时间(类似于滞后时间)
public float smoothTime = 0.3F;
private float xVelocity, yVelocity, zVelocity = 0.0F; // 跟随的偏移量
private Vector3 offset; // 全局缓存的位置变量
private Vector3 oldPosition; // 记录初始位置
private Vector3 startPosition; private UpdatePosition JudgePosition; void Start()
{
startPosition = transform.position;
offset = transform.position - target.position; // 分配事件
if (!freazeX)
{
JudgePosition += MoveX;
}
if (!freazeY)
{
JudgePosition += MoveY;
}
if (!freazeZ)
{
JudgePosition += MoveZ;
}
} void LateUpdate()
{
oldPosition = transform.position;
JudgePosition();
transform.position = oldPosition;
} private void MoveX()
{
oldPosition.x = Mathf.SmoothDamp(transform.position.x, target.position.x + offset.x, ref xVelocity, smoothTime);
} private void MoveY()
{
oldPosition.y = Mathf.SmoothDamp(transform.position.y, target.position.y + offset.y, ref yVelocity, smoothTime);
} private void MoveZ()
{
oldPosition.z = Mathf.SmoothDamp(transform.position.z, target.position.z + offset.z, ref zVelocity, smoothTime);
} /// <summary>
/// 用于重新开始游戏时直接重置相机位置
/// </summary>
public void ResetPosition()
{
transform.position = startPosition;
}
}

使用方法

1.首先把摄像机和需要跟随的角色位置在unity编辑界面中调好



2.然后把代码拖到摄像机上,记得把需要跟随的角色也拖过去



然后就没有然后了,不出意外地话应该就能达到以下效果了

如有问题,肯定是你打开方式不对,也可以留言咨询 ╮(╯▽╰)╭

Unity相机平滑跟随的更多相关文章

  1. Unity3d学习 相机的跟随

    最近在写关于相机跟随的逻辑,其实最早接触相机跟随是在Unity官网的一个叫Roll-a-ball tutorial上,其中简单的涉及了关于相机如何跟随物体的移动而移动,如下代码: using Unit ...

  2. Unity 3D里相机的平滑跟随(转)

    1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 public class ...

  3. unity相机跟随Player常用方式

    固定跟随,无效果(意义不大) public class FollowPlayer : MonoBehaviour { public Transform Player; private Vector3 ...

  4. Unity相机跟随

    固定相机跟随 这种相机有一个参考对象,它会保持与该参考对象固定的位置,跟随改参考对象发生移动 using UnityEngine; using System.Collections; public c ...

  5. Unity相机跟随-----根据速度设置偏移量

    这里假设在水中的船,船有惯性,在不添加前进动力的情况下会继续移动,但是船身是可以360度自由旋转,当船的运动速度在船的前方的时候,相机会根据向前的速度的大小,设置相机的偏移量,从而提高游戏的动态带感. ...

  6. 小白的Unity5之路(二)镜头平滑跟随角色

    这次要完成Camera跟随Player移动, 首先考虑Camera的跟随目标target和平滑移动速度smothing再考虑Camera与Player的偏移量(就是Camera与Player有一个永恒 ...

  7. unity, 相机空间 与 相机gameObject的局部空间

    在unity里 相机空间 与 相机gameObject的局部空间 不重合. Camera.worldToCameraMatrix的文档中有这样一句话: Note that camera space m ...

  8. Unity 相机

    相机属性 1.相机的Clear属性:Skybo背景会渲染天空盒:solid color背景为颜色:depth only仅仅深度,相当于优先级:Don`t Clear背景是上一帧的图像:2.Projec ...

  9. Unity 相机的聚焦功能

    摘要:本文原创,转载请注明出处 需求: 在游戏的任务编辑场景进行编辑的时候,摄像机需要在多个需要编辑的物体之间来回切换,如果只是用摄像机的移动旋转,对于相对位置较近的物体还好说,当相对位置过远的时候, ...

随机推荐

  1. poj 2114 树的分治 可作模板

    /* 啊啊啊啊啊啊啊本题证明一个问题,在实际应用中sort比qsort块 还有memset这类初始化能不加尽量别加,很浪费时间 原来的程序把qsort该成sort,去掉一个无用memset就a了时间不 ...

  2. Docker Command

    1. #docker inspect id           这个命令给出和容器相关的所有信息(https://www.imooc.com/video/15730) 2. #docker searc ...

  3. log4j2.xml 的配置 及使用

     log4j2.xml配置 <?xml version="1.0" encoding="UTF-8"?> <Configuration > ...

  4. hello2 source analisis(notes)

    该hello2应用程序是一个Web模块,它使用Java Servlet技术来显示问候语和响应.使用文本编辑器查看应用程序文件,也可以使用NetBeans IDE. 此应用程序的源代码位于 _tut-i ...

  5. SiteMesh基础教程

    SiteMesh是由一个基于Web页面布局.装饰以及与现存Web应用整合的框架.它能帮助我们在由大量页面构成的项目中创建一致的页面布局和外观,如一致的导航条,一致的banner,一致的版权,等等. 教 ...

  6. NetCore发布WebApi项目到IIS服务器中

    1.确保已在机器上安装Net Core Runtime,,下载地址: https://dotnet.microsoft.com/download 2.点击WebApi项目右键->发布,选择IIS ...

  7. PowerDesigner12.5和15.1的破解

    不要相信网上盛传的powerdesigner的 license key注冊码,试了好多都无论用,不废话了,直接献上PowerDesigner12.5.PowerDesigner15.1的破解方法. P ...

  8. Android 四大组件学习之Activity六

    本节学习Activity的状态保存与恢复. 先用样例開始: 布局文件主要是实现例如以下.大家自行编写 Activity逻辑代码: public class FiveActivity extends A ...

  9. Windows Azure 故障转移模式及高可用个模式探讨!

     眼下国内非常多用户对于云服务的可用性存在误解,什么样子的误解呢?比方某云服务商,在华南某地有一个机房,在华东有一个机房. 这个客户就提到一个需求,你提供的99%可用性的概念是什么意思呢?是不是我 ...

  10. WEB应用与站点的差别以及未来发展推測

    WEB应用与站点的差别 确切的说应该是网络应用(Web Application)与网络网站(Website)的差别. 之所以要弄清这两个的差别,对于网页设计师以及參与到互联网行业的职业,其方发展向有非 ...