unity 摄像机抖动与物理帧&渲染帧之间关系的梳理

背景

在游戏开发中时常会用到摄像机跟随的技术,有些项目还对Time.scale做更改,以达到时间缩放的效果(子弹时间),让人头疼的是,游戏画面总会时不时的抖动.接下来我就来说说解决摄像机抖动的思路和方法.
//TODO


public class CameraFallow : MonoBehaviour//摄像机脚本
{
    Transform target;//目标
    Vector3 offPos;//位置偏差
    void Start()
    {
        target = GameObject.Find("Sphere").transform;
        offPos = transform.position - target.position;//从目标指向摄像机的向量
    }

    void Update()
    {
        transform.position = target.position + offPos;//跟随目标
    }

}
public class CubeMove : MonoBehaviour//方块移动脚本
{
    void Update()
    {
        this.transform.Translate(0, 0, 10 * Time.deltaTime);//每秒10米
    }
}

问题演示图

想要的效果演示图

原因

确信一点: 画面抖动的原因是因为摄像机位置更新与目标(抖动对象)位置更新不同步造成的.
为什么会不同步呢这就涉及到unity生命周期函数执行顺序问题以及物理帧与渲染帧的问题.

解决
防止

做摄像机跟随是常用的功能,一般来说,将摄像机的位置,插向目标位置即可实现。
有时候需要摄像机起初不跟随,当目标快要越出屏幕时再开始跟随,这时,应着重考虑两者的偏差值。

public class CameraFollow : MonoBehaviour
{
    GameObject target;
    Vector3 p0;//起始位置
    Vector3 p1;//目标临界位置
    Vector3 pd;//偏差
    void Start()
    {
        target = GameObject.Find("Bison");
        p0 = transform.position;
        p1 = new Vector3(-5, 1.5f, 0);
    }


    void FixedUpdate()
    {
        if (BisonController.Instance.isOverUp)//达到临界值
        {
            pd = p1 - p0;
            transform.position = Vector3.Lerp(transform.position, target.transform.position - pd, 0.5f);//将摄像机的位置插向目标减去偏差的那个位置,而不是目标位置本身。
        }
        else
        {
            transform.position -= new Vector3(0, 0.05f, 0);//当目标低于临界值, 摄像机逐渐回到起初的位置
            if (transform.position.y <= 0.2f)
            {
                transform.position = p0;
            }
        }
    }
}

抖动问题,很多时候做主角和背景(场景)的移动方式不一样, 主角用 物理引擎,而背景为渲染帧变换, 在默认情况下,两者的时间间隔是不一致的, 物理帧为0.02s,而渲染帧和设备有很大关系,在流畅的情况下约为0.01666666s ,所以如果 主角和背景分别采用不同的方式移动,那两者的移动步调是不一致的。摄像机跟随,如果写在FixedUpdate里面,是采用的物理帧,就会和角色同步,但和背景不同步,容易出现屏幕抖动的状况。 如果写在Update或是LateUpdate里面,都是渲染帧,这时和背景的步调是一致的,但和主角移动不一致,就会出现,主角抖动的现象。
要解决这位问题,可以从两个思维解决, ①将物理帧时间和渲染帧时间调得相同 ②设计功能时角色及背景都采用同一种模式,要不都用渲染帧要不都用 物理帧
我在开发功能的时候,由于 角色的功能很难不采用物理引擎,需要用到 rigidbody.velocity ,我使用了第一种方式,将物理帧时间调至0.016666s,避免了 抖动的情况。当然这只是一种规避的补救措施,如果后续出现大量资源调用,等一些需求, 可能抖动又会出现。 介于目前能力,只能先这样解决。若后续有机会,再做其它尝试。
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Unity摄像机OBS是指在Unity游戏引擎中使用OBS(Open Broadcaster Software)进行摄像机设置和视觉效果的一种方法。OBS是一款免费开源的跨平台流媒体和录制工具,常用于游戏直播和视频制作。 在Unity中,摄像机是用于渲染场景的重要组件之一。它决定了我们在游戏中所看到的视角和画面效果。而OBS则提供了强大的视频处理和直播功能。 使用Unity摄像机OBS可以实现多种功能。首先,我们可以通过将Unity摄像机的输出作为OBS的输入源,将游戏画面实时直播到视频平台,如Twitch、YouTube等。这样,玩家可以与观众互动,分享游戏过程和技巧。 其次,OBS提供了丰富的特效和滤镜,可以对摄像机输出进行实时处理。比如,我们可以调整亮度、对比度、饱和度等参,增加色彩效果或改变画面风格。此外,还可以添加文本、水印、转场动画等,提升视频质量和观看体验。 最后,使用Unity摄像机OBS还可以录制游戏过程和截图,用于制作游戏宣传视频、教学视频等。OBS支持多种视频格式和编码器,可根据需求进行设置,保证输出质量和文件大小的平衡。 总之,Unity摄像机OBS结合了Unity强大的渲染能力和OBS丰富的视频处理功能,为游戏开发者和玩家提供了更好的视频录制和直播体验。无论是专业制作还是个人娱乐,都能发挥其独特的优势,展示精彩的游戏内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值