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

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

上一章,我们创建了一个简单的2D游戏。此游戏中的精灵有3个状态:idle、left和right。这看起来确实很酷!但是仅有的3个状态却限制了精灵的能力,以及游戏逻辑的想象空间。看来有必要让精灵拥有更多的状态,而这就是本章要讲解的主要内容。

摄像头追踪功能

游戏里的精灵可以在游戏场景中任意移动,这没什么问题,可是这就导致了一个问题,就是精灵可能移动到我们的视野之外,或者说游戏视图之外。为了解决这个问题,很多游戏都采用了“摄像头追踪”的方法,使得摄像头的位置会随着精灵的移动而移动。例如,《超级玛丽》中,精灵始终处于视图中心的位置,如图2-1所示。

图2-1  《超级玛丽》中,精灵始终位于游戏视图的中心

要为我们开发的游戏添加“摄像头追踪”的功能,就需要使用脚本编写这样一种逻辑。在Project视图的Scripts文件夹里,新建一个C#脚本,命名为CameraController,为此脚本添加下面的代码:

  • 01     using UnityEngine;
  • 02     using System.Collections;
  • 03
  • 04     public class CameraController : MonoBehaviour
  • 05     {
  • 06              //公有属性
  • 07              //表示精灵当前的动画状态
  • 08              public PlayerStateController.playerStates currentPlayerState = PlayerStateController.playerStates.idle;
  • 09              public GameObject playerObject = null;                                //表示精灵对象
  • 10              public float cameraTrackingSpeed = 1f;                               //表示摄像机的追踪速度
  • 11              //私有属性
  • 12              private Vector3 lastTargetPosition = Vector3.zero;             //上一目标位置
  • 13              private Vector3 currTargetPosition = Vector3.zero;             //下一目标位置
  • 14              private float currLerpDistance = 0.0f;
  • 15              //方法
  • 16              void Start()
  • 17              {
  • 18                       Vector3 playerPos = playerObject.transform.position;                //记录精灵的位置
  • 19                       Vector3 cameraPos = transform.position;                                               //记录摄像机的位置
  • 20                       Vector3 startTargPos = playerPos;
  • 21                       lastTargetPosition = startTargPos;
  • 22                       currTargetPosition = startTargPos;
  • 23              }
  • 24              //加入订阅者列表
  • 25              void OnEnable()
  • 26              {
  • 27                       PlayerStateController.onStateChange += onPlayerStateChange;
  • 28              }
  • 29              //从订阅者列表中退出
  • 30              void OnDisable()
  • 31              {
  • 32                       PlayerStateController.onStateChange -= onPlayerStateChange;
  • 33              }
  • 34              //实时记录游戏精灵当前的动画状态
  • 35              void onPlayerStateChange(PlayerStateController.playerStates newState)
  • 36              {
  • 37                       currentPlayerState = newState;
  • 38              }
  • 39              void LateUpdate()
  • 40              {
  • 41                       //依据当前精灵的动画状态,实时更新
  • 42                       onStateCycle();
  • 43                       //将摄像头移动到目标位置
  • 44                       currLerpDistance += cameraTrackingSpeed;
  • 45                       transform.position = Vector3.Lerp(lastTargetPosition, currTargetPosition, currLerpDistance);
  • 46              }
  • 47              void onStateCycle()
  • 48              {
  • 49                       switch(currentPlayerState)
  • 50                       {
  • 51                                 case PlayerStateController.playerStates.idle:
  • 52                                          trackPlayer();
  • 53                                break;
  • 54                                 case PlayerStateController.playerStates.left:
  • 55                                          trackPlayer();
  • 56                                 break;
  • 57                                 case PlayerStateController.playerStates.right:
  • 58                                          trackPlayer();
  • 59                                 break;
  • 60                       }
  • 61              }
  • 62              void trackPlayer()
  • 63              {
  • 64                       //获取并保存摄像机和精灵在世界坐标系的坐标
  • 65                        Vector3 currCamPos = transform.position;
  • 66                       Vector3 currPlayerPos = playerObject.transform.position;
  • 67                       lastTargetPosition = currCamPos;
  • 68                       currTargetPosition = currPlayerPos;
  • 69                       currTargetPosition.z = currCamPos.z;                          //保证摄像头z轴方向上的值不变
  • 70              }
  • 71     }

将此脚本赋予Hierarchy视图里的Main Camera对象,选中后者,然后在Inspector视图里设置此脚本组件的下列属性,如图2-2所示。

  • q   Player Object:Player。表示摄像头要追踪的精灵对象;
  • q   Camera Tracking Speed:1。此属性值范围是0~1,若为0时,摄像头不会追踪精灵,若为1时,摄像头可以在瞬间追踪到精灵对象;

图2-2  Main Camera对象的脚本组件上各属性的设置

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

  • q   脚本69行的代码使得摄像头与精灵对象不至于重合。要让摄像头实时追踪游戏精灵,只要实时更新摄像头的位置即可。就是要让它的位置与精灵的位置一致,但是它们在Z轴方向上的值不能相同,如图2-3所示。否则摄像头与精灵会发生重合,使得游戏视图里精灵对象消失,如图2-4所示。

图2-3  摄像头与精灵在Z方向上的值不同

图2-4  摄像头与精灵在Z方向上的值相同

  • q   脚本45行的Vector3.Lerp()函数,是完成摄像头实时追踪功能的主要函数。这个函数会将一个对象,以一定的速度从一个位置移动到另一个位置;

运行游戏,然后使用键盘上的方向键控制精灵左右移动,你会发现游戏视图会和精灵一同移动,甚至是精灵因为脱离地面发生坠落时,也不例外,如图2-5所示。

图2-5  摄像头追踪功能,精灵始终位于游戏视图的中心

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

时间: 2024-08-05 08:29:27

Unity 2D游戏开发教程之摄像头追踪功能的相关文章

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

Unity 2D游戏开发教程之为游戏场景添加多个地面 为游戏场景添加多个地面 显然,只有一个地面的游戏场景太小了,根本不够精灵四处活动的.那么,本节就来介绍一种简单的方法,可以为游戏场景添加多个地面.具体的操作方法是: (1)在Project视图里,新建一个文件夹,命名为Prefabs.然后将Hierarchy视图里的Platform对象,拖动到Prefabs文件夹中,如此一来就可以生成一个同名的预置资源,如图2-11所示. 图2-11  通过拖动对象到Project视图的方式,新建预置资源 (

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

Unity 2D游戏开发教程之精灵的死亡和重生 精灵的死亡和重生 目前为止,游戏项目里的精灵只有Idle和Walking这两种状态.也就是说,无论精灵在游戏里做什么,它都不会进入其它的状态,如死亡.于是我们发现游戏里的精灵,即使是跳入“万丈深渊”,也依然存活,显然这种游戏逻辑无法让人接受.因此,本节就来说明为精灵添加死亡和重生这两种状态的方法,并使用脚本实现这两种状态的逻辑.具体的实现步骤如下: (1)在Hierarchy视图里,新建一个Empty对象,并命名为Death Trigger,设置其

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

Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却无法从低的地面移动到高的地面,因为当前的游戏精灵只能左右移动,即left和right.为了解决这个问题,本节就来为精灵添加跳跃状态.   图2-14  精灵从一个地面移动到另一个地面 (1)如果要为精灵添加跳跃状态,即jump,就不得不再引入其它状态: q   landing:用于表示精灵接触到地面

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

Unity 2D游戏开发教程之使用脚本实现游戏逻辑 使用脚本实现游戏逻辑 通过上一节的操作,我们不仅创建了精灵的动画,还设置了动画的过渡条件,最终使得精灵得以按照我们的意愿,进入我们所指定的动画状态.但是这其中还有一些问题.例如,我们无法使用键盘控制精灵当前要进入的动画状态,而且精灵也只是在原地播放动画而已.但我们希望精灵在进入到PlayerWalkingAnimation状态时,位置应该发生改变. 要解决这些问题,就需要编写脚本.也就是说,要使用脚本来实现动画的播放控制,以及其它一些游戏的逻辑

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

Unity 2D游戏开发教程之游戏精灵的开火状态 精灵的开火状态 "开火"就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力.因为本游戏在后面会引入敌人,而精灵最好具备开火的能力,否则会被敌人轻易干掉!具体的实现方法是: (1)导入一个表示子弹的图片到Unity,本示例中选用的子弹图片,名为PlayerBullet,如图2-23所示. 图2-23  导入到游戏项目的表示子弹的图片 (2)拖动此图片到Scene视图,即可在当前的游戏场景中

?Unity 2D游戏开发教程之2D游戏的运行效果

Unity 2D游戏开发教程之2D游戏的运行效果 2D游戏的运行效果 本章前前后后使用了很多节的篇幅,到底实现了怎样的一个游戏运行效果呢?或者说,游戏中的精灵会不会如我们所想的那样运行呢?关于这些疑问,会在本节集中揭晓. (1)单击Unity上方,工具栏里的播放按钮,开始运行当前的游戏,默认精灵当前进入的是Idle动画状态,如图1-34所示. 图1-34  Idle状态 (2)当读者按下键盘上的左.右方向键,或者A.D键的时候,精灵会进入Walking动画状态,并且会向左或者向右移动,如图1-3

Unity 2D游戏开发快速入门第1章创建一个简单的2D游戏

Unity 2D游戏开发快速入门第1章创建一个简单的2D游戏 即使是现在,很多初学游戏开发的同学,在谈到Unity的时候,依然会认为Unity只能用于制作3D游戏的.实际上,Unity在2013年发布4.3版本的时候,就开始提供对制作2D游戏的支持了.例如,提供了一些专用于开发2D游戏的Unity工具.现在Unity已经发布了版本4.5,对2D游戏的支持更是完善了不少.为了说明Unity对2D游戏所提供的支持,本章会使用这些在Unity中原生的工具,开发一个简单的2D游戏.本文选自<Unity

Unity网络多玩家游戏开发教程第1章Unity自带网络功能

Unity网络多玩家游戏开发教程第1章Unity自带网络功能 Unity拥有大量的第三方插件,专门提供了对网络功能的支持.但是,大部分开发者第一次接触到的还是Unity自带的网络功能,也就是大家经常说到的Unity Networking API.这些API是借助于组件NetworkView发挥作用的,而它可以简化开发者大量的网络功能编码任务.本文选自<Unity网络多玩家游戏开发教程(大学霸内部资料)> NetworkView组件 在Unity中,NetworkView组件用于处理游戏在网络上

关于《Unity3D/2D游戏开发从0到1》书籍再版说明

关于<Unity3D/2D游戏开发从0到1>第一版本在2015年7月1日全国发行,累计得到不少国内高校教师.培训机构的好评.但是由于Unity官方对于技术不断的升级与版本的快速迭代,基于Unity4.6版本的教学知识体系,则略显滞后.    随着2017年7月份,Unity2017.1正式版本的推出,<Unity3D/2D游戏开发从0到1>书籍的再版,则正式提上日程. 目前2017年8月份再版工作已经进行过半,现在给各位小伙伴汇报一下工作,希望得到更好的建议.现在说说第二版本的总体