游戏制作之路(15)子弹的发射装置

栏目: 后端 · 发布时间: 6年前

内容简介:从上图可见,我们所脚本RocketLauncher.cs与Character关联在一起的。接着在这个脚本里添加下面四个变量:rocketPrefab变量定义为一个游戏对象,它是代表子弹模板,可以不断地克隆它出来,这样就可以使用一个对象表示无限多个子弹了。rocketBarrel变量是一个变换对象,它是表示子弹的枪口,定义发射输出的位置和方向。reloadTime是表示枪需要再次发射的冷却时间,也就是说每发子弹是间隔多长时间才可以再打一发出去。lastFireTime是表示最后一枪子弹发出的时间,以便计算冷

前面介绍了怎么制作子弹,以及子弹的碰撞触发,接着下来,就是怎么样发射子弹,以及从那里发射子弹。通常情况,都是点击鼠标左键,就会发射子弹出去。在这里子弹选择从前面眼睛的位置发射出去,方向就是角色的正对着的正前方。为了脚本代码方便管理,把发射子弹的脚本分离开来,单独创建一个脚本代码,命名为RocketLauncher,如下图所示:

游戏制作之路(15)子弹的发射装置

从上图可见,我们所脚本RocketLauncher.cs与Character关联在一起的。接着在这个脚本里添加下面四个变量:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RocketLauncher : MonoBehaviour {

    public GameObject rocketPrefab;
    public Transform rocketBarrel;
    public float reloadTime = 0.5f;

    private float lastFireTime;
    // Use this for initialization
    void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}

rocketPrefab变量定义为一个游戏对象,它是代表子弹模板,可以不断地克隆它出来,这样就可以使用一个对象表示无限多个子弹了。rocketBarrel变量是一个变换对象,它是表示子弹的枪口,定义发射输出的位置和方向。reloadTime是表示枪需要再次发射的冷却时间,也就是说每发子弹是间隔多长时间才可以再打一发出去。lastFireTime是表示最后一枪子弹发出的时间,以便计算冷却时间是否足够。

变量已经定义了,就需要设置这些变量关系,先来创建子弹的预制件,什么叫做预制件呢?不知道你是否看过房子的建造过程,在房子的建造过程里,经常有一个环节叫做搬砖,没错,就是砖,这些砖不是在建房的工地了生产的,而是在砖厂里,这些砖就叫做预制件,预制件有一个好处,就是缩减工期,减少出错,提高效率。因此,这里也是有同样的功效。比如很多游戏的部件,并不是在unity里制造的,而由其它工具,比如blender,就是前面学习过的内容。当然,unity也不会限制你在unity里来创建预制件。

从下面的界面选项来创建预制件:

游戏制作之路(15)子弹的发射装置

接着把这个Prefab命名为:Rocket,如下图:

游戏制作之路(15)子弹的发射装置

接着需要把预先定义Rocket游戏对象拖动到这个盒子里,就完成了预制件的过程,如下:

游戏制作之路(15)子弹的发射装置

接着我们把预制件与变量进行关联起来,这样才能在代码里使用它,把Rocket预制件拖到rocketPrefab变量里,如下图:

游戏制作之路(15)子弹的发射装置

如果拖动完成之后,Rocket Prefab就会变成非空,变成Rocket.

接着下来,我们需要设置子弹的发射位置了,也就是把Head拖动到Rocket Barrel位置,如下图所示:

游戏制作之路(15)子弹的发射装置

到这里就把变量关联完成,接着就在脚本里输入下面的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RocketLauncher : MonoBehaviour {

    public GameObject rocketPrefab;
    public Transform rocketBarrel;
    public float reloadTime = 0.5f;

    private float lastFireTime;
    // Use this for initialization
    void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        if (Input.GetButtonDown("Fire1") && Time.time > lastFireTime + reloadTime)
        {
            GameObject go = (GameObject)Instantiate(rocketPrefab, rocketBarrel.position, Quaternion.LookRotation(rocketBarrel.forward));
            Physics.IgnoreCollision(GetComponent<Collider>(), go.GetComponent<Collider>());
            lastFireTime = Time.time;
        }
    }
}

只要在Update里添加上面的代码,你按下play按钮,就可以开火了,子弹喷射而出。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

无处不在的算法

无处不在的算法

[德]贝特霍尔德·弗金、赫尔穆特·阿尔特 / 机械工业出版社 / 2018-1-1

本书以简单易懂的写作风格,通过解决现实世界常见的问题来介绍各种算法技术,揭示了算法的设计与分析思想。全书共有41章,分为四大部分,图文并茂,把各种算法的核心思想讲得浅显易懂。本书可作为高等院校算法相关课程的本科生教材,也可作为研究人员、专业技术人员的常备参考书。一起来看看 《无处不在的算法》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器