Unity相机平滑跟随
简介
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相机平滑跟随的更多相关文章
- Unity3d学习 相机的跟随
最近在写关于相机跟随的逻辑,其实最早接触相机跟随是在Unity官网的一个叫Roll-a-ball tutorial上,其中简单的涉及了关于相机如何跟随物体的移动而移动,如下代码: using Unit ...
- Unity 3D里相机的平滑跟随(转)
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 public class ...
- unity相机跟随Player常用方式
固定跟随,无效果(意义不大) public class FollowPlayer : MonoBehaviour { public Transform Player; private Vector3 ...
- Unity相机跟随
固定相机跟随 这种相机有一个参考对象,它会保持与该参考对象固定的位置,跟随改参考对象发生移动 using UnityEngine; using System.Collections; public c ...
- Unity相机跟随-----根据速度设置偏移量
这里假设在水中的船,船有惯性,在不添加前进动力的情况下会继续移动,但是船身是可以360度自由旋转,当船的运动速度在船的前方的时候,相机会根据向前的速度的大小,设置相机的偏移量,从而提高游戏的动态带感. ...
- 小白的Unity5之路(二)镜头平滑跟随角色
这次要完成Camera跟随Player移动, 首先考虑Camera的跟随目标target和平滑移动速度smothing再考虑Camera与Player的偏移量(就是Camera与Player有一个永恒 ...
- unity, 相机空间 与 相机gameObject的局部空间
在unity里 相机空间 与 相机gameObject的局部空间 不重合. Camera.worldToCameraMatrix的文档中有这样一句话: Note that camera space m ...
- Unity 相机
相机属性 1.相机的Clear属性:Skybo背景会渲染天空盒:solid color背景为颜色:depth only仅仅深度,相当于优先级:Don`t Clear背景是上一帧的图像:2.Projec ...
- Unity 相机的聚焦功能
摘要:本文原创,转载请注明出处 需求: 在游戏的任务编辑场景进行编辑的时候,摄像机需要在多个需要编辑的物体之间来回切换,如果只是用摄像机的移动旋转,对于相对位置较近的物体还好说,当相对位置过远的时候, ...
随机推荐
- Codeforces 938C - Constructing Tests
传送门:http://codeforces.com/contest/938/problem/C 给定两个正整数n,m(m≤n),对于一个n阶0-1方阵,其任意m阶子方阵中至少有一个元素“0”,则可以求 ...
- 分布式数据库中CAP原理(CAP+BASE)
分布式数据库中CAP原理(CAP+BASE) 传统的ACID 1)原子性(Atomicity): 事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功. 2)一致性(Con ...
- [bzoj2879][网络流,动态加边]美食节[Noi2012]
就是bzoj1070的加强版,数据规模扩大了n倍,这样要是一次把所有边都加进去的话就爆炸了,,所以使用单路增广,增广过一条边后在加入下一条边. //By hzwer 1 #include<ios ...
- 线程间的通信----wait/notify机制
wait/notify机制 实现多个线程之间的通信可以使用wait.notify.notifyAll三个方法.这三个方法都是Object类的方法.wait():导致当前线程等待,直到另一个线程调用此对 ...
- 洛谷—— P3385 【模板】负环
题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个顶点,M条边 ...
- C# 运行CMD命令
/// <summary> /// 运行CMD命令 /// </summary> /// <param name="cmd">命令</pa ...
- apache在windows下的命令安装与报错解决
1.在windows下能够通过执行apache的exe文件就能够,但当我们打包的时候,就须要命令来安装apache.apache在windows下用命令下的安装为: apache.exe -k ins ...
- 1064. Complete Binary Search Tree (30)【二叉树】——PAT (Advanced Level) Practise
题目信息 1064. Complete Binary Search Tree (30) 时间限制100 ms 内存限制65536 kB 代码长度限制16000 B A Binary Search Tr ...
- ios oc调用swift framework
1.oc 调用swift /*oc调用swift, project name为DeomOC: 1.oc工程DemoOC中显式创建一个swift文件,生成DemoOC-Bridging-Header.h ...
- CSS经典布局之弹性布局
当我们在浏览浏览器的时候,经常会放大/缩小浏览器的显示比例,或者在不同的设备上.所处的分辨率也不尽同样. 因此.我们须要学习一个新的知识:弹性盒模型. 弹性盒模型 实现项目对齐,方向,排序(即使项目大 ...