6 发射子弹

本节完成发射子弹的功能,最终代码如下:

 
image

首先,发射子弹得确定发射的位置和方向,还有发射的初始速度.具体的发射速度和按下发射按键的时间长短有关,这个关于子弹的蓄力我们在第九小节中会讲到.

首先我们在Tank上添加一个空物体,命名为FirePosition,设置Position为(0,1.7,1.35),

Rotation为(350,0,0)

 
image

在wm/Scripts中创建C#脚本Shooter.cs

 
image

首先我们是在按下开火键的时候发射子弹的,所以我们在Update()里面需要判断开火键有没有按下,因为两个tank是不同的按键,所以我们需要区分一下当前是哪一个坦克

public int id = 1; // 坦克id

void Update () {

    if (Input.GetButtonDown ("Fire" + id)) { // 按下开火键

        Fire ();// 发射子弹

    }

}

.

发射子弹的时候需要子弹的Prefab和发射位置.

public GameObject shellObject; // 子弹Prefab

public Transform firePosition; // 发射点

在真正发射子弹的Fire()函数里面,我们需要使用Instantiate方法来创建Shell的实例

GameObject go = Instantiate (shellObject, firePosition.position, firePosition.rotation ) as GameObject;

至于让子弹发射出去,则可以通过直接设置刚体的速度来实现.

Rigidbody rb = go.GetComponent<Rigidbody> ();

    if (rb)

        rb.velocity = firePosition.forward * 20;

发射子弹功能完整代码如下:

Shooter.cs代码:

using UnityEngine;

using System.Collections;

public class Shooter : MonoBehaviour {

public GameObject shellObject; // 子弹Prefab

public Transform firePosition; // 发射点

public int id = 1; // 坦克id

// Update is called once per frame

void Update () {

    if (Input.GetButtonDown ("Fire" + id)) { // 按下开火键

        Fire ();// 发射子弹

    }

}

public void Fire(){ // 发射子弹

    GameObject go =  Instantiate (shellObject, firePosition.position, firePosition.rotation ) as GameObject;

    Rigidbody rb = go.GetComponent<Rigidbody> ();

    if (rb)

        rb.velocity = firePosition.forward * 20;

}

}

然后回到Hierarchy里面,选中Tank,将Shooter挂载到上面,设置Shell预设体和发射点,保存Tank Prefab.

 
image

点击Play运行游戏,实际效果如下.

 
image

---------------------------我是目录分割线---------------------------

《杜增强讲Unity之Tanks坦克大战》1-准备工作

《杜增强讲Unity之Tanks坦克大战》2-场景设置

《杜增强讲Unity之Tanks坦克大战》3-添加坦克

《杜增强讲Unity之Tanks坦克大战》4-坦克的移动和旋转

《杜增强讲Unity之Tanks坦克大战》5-子弹

《杜增强讲Unity之Tanks坦克大战》6-发射子弹

《杜增强讲Unity之Tanks坦克大战》7-坦克血条

《杜增强讲Unity之Tanks坦克大战》8-子弹碰撞处理

《杜增强讲Unity之Tanks坦克大战》9-发射子弹时蓄力

《杜增强讲Unity之Tanks坦克大战》10-相机控制

《杜增强讲Unity之Tanks坦克大战》11-游戏流程控制

---------------------------我是目录分割线---------------------------

《杜增强讲Unity之Tanks坦克大战》6-发射子弹的更多相关文章

  1. 《杜增强讲Unity之Tanks坦克大战》10-相机控制

    10 相机控制 本节主要学习如何控制相机自动调整位置和焦距,使两个坦克一直同时在视野内.   image 在Hierarchy点击右键   image 点击 Create Empty,生成空对象,改名 ...

  2. 《杜增强讲Unity之Tanks坦克大战》11-游戏流程控制

    11 游戏流程控制 使用协程来控制游戏流程 11.1 添加MessageText 首先添加一个Text来显示文字   image 设置GameMgr   image 11.2 游戏整体流程 下面Gam ...

  3. 《杜增强讲Unity之Tanks坦克大战》9-发射子弹时蓄力

    9 发射子弹时蓄力 实现效果如下   image 按下开火键(坦克1为空格键)重置力为最小力,一直按着的时候蓄力,抬起的时候发射.如果按着的时候蓄力到最大,则自动发射,此时在抬起则不会重复发射. 首先 ...

  4. 《杜增强讲Unity之Tanks坦克大战》4-坦克的移动和旋转

    4 坦克移动和旋转 本节课的目标是实现同时wsad和上下左右控制两个坦克分别移动和旋转 4.1 本节代码预览   image 将上节课场景s2另存为s3. 4.2 添加车轮扬沙效果 从Prefabs里 ...

  5. 《杜增强讲Unity之Tanks坦克大战》1-准备工作

    0.案例介绍 0.1开始界面   点击Play Now 进入游戏界面   左边的坦克使用ws控制前后移动,ad键左右旋转,空格键开火   右边的坦克使用方向键上下控制前后移动,方向键左右键实现左右旋转 ...

  6. 《杜增强讲Unity之Tanks坦克大战》2-场景设置

    2  场景设置 2.1 本节效果预览   2.2 项目目录设置 点击Project面板的Create按钮,在根目录下面新建wm文件夹   Wm文件夹用于存放我们自己生成的Prefab和脚本等其他资源, ...

  7. 《杜增强讲Unity之Tanks坦克大战》3-添加坦克

    3 添加坦克 3.1 本节效果预览   3.2 另存新场景 首先打开上次的场景s1,另存为s2,放到同一个文件夹下面.   3.3 添加坦克模型 在Model文件夹下面找到Tank模型   将Tank ...

  8. 《杜增强讲Unity之Tanks坦克大战》5-子弹

    5 子弹 本节的任务是创建子弹的Prefab   image 首先从Model/Shell找到子弹的模型,拖入Hierarchy中,添加刚体组件,所有属性默认值. 添加Capsule Collider ...

  9. 《杜增强讲Unity之Tanks坦克大战》7-坦克血条

    7 坦克血条 点击菜单GameObject->UI->Slider创建Slider   选中EventSystem,设置Horizontal Axis为HorzontalUI,Vertic ...

随机推荐

  1. Jmeter入门3 http请求—content-type与参数

    本文讲三种content-type以及在Jmeter中对应的参数输入方式 第一部分:目前工作中涉及到的content-type 有三种: content-type:在Request Headers里, ...

  2. Day15 集合(二)

    Set简介 定义 public interface Set<E> extends Collection<E> {} Set是一个继承于Collection的接口,即Set也是集 ...

  3. 集合之保持compareTo和equals同步

    在Java中我们常使用Comparable接口来实现排序,其中compareTo是实现该接口方法.我们知道compareTo返回0表示两个对象相等,返回正数表示大于,返回负数表示小于.同时我们也知道e ...

  4. vue.js数据绑定

      语法         插值             双大括号:{{text}} {{*text}}之渲染第一次 {{{html}}}        表达式(各种数值,变量,运算符的综合体)     ...

  5. HDU 1698 Just a Hook(线段树模板之区间替换更新,区间求和查询)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. 新手搭建 x-boot 编译环境笔记

    1.需要先搭建交叉编译环境,即制作交叉编译工具链,这个过程比较复杂,所以我在这里使用别人做好的交叉编译工具链. 2018年8月27日15:03:37   2.X-boot 源码github地址:htt ...

  7. 【vue】vue生命周期解读 (流程+钩子函数)

    参考详细说明一波简书 (vue中钩子函数解读) 1.实例渲染流程 2.生命周期钩子函数比 钩子函数详解简书一 钩子函数详解简书二

  8. oracle快速学习

  9. python3通过纯真IP数据库查询IP归属地信息

    在网上看到的别人写的python2的代码,修改成了python3. 把纯真IP数据库文件qqwry.dat放到czip.py同一目录下. #! /usr/bin/env python # -*- co ...

  10. JavaWeb基础—JavaBean

    一.什么是JavaBean 一个遵循一定规范的普通的Java类 百度的JavaBean规范: (1)JavaBean 类必须是一个公共类,并将其访问属性设置为 public , 如: public c ...