一、前言
本篇博客记录的内容为上篇的延续,将介绍完成的射击反馈震屏及UI子弹数量等工作内容。这里实现的是开枪以后抖动屏幕的效果以及子弹数在游戏界面的UI显示。
至此,FPS游戏的单机开发部分就已经大致完成,接下来我们将基于PUN2继续进行游戏的多人化。
二、射击反馈震屏
首先创建了一个CameraSpringUtility脚本。Values是spring施加的一个力度。
UpdateSpring实现的是弹簧弹出去然后把镜头逐渐拉回来的效果。
target一般定为圆心。没有继承MonoBehaviour的话是没有办法直接赋值到组件当中去的。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraSpringUtility
{
public Vector3 Values;
private float frequence;//过渡的效果
private float damp;
private Vector3 dampVaules;
public CameraSpringUtility(float _frequence,float _damp)
{
frequence = _frequence;
damp = _damp;
}
public void UpdateSpring(float _deltaTime, Vector3 _target)
{
Values -= _deltaTime * frequence * dampVaules;//从外面施加过来一个向上抬的力
dampVaules = Vector3.Lerp(dampVaules, Values - _target, damp * _deltaTime);//衰减到target数值
}
}
然后创建一个CameraSpring脚本,它继承了MonoBehaviour,它才能挂载到我们的物体上。
using System;
using System.Collections;
using System.Collections.Generic;
using Unity.Mathematics;
using UnityEngine;
public class CameraSpring : MonoBehaviour
{
public float Frequence = 25;
public float Damp = 15;
public Vector2 MinRecoilRange;//输入的力的最小范围
public Vector2 MaxRecoilRange;
private CameraSpringUtility cameraSpringUtility;
private Transform cameraSpringTransform;
private void Start()
{
cameraSpringUtility = new CameraSpringUtility(Frequence, Damp);//新建一个对象
cameraSpringTransform = transform;
}
private void Update()
{
cameraSpringUtility.UpdateSpring(Time.deltaTime, Vector3.zero);
cameraSpringTransform.localRotation = Quaternion.Slerp(cameraSpringTransform.localRotation,
Quaternion.Euler(cameraSpringUtility.Values), Time.deltaTime * 10);//
}
//施加力的一个方法
public void StartCameraSpring()
{
cameraSpringUtility.Values = new Vector3(0,
UnityEngine.Random.Range(MinRecoilRange.x, MaxRecoilRange.x),
UnityEngine.Random.Range(MinRecoilRange.y, MaxRecoilRange.y));
}
}
然后到FPMouseLook脚本中去,在start函数中声明cameraSpring,找到FiringForTest,在其中引用StartCameraSpring。
cameraSpring = GetComponentInChildren<CameraSpring>();
public void FiringForTest()
{
currentRecoil += RecoilRange;
cameraSpring.StartCameraSpring();
currentRecoilTime = 0;
}
随后到unity界面中
然后开始游戏,进行射击,就会发现实现了一定的屏幕晃动效果。frequence频率越大,抖动就越快,damp数值越大,回到中心的速度就越快。
三、UI子弹数量
对代码修改完成以及在unity中修改添加了UI后,游戏界面的右下角就会显示子弹数量。前面的数字是弹夹中剩余的子弹数,后面的数字是弹夹容纳的最大子弹数量。