博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity中的时间控制 - 关卡创建
阅读量:4147 次
发布时间:2019-05-25

本文共 2228 字,大约阅读时间需要 7 分钟。

转载自:http://forum.china.unity3d.com/thread-22658-1-1.html(unity官方平台)

本文会探讨如何在Unity中使用时间控制进行关卡创建。在探讨之前,可以观看视频了解拥有时间控制玩法的解谜游戏《Lintrix》:


因为与《Lintrix》拥有同样的时间控制玩法的游戏并不多见,因此本文以《Lintrix》为例,说明如何在Unity中实现该功能,以及它可以有哪些应用。 我们将以Unity引擎为例,并使用Unity相关的术语,但其概念也适用于其他引擎。

时间控制对创建关卡的意义
为什么要用时间控制来辅助创建关卡呢?这样设计的主要契机是:第一,《Lintrix》团队有成员在创建动画编辑器方面具有丰富经验;第二,Unity有一个时间轴,可以查看场景在任何时刻的表现。

我们希望状态和属性,比如Unity对象的Transforms,可依赖于时间,并且能够跳转到特定时刻,因为如果这样的话,正常进行游戏的时候,所有对象都将拥有相应的状态。

就游戏本身而言,因为《Lintrix》是确定性的游戏,所以可以很好地利用时间轴来实现时间控制。《Lintrix》场景的许多对象都在游戏进行时移动,并且它们彼此之间的相对位置非常重要,像时间轴这样的工具可以帮助关卡设计者更容易理解该关卡在游戏中的样子,以便在编辑器中进行创建。另外在大多数情况下,我们也很容易编辑某个时刻的关卡,从而让所有的对象在某个具体时间点定位或旋转,并且当时间设置为零或开始移动时,对象会自动重新计算其位置。


我们提供了快捷键以便于对时间进行前进和后退操作。之后,关卡创建不仅是摆放物体后运行,更多的是向前或向后跳跃,以及重新定位对象,所以这些物体在关卡的任意时刻都要保持在其预先设计的位置。

这在《Lintrix》游戏中非常有用:一方面,希望玩家能够连接晶体来消灭所有的敌人;另一方面,又不希望这些连接会覆盖其他晶体或者彼此重叠。

如何避免对象碰撞
实际上,在开发《Lintrix》游戏的过程中,重叠是个大问题,因为当场景中大多数对象移动时,很难防止它们过早碰撞。 大部分时间会出现类似这种糟糕的效果:


为了理解物体如何移动,我们添加了移动轨迹。它让敌人在晶体之间移动而不碰撞的问题更加容易避免。


它也可用于可视化晶体运动。


我们在创建关卡时使用时间控制进行“计时”。 这里的计时表示调整关卡某些部分的运动,使得在关卡运行时物体早点或晚点出现。 有时甚至希望来回移动所有的动作。 例如,在关卡开始时可以预留给玩家一些时间,以便他们能够预估将会发生的景象。 使用时间轴可以轻松地将时间移至负值,并将此新时间设为零表示开始。

因为在编辑器模式下更新时间的脚本被添加到控制时间的对象,如果想要启用或禁用对象上更改时间的效果,只需启用或禁用此脚本,并使它们响应或忽略时间的更改。

实现方法
下面我们一起来看看如何在Unity中实现该功能。

创建接口
首先创建一个非常简单的接口,让所有需要随时间变化的脚本都实现这个接口:

[AppleScript] 
纯文本查看 
复制代码
public interface ITimeChanging
{
    
void AddTime
(
float dt
)
;
}

定义时间操控实体
这个时间操控实体可以为一组实现了ITimeChanging接口的对象调用这些方法。 实体接口如下:

[AppleScript] 
纯文本查看 
复制代码
public
class
TimeManager
{
  
float Time
{
get
;
set
;
}
  
IEnumerable
<
ITimeChanging
>
TimeDependants
{
get
;
set
;
}
  
void SetTimeBruteForce
(
float time
)
;
}

在编辑器模式中,有一个可以让用户直接在运行模式下控制时间的脚本。如下图所示,你可以看到关卡控制器通过它的Update()来增加时间。


示例项目下载链接:
https://github.com/alexander91/timelineExample

为时间控制添加物体响应
我们设置了一个时间轴管理器,允许跳转到不同的时刻。 以及几个带有线性运动(LineMovement)脚本的立方体,LineMovement脚本继承自ITimeChaning,并监听TimeManager中的时间改变(AddTime),可以在监视器面板设置这个立方体以给定速度朝预定方向移动,代码如下:

[AppleScript] 
纯文本查看 
复制代码
public
class
LineMovement
:
MonoBehaviour
,
ITimeChanging
{
   
[SerializeField]
   
Vector
3
direction
=
Vector
3.
up
;
   
[SerializeField]
   
float speed
=
0.2
f;
   
public void AddTime
(
float dt
)
   
{
       
transform.
position
+
=
dt
*
speed
*
direction.normalized;
   
}
}
综上所述,编辑器自定义时间控制工具非常适用于确定性的游戏,这将让整个工作流程分外轻松。 另外,如果游戏中的动作很简单,也可以很容易在编辑器中提供各种选项。

你可能感兴趣的文章
Nexus安装搭建和上传本地jar 详细笔记
查看>>
代码质量管理-Sonar 使用手册
查看>>
搭建spring cloud oauth2.0 出现ExpressionUrlAuthorizationConfigurer already built object
查看>>
spring-kafka 出现Could not autowire. No beans of 'KafkaTemplate
查看>>
IntelliJ Idea 常用快捷键列表
查看>>
(转载)解决mydql执行sql文件时报Error: Unknown storage engine 'InnoDB'的错误。
查看>>
Hybris Commerce 使用IntelliJ IDEA时的DEBUG指南
查看>>
Kettle5.4统计各部门工资总额
查看>>
MapReduce之日志分析
查看>>
Kettle5.4利用mapreduce格式化日志(预处理)
查看>>
与你们一起的那些时光
查看>>
import和require有什么区别?export和exports呢?
查看>>
Object.create, Object.defineProperties有什么区别?
查看>>
bat脚本实现打开关闭exe应用
查看>>
oracle创建表空间、创建用户授予权限
查看>>
Java中BigDecimal类详解
查看>>
简单的带你了解Java是如何实现数据脱敏
查看>>
20个常用的IDEA快捷键分享给需要的小伙伴
查看>>
浅谈Java1.8的新特性
查看>>
带你走进iView的穿梭框
查看>>