unity应用实例——从头撸一个全新的FPS游戏(2)

上一篇博客完成了第一人称视角的角色控制,这一张在开始武器系统之前,我们先做一个用户游戏时的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
  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值