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. 莫队 Codeforces Round #340 (Div. 2) E

    题目大意:给你一个长度为n的序列,有m个询问,每次询问一个区间[L,R],表示这个区间内,有多少的a[i]^a[i+1].....^a[j]=k. 思路:莫队去搞就好了 我们定义pre[i]=a[1] ...

  2. 图论:DFS序

    DFS序可以把树转到区间上再用高级数据结构维护,比树链剖分好理解很多 一个闭区间就是一棵子树 POJ3321 #include<cstdio> ; ; int n,m,id,cnt; in ...

  3. Atcoder #017 agc017 B.Moderate Differences 思维

    LINK 题意:给出最左和最右两个数,要求往中间填n-2个数,使得相邻数间差的绝对值$∈[L,R]$ 思路:其实也是个水题,比赛中大脑宕机似的居然想要模拟构造一个数列,其实我们只要考虑作为结果的数,其 ...

  4. 分析nginx日志脚本之python

    为了对每个月的切割过的30个日志文件统计出访问最多的ip地址进行排序,整理了下面的脚本,主要思路是处理每一个日志文件的ip排序,最后进行字典合并,计算出月ip排序. #!/usr/bin/env py ...

  5. [数据库中间件]centos6.6下配置libzdb所产生的错误

    1.关于gmtime_r.timegm的隐藏声明错误,从系统的time.h中复制两个函数引用到libzdb自己定义的time.h,代码如下: extern struct tm *gmtime_r (c ...

  6. bzoj3524/2223 [Poi2014]Couriers

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3524 http://www.lydsy.com/JudgeOnline/problem.ph ...

  7. 【leetcode 简单】第十四题 最后一个单词的长度

    给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度. 如果不存在最后一个单词,请返回 0 . 说明:一个单词是指由字母组成,但不包含任何空格的字符串. 示例: 输入: &quo ...

  8. HDU 5995 Kblack loves flag (模拟)

    题目链接 Problem Description Kblack loves flags, so he has infinite flags in his pocket. One day, Kblack ...

  9. 简谈CSS 中的 em,rem,px,%

    在实际工作中,可能我们用的比较多的是‘%’ 和 px,但是我们也经常看到很多网站和css框架里用的是em 或rem.而‘%’ 和px已经都是比较常见或者说是常用.但是em 和rem 却鲜有使用,一直以 ...

  10. 安装JDK环境变量的配置

    设置环境变量 在java中需要设置三个环境变量(1.5之后不用再设置classpath了,但是个人强烈建议继续设置以保证向下兼容问题) JDK安装完成之后我们用来设置环境变量:右击”我的电脑“,选择” ...