上一篇博客完成了第一人称视角的角色控制,这一张在开始武器系统之前,我们先做一个用户游戏时的UI界面,方便后面对武器系统进行检验。
创建一个负责战斗界面的画布,在画布下添加以下元素:
其中bullet为子弹图标,aimer为准星图标,sniper为狙击枪开镜的显示图片,将相应的图片资源添加进去,然后调整好位置。
现在开始写武器系统,首先在主摄像机下创建一个空物体,命名为WeaponManager,然后在这个空物体下创建三个空物体来记录三个武器的位置,再将各个武器的prefab放进这三个空物体。
之所以专门创建一个空物体来标记武器位置,是因为武器播放动画时会产生一定的位移,而位移的中心为其父物体(这里可能是动画的问题,没办法bake,可以bake的话应该就不用创建Gunpos等三个空物体了)。然后,每一个武器的prefab中包括三个元素:武器模型、一个空物体(标记枪口位置)、一个点光源(提升开火效果)。
为每个武器的prefab添加好Auidio Sourse和Animation(没有用Animator是因为动画太少,逻辑很简单[其实是懒]),现在终于可以开始写代码了。
首先是武器的脚本,三把枪的脚本是一样的(需要注意的是,这里我们的武器开火时并没有真的发射出子弹,仅是利用一种视觉错觉,弹道实际上是从摄像头发出的一条射线):
using UnityEngine;
public class gun : MonoBehaviour
{
//资源
public Transform textruehit;//击中墙壁的图片
public Transform spark;//击中物体的特效
public Transform flashfire;//开火特效
private RaycastHit m_hit; // 命中的对象
private Transform m_gunmouth;//枪口的位置
private Light m_light;//为了增强开火特效的点光源
private Camera m_camera;//主相机
[SerializeField]
private int curbulletnum;
public int Curbulletnum { get { return curbulletnum; } }
[SerializeField]
private int maxbulletnum;
[SerializeField]
private int storebulletnum;
public int Storebulletnum { get { return storebulletnum; } }
private float timer;//为了记录开火的时间间隔
[SerializeField]
private float AccuracyRange;//子弹的准度范围
private float reloadtimer;//记录换弹的时间间隔
[SerializeField]
private int damage;
[SerializeField]
private int shootrange;
[SerializeField]
private float rate;
public AudioClip ShootAudio;
public AudioClip ReloadedAudio;
//标记当前的动画状态
private int m_a