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

Wesley13
• 阅读 571

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

精灵的开火状态

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

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

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

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

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

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

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

图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所示。

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

图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所示。

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

图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();

  • 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所示。需要依次设置为子弹预置对象和子弹的生成位置。

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

图2-27 脚本组件上增加的两个属性,需要手动设置属性值

  • q 脚本12行,定义的方法onStateChange()里面添加的代码,表示精灵处于开火状态时,将在指定位置上实例化一个子弹的预置对象,然后通过给子弹施加一个力来将它发射出去。

  • q 脚本41行,定义的方法checkForValidStatePair()里面添加的代码,表示处于jump、landing和falling状态的精灵,可以转换为firingWeapon,即开火状态。

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

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

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

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

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
2年前
Unity小王子私藏的开发2D游戏的常用插件合集
Unity以开发3D游戏见长,早期版本的Unity在开发2D游戏时不慎方便,因此AssetStore出现了很多2D游戏开发引擎。现在Unity对2D游戏的支持越来越好,而这些开发2D游戏的Unity插件也得到了更多开发者的喜爱。1:RexEngine:Classic2DPlatformerEngine(https://www.os
Wesley13 Wesley13
2年前
unity2d 物体指向鼠标方向绕某一点旋转
 在2D游戏中,类似泡泡龙炮台发射、敌人飞机永远指向PLAYER、愤怒小鸟弹弓发射等效果,都需要用到物体跟随鼠标绕一个点旋转的效果,在unity中实现代码很简单,但是在理解上有一定障碍,因为unity是3D界面,他的旋转并不是2D世界中那么简单。实现这种效果,可以使用两种方法,一种是采用角度计算,一种是采用向量运算;1,角度运算容易理解,但是代码较为
Wesley13 Wesley13
2年前
C#游戏开发快速入门2.2改变游戏对象的状态
C游戏开发快速入门2.2改变游戏对象的状态改变游戏对象的状态,就是要改变游戏对象的位置、朝向和大小。那么,为什么要改变游戏对象的状态呢?当然是因为游戏对象的状态不合适了。在具体说明之前,读者应该先了解下MainCamera对象的作用。本文选自《C游戏开发快速入门(大学霸)》2.2.1  Ma
Wesley13 Wesley13
2年前
Unity 2D游戏开发快速入门第1章创建一个简单的2D游戏
Unity2D游戏开发快速入门第1章创建一个简单的2D游戏即使是现在,很多初学游戏开发的同学,在谈到Unity的时候,依然会认为Unity只能用于制作3D游戏的。实际上,Unity在2013年发布4.3版本的时候,就开始提供对制作2D游戏的支持了。例如,提供了一些专用于开发2D游戏的Unit
Wesley13 Wesley13
2年前
unity仿微信飞机大战项目
开发路线:1,游戏背景(连续播放)2,添加主角3,设置游戏主角的动画4,添加两种子弹并设置子弹的运动5,添加三种子弹设置子弹的自动生成和运动6,添加两种奖励物品设置奖励物品的自动生成和运动7,设置主角的控制
Wesley13 Wesley13
2年前
Unity 2D游戏开发教程之精灵的死亡和重生
Unity2D游戏开发教程之精灵的死亡和重生精灵的死亡和重生目前为止,游戏项目里的精灵只有Idle和Walking这两种状态。也就是说,无论精灵在游戏里做什么,它都不会进入其它的状态,如死亡。于是我们发现游戏里的精灵,即使是跳入“万丈深渊”,也依然存活,显然这种游戏逻辑无法让人接受。
Wesley13 Wesley13
2年前
Unity中制作游戏的快照游戏支持玩家拍快照
Unity中制作游戏的快照游戏支持玩家拍快照有些游戏支持玩家“拍快照”,也就是将游戏的精彩瞬间以图片的形式记录下来的功能。这个功能比较有趣,而且以后的用途也会很广,为此本节打算介绍:截取矩形区域内游戏视图,并将其显示在视图其它区域的方法。具体的操作步骤如下本文选自Unity游戏开发技巧集锦:(1)在Pro
Wesley13 Wesley13
2年前
Unity 2D游戏开发教程之为游戏场景添加多个地面
Unity2D游戏开发教程之为游戏场景添加多个地面为游戏场景添加多个地面显然,只有一个地面的游戏场景太小了,根本不够精灵四处活动的。那么,本节就来介绍一种简单的方法,可以为游戏场景添加多个地面。具体的操作方法是:(1)在Project视图里,新建一个文件夹,命名为Pr
Stella981 Stella981
2年前
Cocos Creator基础教程(12)—精灵变身
在CocosCreator中使用率最高的非精灵(Sprite)莫属了,在游戏中我们经常会遇到将一张图片替换成另一张图片的情况,或者是在不同状态时来回切换图片。实现这个功能对程序员同学来说并不难,但是!回头检视一下编写的代码,能否让美术、策划同学使用上吗?如果不能的话,相信这篇教程可能对你和你的伙伴有更多启发!1\.SpriteIndex组件
Wesley13 Wesley13
2年前
Unity 2D游戏开发教程之使用脚本实现游戏逻辑
Unity2D游戏开发教程之使用脚本实现游戏逻辑使用脚本实现游戏逻辑通过上一节的操作,我们不仅创建了精灵的动画,还设置了动画的过渡条件,最终使得精灵得以按照我们的意愿,进入我们所指定的动画状态。但是这其中还有一些问题。例如,我们无法使用键盘控制精灵当前要进入的动画状态,而且精