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人!
Unity 2D游戏开发教程之摄像头追踪功能的更多相关文章
- Unity 2D游戏开发教程之精灵的死亡和重生
Unity 2D游戏开发教程之精灵的死亡和重生 精灵的死亡和重生 目前为止,游戏项目里的精灵只有Idle和Walking这两种状态.也就是说,无论精灵在游戏里做什么,它都不会进入其它的状态,如死亡.于 ...
- Unity 2D游戏开发教程之使用脚本实现游戏逻辑
Unity 2D游戏开发教程之使用脚本实现游戏逻辑 使用脚本实现游戏逻辑 通过上一节的操作,我们不仅创建了精灵的动画,还设置了动画的过渡条件,最终使得精灵得以按照我们的意愿,进入我们所指定的动画状态. ...
- Unity 2D游戏开发教程之游戏精灵的开火状态
Unity 2D游戏开发教程之游戏精灵的开火状态 精灵的开火状态 “开火”就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力.因为本游戏在后面会引入敌 ...
- Unity 2D游戏开发教程之游戏中精灵的跳跃状态
Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...
- Unity 2D游戏开发教程之为游戏场景添加多个地面
Unity 2D游戏开发教程之为游戏场景添加多个地面 为游戏场景添加多个地面 显然,只有一个地面的游戏场景太小了,根本不够精灵四处活动的.那么,本节就来介绍一种简单的方法,可以为游戏场景添加多个地面. ...
- Unity 2D游戏开发教程之2D游戏的运行效果
Unity 2D游戏开发教程之2D游戏的运行效果 2D游戏的运行效果 本章前前后后使用了很多节的篇幅,到底实现了怎样的一个游戏运行效果呢?或者说,游戏中的精灵会不会如我们所想的那样运行呢?关于这些疑问 ...
- Unity 2D游戏开发高速入门第1章创建一个简单的2D游戏
Unity 2D游戏开发高速入门第1章创建一个简单的2D游戏 即使是如今,非常多初学游戏开发的同学.在谈到Unity的时候.依旧会觉得Unity仅仅能用于制作3D游戏的. 实际上.Unity在2013 ...
- Unity MMORPG游戏开发教程(一)——初识Unity
五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以C#为介绍语言,基于Unity2017.4.x. 一.环境搭建 我使用的是Unity+VSCode,用的是mac系统,windows的自己 ...
- 关于《Unity3D/2D游戏开发从0到1》书籍再版说明
关于<Unity3D/2D游戏开发从0到1>第一版本在2015年7月1日全国发行,累计得到不少国内高校教师.培训机构的好评.但是由于Unity官方对于技术不断的升级与版本的快速迭代,基于U ...
随机推荐
- HDU 5144 三分
开始推导用公式求了好久(真的蠢),发现精度有点不够. 其实这种凸线上求点类的应该上三分法的,当作入门吧... /** @Date : 2017-09-23 21:15:57 * @FileName: ...
- System中关于Property的方法
System类在java.lang包中,所有方法都是静态的,里边有很多对系统的属性和控制方法 System类有三个成员变量:out-标准输出流(默认是控制台),in-标准输入流(默认是键盘),err- ...
- iOS数据存取---iOS-Apple苹果官方文档翻译
CHENYILONG Blog iOS数据存取---iOS-Apple苹果官方文档翻译 数据存取/*技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http:// ...
- HBase笔记之远程Shell界面命令行无法删除字符的解决方案
方法一: 设置终端退格键为ASCII 127 在XShell的界面中,设置 文件 --> 属性 --> 终端 --> 键盘 --> BACKSPACE键序列,改为ASCII 1 ...
- 阿里分布式开源框架DUBBO 入门+ 进阶+ 项目实战视频教程
史诗级Java/JavaWeb学习资源免费分享 欢迎关注我的微信公众号:"Java面试通关手册"(坚持原创,分享各种Java学习资源,面试题,优质文章,以及企业级Java实战项目回 ...
- python设计模式之装饰器详解(三)
python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...
- go 数据变量和操作符
数据类型 布尔类型 a. var b bool 和 var b bool = true 和 var b = falseb. 操作符 == 和 !=c. 取反操作符: !bd. && 和 ...
- Android 反编译神器jadx的使用
一.前言 今天介绍一个非常好用的反编译的工具 jadx .jadx 的功能非常的强大,对我而言,基本上满足日常反编译需求. jadx 优点: 图形化的界面. 拖拽式的操作. 反编译输出 Java 代码 ...
- python使用requests模块模拟登陆知乎
from bs4 import BeautifulSoup import requests import time def captcha(captcha_data): with open(" ...
- sicily 1193. Up the Stairs
Time Limit: 1sec Memory Limit:32MB Description John is moving to the penthouse of a tall sky-scr ...