【Unity】通过实时记录模拟时间倒退效果回放

zz/2024/4/13 13:58:34
有一些游戏提供了回退的功能,那么在游戏开发中如何实现时间倒退这个效果呢,相信会有很多人想知道,为此下面就给大家介绍下实现时间倒退效果的方法,一起来看看吧。
一个简单的思路就是用Stack来记录物体的Position和Rotation,当需要时间回退的时候就Pop出来,赋值到物体上。不过为了可以进行拓展,比如只能回退到某段时间内的,而不是一下子回退到最开始的地方,我们需要剔除太久之前的信息。如下图:
Unity如何实现时间倒退效果  
因此我选择使用List而不是Stack。
代码(完整代码在最下面)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Pos
Vector3 pos = this .transform.position;
float horizontal = Input.GetAxis( "Horizontal" );
float vertical = Input.GetAxis( "Vertical" );
 
if (Mathf.Abs(horizontal) > 0.0001f) //左右移动
{
     pos.x += Time.deltaTime * horizontal * Speed;
}
if (Mathf.Abs(vertical) > 0.0001f) //上下移动
{
     pos.y += Time.deltaTime * vertical * Speed;
}
this .transform.position = pos;
 
HistoryPos.Add(pos);
这里HistoryPos就是我们用来存储历史位置的List,我们每帧都存储物体的位置。
当我们需要时间回退时,可以每帧调用下面的代码:
1
2
3
4
5
6
if (HistoryPos.Count > 0)
{
     int index = HistoryPos.Count - 1;
     this .transform.position = HistoryPos[index];
     HistoryPos.RemoveAt(index);
}
这就是每次取出最后的位置(即最新的),赋值到物体上
当我们需要限制时间回退的时间跨度,可以在HistoryPos.Add后加上下面这些代码:
1
2
3
4
5
6

http://www.ngui.cc/zz/2700349.html

相关文章

【Lua】特性和一些基础语法总结(Lua入门到精通一)

Lua的语法基础比较简单,比较容易上手,下面总结一些学习过程中的Lua语法基础。 Lua优点及特性 Lua 是一个小巧的脚本语言。 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua…

【Unity】UI界面的热更新技术 FairyGUI的使用流程

需求环境 通常在项目中我们会使用MVC的方式去构建界面框架,而以往我们也会使用NGUI,UGUI,或者DaikonGUI等等方案去实现界面的搭建。 这些UI方案各有优点,也都适用于我们的工程,但在实际项目中,热更新的逻辑代码意味着游戏界面也需要热更新,如果能有一种界…

K-means算法补充:K-means++

K-means算法是机器学习经典算法之一,对于机器学习的初学者来说,最先接触的应该就是该算法,对于K-means算法思想都已经很熟悉了,本文主要介绍K-means聚类中心的初始化。 K-means算法对聚类中心的初始化比较敏感,不同的初始值会带来不同的聚类结果。在标准的K-means算法中,…

疯狂地学习C语言

一个月疯狂的学习《C程序设计题解与上机指导》。

最短路径Dijkstra算法(JAVA)

/* * Graph.java */ class Vertex { public char label; public boolean isInTree; public Vertex(char label) { this.label label; isInTree false; } } //sPath[]用来存储父节点和距离。 class DistPare { public int parentVertex; public int distance; public Dist…

五台归来

五台之旅结束,学习之。 2009.5.27~2009.6.13作息时间表: 7:00起床 7:30~8:50图书馆:算法、数据结构、JAVA程序员宝典 9:00~12:00办公室:WSN 12:30~14&…

PL/SQL 调试存储过程(报错ora-01036 非法的变量名/编号)

存储过程: create or replace procedure zhanshi(v_pid article.pid%type) is cursor c is select * from article where pid v_pid;begin for v_article in c loop dbms_output.put_line(v_article.cont); if (v_article.isleaf 0) then zhansh…

Arduino+WZ指令+Onenet

title: ArduinoWZ指令Onenet tags: Onenet date: 2019-02-24 00:53:00 视频演示: src"//player.bilibili.com/player.html?aid44421747&cid77777406&page1" scrolling"yes" border"0" allowfullscreen"true"> …

一行代码完成485通讯与数据回传以及CRC校验

title: 一行代码完成485通讯与数据回传以及CRC校验 tags: STM32 date: 2019-03-16 21:10:00 由于工作需要,我对现有的485通讯方式进行了一个总结,同时也包含自己原创的一些算法来快速实现485通讯与CRC校验,以及返回值的处理 看下效果&#xf…