Unity功能——设置Camera,实现玩家被攻击后晃动效果

26 篇文章 5 订阅
25 篇文章 1 订阅
一、方法说明:

来源:siki学院:Unity项目捕鱼达人,功能学习记录;

效果摘要:通过调整相机移动,视觉感觉玩家面板剧烈晃动,实现被boss攻击时的震动效果。

使用场景说明:

1、 当玩家被boss攻击时,画面变红(Canvas下红色贴图显示):

       画布Cavans上负责技能、宝箱功能,冰冻、灼烧,被攻击晃动特效等功能;

2、发生碰撞事件后执行震动效果的场景:

        3D场景下的Plane作为游戏场景,实例化生成的鱼、boss、贝壳,子弹,捕鱼获得的金币钻石等对象都是Plane面板上活动。MainCamera俯视拍摄Plane所在画面。

        3d场景下的boss碰撞虚拟枪位(下图中蓝色大鱼位置处),触发被攻击事件。

3、被攻击后玩家震动的脚本Shake,直接挂在MainCamera身上;

(1)显示Canvas下被攻击时贴图,显示被攻击中;

(2)调整3d场景下的拍摄Plane和各类鱼等游戏对象的MainCamera的位置,给玩家震动的感官体验;

二、相关方法代码:
4、设置相机震动抖动核心语句/公式

     使用效果比较的振幅随机数设置公式,为:andom.Range(0f, 振动系数) - 振动系数* 0.5f;

        transform.position = new Vector3((Random.Range(0f, cameraShake)) - cameraShake * 0.5f,transform.position.y, transform.position.z);                  //镜头x方向抖动

        transform.position = new Vector3(transform.position.x, transform.position.y,(Random.Range(0f, cameraShake)) - cameraShake * 0.5f);                 //镜头z方向抖动

//镜头x方向抖动
transform.position = new Vector3((Random.Range(0f, cameraShake)) - cameraShake * 0.5f, transform.position.y, transform.position.z);

//镜头z方向抖动
transform.position = new Vector3(transform.position.x, transform.position.y, (Random.Range(0f, cameraShake)) - cameraShake * 0.5f);
5、完整代码: 
using UnityEngine;

/// <summary>
/// 被攻击时,玩家产生的震动方法
/// </summary>
public class Shake : MonoBehaviour
{
    private float cameraShake = 5;//震动系数
    public GameObject UI;         //被攻击时显示的红色贴图

    void Update()
    {
        ShakeCamera();//时时检测是否有被攻击。
    }

    /// <summary>
    /// 被撞击效果
    /// 除了Update里时时检测,
    /// 还可以在检测是否攻击玩家的脚本,或boss脚本里执行攻击操作时
    /// 使用委托调用:Invoke("ShakeCamera");
    /// </summary>
    private void ShakeCamera()
    {
        //Gun.Instance:包含判断虚拟枪/玩家是否被攻击的 的方法 的脚本Gun
        if (Gun.Instance.bossAttack)//相关的脚本里设置的:boss是否攻击玩家的bool变量
        {
            UI.SetActive(true);//被攻击时的特效图显示

            transform.position = new Vector3((Random.Range(0f, cameraShake)) - cameraShake * 0.5f, transform.position.y, transform.position.z);//镜头x方向移动
            transform.position = new Vector3(transform.position.x, transform.position.y, (Random.Range(0f, cameraShake)) - cameraShake * 0.5f);//镜头z方向移动

            cameraShake = cameraShake / 1.05f;//减小振幅

            if (cameraShake < 0.05f)//当振幅过小时,停止被撞击效果
            {
                cameraShake = 0;//振幅系数置0
                UI.SetActive(false);//关闭被攻击时的特效图
                Gun.Instance.bossAttack = false;//禁止震动
            }
        }
        else cameraShake = 5;//不需要震动时,把震动系数还原
    }
}

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值