Unity官方案例噩梦射手开发总结<一> 角色的攻击功能实现

愉悦的寒假生活总是会猝不及防地迎来尾声,这也意味着我大一生活的进度条已经过半了。幸运的是,在我某位优秀的学长的带领下,我完整地开发出来了unity的官方案例噩梦射手并基本实现所有功能,也是让我这个大一的苟蒻积攒了不少的新知识。话不多说进入正题。

整个开发总结大体上我会分为这几几部分来写,分别是:游戏角色,怪物,gameManager,音效以及UI,可能会有所改动。

本篇就来讲解一下游戏中主角的功能实现以及脚本书写。

我们将下载好的资源包导入到unity工程中,由于案例太老,官方已经取消了该资源包的下载。下载途径是我在网上随便找i的。

https://pan.baidu.com/s/1bBUyYZArcL7HKnf1Hj2V0A 提取码: dk9y

所有的模型都是已经准备好了的,我们只需要利用组件以及脚本实现功能即可。对于主角,我们首先需要实现的功能有这几个:行走,攻击,受伤害时表现,死亡时表现.这些是最基本的东西,接下来我们来处理这些事。

对于角色的行走,老生常谈的事情了,再控制好相机的跟随,分别创建两个脚本playermovementcameraFollow来实现,这里的话我也就不再多讲,直接会在后面贴代码了。毕竟这些博客我的想法是重在整理新知识。值得一提的是,我在输入时利用的都是我学长自己开发的组件,所以有些地方可能会造成困惑。

而攻击功能呢,我们需要检测鼠标i的点击来控制角色是否开枪,同时还需要让我们的枪口,也就是我们的开枪的方向,要始终朝向我们鼠标所在的方向,这是功能需求。

这里我们首先需要预制一个游戏物体,作为我们开枪时发生出去的子弹,单独为其创建一个脚本叫做Bullet,来配置子弹的参数。具体代码如下:

public class Bullet : MonoBehaviour
{
    public int damage = 10;  //子弹伤害

    public float flySpeed = 100f; //飞行速度
    public float duration = 5f;  //子弹存在时间

    private Vector3 dir = Vector3.zero;  //飞行方向
    private bool isFire = false;

    public void Fire(Vector3 dir)
    {
        this.dir = dir;  //确认方向
        isFire = true;
        Destroy(gameObject, duration);  //到时自动销毁
    }
    private void Update()
    {
        if (!isFire)
            return;

        transform.Translate(flySpeed * dir * Time.deltaTime);  //子弹的飞行
    } 

    private void OnTriggerEnter(Collider other) //触发检测
    {
        EnemyBase enemy = null;
        if( other.TryGetComponent<EnemyBase>(out enemy))
        {
            enemy.GetDamage(damage);  //对怪物造成伤害
        }

        Destroy(gameObject);  //碰到怪物销毁子弹
    }
}

子弹预制体的inspector页面如下:

开枪功能的是实现,我们将其单独定义为一个脚本,叫做shoot,首先我们不应该将鼠标点击的检测设置为单次检测,很傻,体验感也很差,比较好的做法是在检测鼠标点击时采用连续检测,然后手动设置一个子弹生成速率,来控制我们在按下鼠标时子弹的发射频率。具体代码如下:

ublic class Shoot : MonoBehaviour
{
    public float rate = .2f;  //子弹生成速率
    public GameObject bulletPrefab;  //子弹预制体
    public Transform gunport;  //获取枪口的位置

    public AudioClip shootFx;  //音效(后面再说)
    
    private float timer = 0;  //计时器
  
    void Start()
    {
        timer = rate;  //在开始时先让计时器等于我们的速率,第一次按下直接发射子弹。
    }

    
    void Update()
    {
        
        if(PlayerInput .Instance .Shoot &&  timer >=rate)  //条件:判断到鼠标连续到鼠标连续点击并且计时器小于生成速率
        {
            GameObject bullet = Instantiate(bulletPrefab, gunport.position, Quaternion.identity);  //实例化子弹
            bullet.GetComponent<Bullet>().Fire(gunport.forward);  //调用子弹发射函数
            timer = 0;  //计时器归0

            AudioManager.Instance.PlayFx(shootFx, gunport.position);  //音效
        }

        timer += Time.deltaTime; //计时

    }
}

值得注意的是在上面两个脚本中,有用到的unity几个自带的函数方法。

1.   Destroy()函数:static void Destroy(Object obj, float t = 0.0F);

第一个参数是传入销毁物体,第二个参数是传入执行时间,没有该参数就是立刻销毁。

2.Transform.Translate()函数:

可传入两个参数,第一个是移动速度,这个速度既包含大小,也包含方向,是一个矢量,第二个参数是相对坐标系。详情可以移步这篇博客:http://t.csdn.cn/mipiC

3.Instantiate()函数:

实例化函数,也叫做克隆函数,具体可参考:http://t.csdn.cn/b5bAm

至此,我们角色的攻击的功能也就实现啦。脚本中包含的其他功能会在后面的博客再详细记录,大家如果有问题,也可以在评论区留言或者私信我,俺也是很热心的一个博主啦,那今天就先写到这吧,886~


版权声明:本文为qq_62440805原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。