Unity3D游戏开发之屏幕震动效果的实现

各位朋友,大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是http://qinyuanpei.com。今天我们来说说在Unity3D中如何实现屏幕震动效果。屏幕震动效果在某些游戏场景中,对于提升游戏的真实感有较大的帮助。比如在《水果忍者》这个游戏中,当玩家碰到炸弹的时候屏幕会出现强烈的震动效果,同时手机自身发出震动,这样就大大地增强了玩家在碰到炸弹这一瞬间的游戏体验。

再比如《Swordigo》这个游戏是博主一直比较喜欢的一款手机游戏,在这个游戏中玩家将扮演一个少年剑客,跨过重重阻隔、经历种种磨难,收集剑柄、剑刃、剑心最终打败魔王。这是一个完完全全的RPG游戏,在游戏当中玩家将会在不同风格的迷宫中探索、然后消灭各种各样的敌人,是一款相当出色的手机游戏,如果大家感兴趣的话,可以去下载下来玩一玩哦!在这个游戏中有一个火属性的敌人,它会向玩家投掷一种火球,当火球接触到地面时,整个地面会发生剧烈的震动,这同样是为了体现出一种真实的游戏体验。

我们知道在3D世界里空间的大小是可以无限延伸的,而我们的视线所能触及到的空间则是相对有限的。我们常常说要开阔眼界,因为开阔眼界能够让我们看到的内容更多。那么这句话在游戏世界里该如何解释呢?我们知道在3D世界里摄像机扮演着和人的眼睛相同的角色,因此我们在3D世界里能够看到多少内容完全取决于摄像机。好了,了解了这一点,我们大致可以找到两类实现屏幕震动的方法:

场景固定的情况下震动摄像机

第一类方法实现起来较为简单,而且这种方法更容易让人接受。因为我们平时在拍照或者摄像的过程中难免会出现因为拍摄者身体或者手部发生抖动而引起的画面震动效果,因此现在的摄像设备如DV或者数码相机甚至是智能手机,都会有图像防抖动功能。这就是第一类实现屏幕震动的方法在生活中的现实例子,因此基于这种思路,实现屏幕震动只要让相机震动即可。

摄像机固定的情况下震动场景

第二类方法是对真实世界的一种模拟,主要模拟的是地球上的地震灾害。这种方式主要运用在3D游戏中,通过使游戏中的虚拟地面发生震动,来达到一种使画面震动的效果。可是因为这种方法可能涉及到场景中的其它物体以及主要运用在3D游戏这一局限性,因此在2D和3D游戏中主要通过第一类方法来实现屏幕震动效果。

项目实例

这里以在Unity3D引擎下实现《水果忍者》这个游戏为例,这是博主最近在研究的一个项目吧。在这个游戏中档玩家碰到炸弹的时候是有一个屏幕震动的效果的,所以这里我们就以这个功能的实现为例来讲解今天的内容吧!

首先给出第一种方法,通过调整相机的Rect视口范围实现屏幕震动,该方法是博主在这个游戏中使用的方法。

    /// 在这个脚本中主要实现的功能是相机的震动效果
    /// 时间:2015年4月8日

    ///是否震动相机
    public bool isShake=false;

    /// <summary>
    /// 震动间隔
    /// </summary>
    public float ShakeTime=1.0f;

    /// <summary>
    /// 震动增量
    /// </summary>
    public float ShakeDelta=0.1f;

    /// <summary>
    /// 记录当前帧时间
    /// </summary>
    private float frameTime=0.0f;

    /// <summary>
    /// FPS
    /// </summary>
    private float fps=20.0f;

    /// <summary>
    /// 从开始震动计时
    /// </summary>
    private float time=0.0f;

    /// <summary>
    /// 相机震动的方法
    /// </summary>
    private void ShakeCamera()
    {
        if(isShake){
            time+=Time.deltaTime;
            if(ShakeTime>0){
                ShakeTime-=Time.deltaTime;
                if(ShakeTime<=0){
                    //重置相机
                    transform.camera.rect=new Rect(0.0f,0.0f,1.0f,1.0f);
                    //重置震动间隔
                    ShakeTime=1.0f;
                }else{
                    //为了使相机震动平稳而均匀设计一个帧时间
                    frameTime+=Time.deltaTime;
                    //只有帧时间大于FPS时震动
                    if(frameTime>=1/fps){
                        //重置帧时间
                        frameTime=0;
                        //随机调整相机矩形
                        transform.camera.rect =
                            new Rect(0.1f * (-ShakeDelta + 2.0f * Random.value),
                            0.1f * (-ShakeDelta + 2.0f * Random.value)
                            , 1.0f, 1.0f);
                    }
                }
            }
        }

当然,我们可以采取简单粗暴的办法,让相机的位置不断地改变即可,因此我们可以采用的第二种方法是:

    public bool isShake=false;
    //定义相机的震幅
    private float shakeDelta=0.75f;
    //震动间隔
    public float ShakeTime=1.0f;

    void Update ()
    {
        if(isShake)
        {
            if(ShakeTime>0)
            {
                ShakeTime-=Time.deltaTime;
                if(ShakeTime<=0){
                    ShakeTime=1.0f;
                    transform.position=new Vector3(0,0,transform.position.z);
                }else{
                    transform.position=new Vector3(-shakeDelta+ 1 * Random.value,
                                                   -shakeDelta+ 1 * Random.value,transform.position.z);
                }
            }
        }
    }
}

不过从实际的效果对比来看,第一种实现方法要比第二种要好些,或许是博主自己写的不好吧,哈哈。好了,现在我们来看看实际的效果吧!

如果大家有更好的方法或者思路,欢迎大家在文章下面留言,今天的内容就是这样了,希望大家喜欢!

时间: 2024-11-08 21:15:43

Unity3D游戏开发之屏幕震动效果的实现的相关文章

[Unity3D]Unity3D游戏开发之异步记载场景并实现进度条读取效果

大家好,我是秦元培.欢迎大家关注我的博客,我的博客地址是:blog.csdn.net/qinyuanpei.终于在各种无语的论文作业中解脱了,所以立即抓紧时间来这里更新博客.博主本来计划在Unity3D游戏开发之从<魂斗罗>游戏说起(上)--目标追踪这篇文章后再写一篇<Unity3D游戏开发之从<魂斗罗>游戏说起(下)>,只是眼下博主的项目进度有些缓慢,所以想等项目稳定下来以后再和大家分享. 作为大家等待博主更新博客的回报,我们今天来说一说Unity3D中的游戏场景异步

Unity3D游戏开发初探—2.初步了解3D模型基础

一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被.机械等等,比如一个大楼的3D模型图.3D模型也包括玩具和电脑模型领域. 互联网的形态一直以来都是2D模式的,但是随着3D技术的不断进步,在未来的时间里,将会有越来越多的互联网应用以3D的方式呈现给用户,包括网络视讯.电子阅读.网络游戏.虚拟社区.电子商务.远程教育等等.甚至对于旅游业,3D互联网也能

Unity3D游戏开发之如何截屏的技能培训

下面我们开始今天的Unity3D技能培训. 我们学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发. 今天我们来做点简单的东西,做个什么呢?答案就是截屏.作为一名热爱单机游戏的玩家,每次在玩游戏的同时截取游戏中比较喜欢的画面,特别是学习了Unity3D以后玩游戏的时候更多地是从一个游戏设计者的角度来看待游戏,换句话说,可能关注技术的成分更多一点吧.比如在写<Unity3D游戏开发之自由视角下的角色控制>和<

Unity3D游戏开发从零单排(七) - NetworkView的Demo

提要 今天做了一个移动设备的网络通信demo,分两个部分,一个是网络连接,一个是数据通信. 需要两台Android设备A,B.A作客户端,B作服务端. 最终的效果是玩家控制设备A中的方块,B中的方块也一起动,同时在A的加速度传感器的信息在B中也实时更新. 网络连接 首先两台设备要联网,且IP在同一个网段,比如连接在同一个路由上,或者通过笔记本发出wifi信号,然后把设备连在上面. 在Unity3d中创建一个新工程,在场景中创建两个空物体,一个Client,一个Server. 在client创建一

Unity3D游戏开发之伤害数值显示

众所周知,在RPG游戏策划中最为重要的一个环节是数值策划.数值策划是一个关于游戏平衡方面的概念,它是一种非常深奥的概念.游戏从某种意义上 是多种选择的组合,因此如果一个游戏失去平衡,那么就会减少选择而影响游戏的乐趣.数值策划人员通常需要按照一定的规则和方法将整个游戏系统的相关数值调整到一个合适的范围,以确保玩家可以有更多地选择以增强游戏的可玩性.数值策划是近年来国内游戏行业从国外游戏业引申过来的一个概念,我们在学习游戏设计的过程中,除了专注于技术上的实现以外,还应该对游戏设计中的相关理论有所了解

[Unity3D]Unity3D游戏开发之伤害数值显示

大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.众所周知,在RPG游戏策划中最为重要的一个环节是数值策划.数值策划是一个关于游戏平衡方面的概念,它是一种非常深奥的概念. 游戏从某种意义上 是多种选择的组合,因此假设一个游戏失去平衡,那么就会降低选择而影响游戏的乐趣. 数值策划人员通常须要依照一定的规则和方法将整个游戏系统的相关数值调整到一个合适的范围.以确保玩家能够有很多其它地选择以增强游戏的可玩性.数值策划是近年来国内游戏行业从国外游戏

Unity3D游戏开发从零单排(六) - 人物运动及攻击连击

提要 今天要实现的是一个简单人物控制器.包括用w,a,s,d来控制人物上下左右跑动,鼠标左击发出连招,都是基于老的lagacy的动画.虽然unity3d自带有charactorcontroller,但是并不是很好用,所以人物控制相关的全部自己来实现.先上效果图: 场景搭建 首先下载这个package,里面包含了人物的动作还有地面的模型.将人物和地面都拖进场景中.这里的模型默认的动画模式是lagacy,不用修改.模型有点偏小,改变模型的scale值为10.最好不要改源文件的scale的scale

Unity3D游戏开发之详解 Animation类和Animator类

Unity3D游戏开发之详解 Animation类和Animator类 Animation类 animation组件用于播放动画.可以指定动画剪辑到动画组件并从脚本控制动画播放.在Unity的动画系统基于权重并且支持动画融合,叠加动画,动画混合,标签和完全控制动画播放的各个方面. 如果想播放一个简单的动画,可以使用Animation.Play:如果想在动画之间交叉淡入,可以使用Animation.CrossFade:如果想改变动画模式(循环,一次,乒乓),可以改变动画导入设置里面的动画帧的Wra

Unity3D游戏开发之当游戏开发遇上Excel

各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是http://blog.csdn.net/qinyuanpei. 今天我们的话题是Excel,作为常用的办公软件的Excel相信大家都不陌生啦.可是如果我们认为Excel只是办公软件的话,那么这就不只是天真而是Out了.事实上Excel和游戏开发有着密切的联系,不知道大家还记不记得那款利用Excel开发出来的三国杀,这可能是Excel第一次以游戏开发的身份出现在大家面前吧.我们知道在游戏开发领域有一种工作叫做策划,就像在软件开发领