Unity 2D游戏开发教程之游戏精灵的开火状态

精灵的开火状态

“开火”就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力。因为本游戏在后面会引入敌人,而精灵最好具备开火的能力,否则会被敌人轻易干掉!具体的实现方法是:

(1)导入一个表示子弹的图片到Unity,本示例中选用的子弹图片,名为PlayerBullet,如图2-23所示。

 

图2-23  导入到游戏项目的表示子弹的图片

(2)拖动此图片到Scene视图,即可在当前的游戏场景中添加此对象,为此对象添加RigidBody 2D组件,并设置组件的下列属性,如图2-24所示。

  • q   Gravity Scale:0。表示子弹对象将不受重力的影响,所以不会偏离预定的发射轨道;

 

图2-24  设置子弹对象上各组件的属性

(3)在Project视图里,新建一个C#脚本,命名为PlayerBulletController,为此脚本添加下面的代码:

  • 01     using UnityEngine;
  • 02     using System.Collections;
  • 03
  • 04     public class PlayerBulletController : MonoBehaviour
  • 05     {
  • 06              public GameObject playerObject = null;            //表示精灵对象
  • 07              public float bulletSpeed = 15.0f;                                    //表示子弹的速度
  • 08              private float selfDestructTimer = 0.0f;                 //表示子弹自我销毁的时间
  • 09              void Update()
  • 10              {
  • 11                       //在一段时间以后销毁子弹对象
  • 12                       if(selfDestructTimer > 0.0f)
  • 13                       {
  • 14                                 if(selfDestructTimer < Time.time)
  • 15                                          Destroy(gameObject);
  • 16                       }
  • 17              }
  • 18              //调用此函数发射子弹
  • 19              public void launchBullet()
  • 20              {
  • 21                       //确定精灵对象的朝向
  • 22                       float mainXScale = playerObject.transform.localScale.x;
  • 23                       Vector2 bulletForce;                                                //对子弹施加的力的方向
  • 24                       //如果精灵对象面朝左,则向左发射子弹
  • 25                       if(mainXScale < 0.0f)
  • 26                       {
  • 27                                 bulletForce = new Vector2(bulletSpeed * -1.0f,0.0f);
  • 28                       }
  • 29                       //如果精灵对象面朝右,则向右发射子弹
  • 30                       else
  • 31                       {
  • 32                                 bulletForce = new Vector2(bulletSpeed,0.0f);
  • 33                       }
  • 34                       //施加给子弹对象一个指定方向的力
  • 35                       rigidbody2D.velocity = bulletForce;
  • 36                       //在1秒后销毁子弹对象
  • 37                       selfDestructTimer = Time.time + 1.0f;
  • 38              }
  • 39     }

将此脚本赋予场景中的子弹对象,选中后者,然后在Inspector视图里可以设置此脚本组件的Bullet Speed属性,用于修改子弹的发射速度,如图2-25所示。

 

图2-25  脚本组件的属性设置

将Hierarchy视图里的子弹对象,拖动到Project视图,即可创建一个子弹对象的预置资源,以备后面脚本中的代码使用。

(4)在PlayerStateController脚本中,添加精灵开火的状态,且指定当玩家按下鼠标左键的时候,精灵将进入开火状态,要添加的代码如下:

  • 01     using UnityEngine;
  • 02     using System.Collections;
  • 03
  • 04     public class PlayerStateController : MonoBehaviour
  • 05     {
  • 06              //定义游戏人物的各种状态
  • 07              public enum playerStates
  • 08              {
  • 09                       …                                                             //省略
  • 10                       falling,                                                     //表示降落过程
  • 11                       firingWeapon                                        //表示开火
  • 12              }
  • 13              //定义委托和事件
  • 14              public delegate void playerStateHandler(PlayerStateController.playerStates newState);
  • 15              public static event playerStateHandler onStateChange;
  • 16              void LateUpdate ()
  • 17              {
  • 18                       …                                                             //省略
  • 19                       //当玩家按下鼠标的左键时,进入开火状态
  • 20                       float firing = Input.GetAxis("Fire1");
  • 21                       if(firing > 0.0f)
  • 22                       {
  • 23                                 if(onStateChange != null)
  • 24                                         onStateChange(PlayerStateController.playerStates.firingWeapon);
  • 25                       }
  • 26              }
  • 27     }

(5)在Hierarchy视图里,新建一个Empty对象,命名为BulletSpawnPoint。拖动它到Player对象下,使其成为Player对象的子对象。然后调整BulletSpawnPoint对象的位置,使其位于精灵发射子弹时,子弹的出现位置。在本示例中,它们的相对位置如图2-26所示。

 

图2-26  设置开火时,子弹的发射位置

(6)在PlayerStateListener脚本中,添加代码用于处理精灵进入开火状态时,开火的游戏逻辑,要添加的代码如下:

  • 01     using UnityEngine;
  • 02     using System.Collections;
  • 03
  • 04     [RequireComponent(typeof(Animator))]
  • 05     public class PlayerStateListener : MonoBehaviour
  • 06     {
  • 07              …                                                                                         //省略
  • 08              public GameObject bulletPrefab = null;                    //表示子弹对象
  • 09              public Transform bulletSpawnTransform;               //表示创建子弹的位置
  • 10              …                                                                                         //省略
  • 11              //当角色的状态发生改变的时候,调用此函数
  • 12              public void onStateChange(PlayerStateController.playerStates newState)
  • 13              {
  • 14                       //如果状态没有发生变化,则无需改变状态
  • 15                       if(newState == currentState)
  • 16                                 return;
  • 17                       //判断精灵能否由当前的动画状态,直接转换为另一个动画状态
  • 18                       if(!checkForValidStatePair(newState))
  • 19                                 return;
  • 20                       //通过修改Parameter中Walking的值,修改精灵当前的状态
  • 21                       switch(newState)
  • 22                       {
  • 23                       …                                                                       //省略
  • 24                       case PlayerStateController.playerStates.firingWeapon:
  • 25                                 //实例化一个子弹对象
  • 26                                 GameObject newBullet = (GameObject)Instantiate(bulletPrefab);
  • 27                                 //设置子弹的起始位置
  • 28                                 newBullet.transform.position = bulletSpawnTransform.position;
  • 29                                 //建立与子弹对象上PlayerBulletController组件的联系
  • 30                                 PlayerBulletController bullCon = newBullet.GetComponent<PlayerBulletController>();
  • 31                                 //设定子弹对象上的PlayerBulletController组件的player object属性
  • 32                                 bullCon.playerObject = gameObject;
  • 33                                 //发射子弹
  • 34                                 bullCon.launchBullet();
  • 35                                 break;
  • 36                       }
  • 37                       //记录角色当前的状态
  • 38                       currentState = newState;
  • 39              }
  • 40              //用于确认当前的动画状态能否直接转换为另一动画状态的函数
  • 41              bool checkForValidStatePair(PlayerStateController.playerStates newState)
  • 42              {
  • 43                       bool returnVal = false;
  • 44                       //比较两种动画状态
  • 45                       switch(currentState)
  • 46                       {
  • 47                       …                                                                                         //省略
  • 48                       case PlayerStateController.playerStates.jump:
  • 49                                 if(    newState == PlayerStateController.playerStates.landing
  • 50                                          || newState == PlayerStateController.playerStates.kill
  • 51                                          || newState == PlayerStateController.playerStates.firingWeapon
  • 52                                          )
  • 53                                          returnVal = true;
  • 54                                 else
  • 55                                          returnVal = false;
  • 56                                 break;
  • 57                       case PlayerStateController.playerStates.landing:
  • 58                                 if(    newState == PlayerStateController.playerStates.left
  • 59                                          || newState == PlayerStateController.playerStates.right
  • 60                                          || newState == PlayerStateController.playerStates.idle
  • 61                                          || newState == PlayerStateController.playerStates.firingWeapon
  • 62                                          )
  • 63                                          returnVal = true;
  • 64                                 else
  • 65                                          returnVal = false;
  • 66                                 break;
  • 67                       case PlayerStateController.playerStates.falling:
  • 68                                 if(
  • 69                                          newState == PlayerStateController.playerStates.landing
  • 70                                          || newState == PlayerStateController.playerStates.kill
  • 71                                          || newState == PlayerStateController.playerStates.firingWeapon
  • 72                                          )
  • 73                                          returnVal = true;
  • 74                                 else
  • 75                                          returnVal = false;
  • 76                                 break;
  • 77                       case PlayerStateController.playerStates.firingWeapon:
  • 78                                 returnVal = true;
  • 79                                 break;
  • 80                       }
  • 81                       return returnVal;
  • 82              }
  • 83     }

对于此脚本,有以下几点需要说明:

  • q   脚本08、09行的代码,使得脚本组件中多出了两个属性设置框,如图2-27所示。需要依次设置为子弹预置对象和子弹的生成位置。
 
图2-27  脚本组件上增加的两个属性,需要手动设置属性值
  • q   脚本12行,定义的方法onStateChange()里面添加的代码,表示精灵处于开火状态时,将在指定位置上实例化一个子弹的预置对象,然后通过给子弹施加一个力来将它发射出去。
  • q   脚本41行,定义的方法checkForValidStatePair()里面添加的代码,表示处于jump、landing和falling状态的精灵,可以转换为firingWeapon,即开火状态。

(7)运行游戏,当按下鼠标的左键时,精灵将发射子弹,而且精灵可以在任何状态下发射子弹,如图2-28所示。

 

图2-28  精灵开火状态的运行效果

本文选自:Unity 2D游戏开发快速入门大学霸内部资料,转载请注明出处,尊重技术尊重IT人!

Unity 2D游戏开发教程之游戏精灵的开火状态的更多相关文章

  1. Unity 2D游戏开发教程之游戏中精灵的跳跃状态

    Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...

  2. Unity 2D游戏开发教程之精灵的死亡和重生

    Unity 2D游戏开发教程之精灵的死亡和重生 精灵的死亡和重生 目前为止,游戏项目里的精灵只有Idle和Walking这两种状态.也就是说,无论精灵在游戏里做什么,它都不会进入其它的状态,如死亡.于 ...

  3. Unity 2D游戏开发教程之摄像头追踪功能

    Unity 2D游戏开发教程之摄像头追踪功能 上一章,我们创建了一个简单的2D游戏.此游戏中的精灵有3个状态:idle.left和right.这看起来确实很酷!但是仅有的3个状态却限制了精灵的能力,以 ...

  4. Unity 2D游戏开发教程之使用脚本实现游戏逻辑

    Unity 2D游戏开发教程之使用脚本实现游戏逻辑 使用脚本实现游戏逻辑 通过上一节的操作,我们不仅创建了精灵的动画,还设置了动画的过渡条件,最终使得精灵得以按照我们的意愿,进入我们所指定的动画状态. ...

  5. Unity 2D游戏开发教程之为游戏场景添加多个地面

    Unity 2D游戏开发教程之为游戏场景添加多个地面 为游戏场景添加多个地面 显然,只有一个地面的游戏场景太小了,根本不够精灵四处活动的.那么,本节就来介绍一种简单的方法,可以为游戏场景添加多个地面. ...

  6. 仙剑奇侠传 游戏 开发 教程 Xianjian qixia development Game development tutorial

    仙剑奇侠传 开发  游戏 开发 教程 Xianjian qixia development Game development tutorial 作者:韩梦飞沙 Author:han_meng_fei_ ...

  7. Unity 4.2.0 官方最新破解版(Unity3D 最新破解版,3D游戏开发工具和游戏引擎套件)

    Unity是一款跨平台的游戏开发工具,从一开始就被设计成易于使用的产品.作为一个完全集成的专业级应用,Unity还包含了价值数百万美元的功能强大的游戏引擎.Unity作为一个游戏开发工具,它的设计主旨 ...

  8. 像素鸟 游戏开发教程 FlappyBird Game development tutorial

    像素鸟 游戏开发教程 FlappyBird Game development tutorial 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com ...

  9. MUD游戏开发教程视频

    MUD游戏开发教程视频 https://space.bilibili.com/476328540/channel/detail?cid=91187

随机推荐

  1. 主席树 或者 离散化+分块 BZOJ 4636

    4636: 蒟蒻的数列 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 381  Solved: 177[Submit][Status][Discuss ...

  2. SpringCloud (一)Eureka注册中心搭建

    前提 系统安装jdk1.8及以上,配置好maven的ide(这里用idea进行演示,maven版本3.5,配置阿里云源) 项目搭建 新建一个maven项目,创建最简单的那种就好,项目名这里为Eurek ...

  3. CF 900B

    CF 900B Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u   Descript ...

  4. 2017 ACM暑期多校联合训练 - Team 5 1008 HDU 6092 Rikka with Subset (找规律)

    题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...

  5. 天梯赛 L2-012 关于堆的判断 (二叉树)

    将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: "x is the root":x是根结点: "x and y ar ...

  6. Android 搭建Linux系统

    本文精心从网上搜罗出相关资料并整理,含有大量外部链接 安卓手机上安装linux大致分为两种方案 一.使用Linux Deploy 二.使用 Linux on Android 本文对Linux Depl ...

  7. c语言学习笔记.数组.

    数组: 可以存储一个固定大小的相同类型元素的顺序集合,比如int类型的数组.float类型的数组,里面存放的数据称为“元素”. 所有的数组都是由连续的内存位置组成.最低的地址对应第一个元素,最高的地址 ...

  8. linux自动创建dev node

    通过驱动模块的加载在/dev下创建设备文件,在驱动模块卸载时又自动的删除在/dev下创建的设备文件非常方便.而这个过程就是通过device_create()和device_destroy()内核函数完 ...

  9. android的wake_lock介绍

    Wake Lock是一种锁的机制, 只要有人拿着这个锁,系统就无法进入休眠, 可以被用户态程序和内核获得. 这个锁可以是有超时的或者是没有超时的, 超时的锁会在时间过去以后自动解锁. 如果没有锁了或者 ...

  10. count(*)与count(1)、count('xxx')等在使用语法方面的区别

    语法方面: 区别就是:没有区别!!! “*”号是通配符: “*”号是通配符 “*”号是通配符 使用"*"号和使用其他数字和任意非字段字符在使用方面没有任何语法错误; 至于效率方面是 ...