一、方法说明:
来源: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:包含判断虚拟枪/玩家是否被攻击的 的方法 的脚本Gunif (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;//振幅系数置0UI.SetActive(false);//关闭被攻击时的特效图Gun.Instance.bossAttack = false;//禁止震动}}else cameraShake = 5;//不需要震动时,把震动系数还原}
}