网站公告 | 全新unity3d 完整学习路线,最强课程配套、服务!详情点击
查看: 10167|回复: 18
收起左侧

[图文教程] Unity3d教程:如何实现时间倒退效果

  [复制链接]

[图文教程] Unity3d教程:如何实现时间倒退效果  [复制链接]

silujc 发表于 2018-1-12 16:57:43 [显示全部楼层] |只看大图 回帖奖励 |倒序浏览 |阅读模式 回复:  18 浏览:  10167
有一些游戏提供了回退的功能,在游戏开发中如何实现时间倒退这个效果呢,可能有人不知道怎么操作,为此下面unity 3D培训班就给大家介绍下实现时间倒退效果的方法。
  一个简单的思路就是用Stack来记录物体的Position和Rotation,当需要时间回退的时候就Pop出来,赋值到物体上。不过为了可以进行拓展,比如只能回退到某段时间内的,而不是一下子回退到最开始的地方,我们需要剔除太久之前的信息。如下图:
DSC0000.jpg
  因此这里选择使用List而不是Stack。
  代码(完整代码在最下面
  
[C#] 纯文本查看 复制代码
//Pos[/align]  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,我们每帧都存储物体的位置。
  当我们需要时间回退时,可以每帧调用下面的代码:
  if (HistoryPos.Count > 0)
  {
  int index = HistoryPos.Count - 1;
  this.transform.position = HistoryPos[index];
  HistoryPos.RemoveAt(index);
  }
  这就是每次取出最后的位置(即最新的),赋值到物体上
  当我们需要限制时间回退的时间跨度,可以在HistoryPos.Add后加上下面这些代码:
  HistoryPos.Add(pos);
  if (ShouldLimit && HistoryPos.Count > Limit)
  {
  HistoryPos.RemoveAt(0);
  }

  因为旋转是雷同的,因此就不贴代码出来了。
  改进
  1.这里我们是每帧都记录下信息,这样List的大小很容易暴走,因此我们可以每隔一段时间来记录,然后要时间回退的时候就进行插值。
  2.通常我们的物体都带有动画,这时倒播动画就行。如果在时间回退过程中存在多个动画,我们就需要自己设计数据结构来保存某个时刻对应的动画和动画状态。
  完整代码
  
[C#] 纯文本查看 复制代码
using UnityEngine;
  using System.Collections;
  using System.Collections.Generic;
  ///
  /// 就是利用Stack的原理来获取历史位置
  /// 如果同时有动画,把动画倒放就是
  ///
  public class TBPlayer : MonoBehaviour {
  public int Speed = 3;
  public int RotateSpeed = 100;
  public bool ShouldLimit = false;
  public int Limit = 100; //可以存放的坐标上限
  private List HistoryPos;
  private List HistoryRot;
  private bool _IsTimeBack = false;
  void Start () {
  HistoryPos = new List();
  HistoryRot = new List();
  }
  void Update () {
  if (_IsTimeBack)
  TimeBack();
  else
  ControlPos();
  }
  void ControlPos()
  {
  //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);
  //Rotation
  Quaternion rot = this.transform.rotation;
  Vector3 rotv = rot.eulerAngles;
  float rotate = Input.GetAxis("Fire1");
  if (Mathf.Abs(rotate) > 0.0001f)
  {
  rotv.z += Time.deltaTime * rotate * RotateSpeed;
  }
  rot = Quaternion.Euler(rotv);
  this.transform.rotation = rot;
  HistoryRot.Add(rot);
  if (ShouldLimit && HistoryPos.Count > Limit)
  {
  HistoryPos.RemoveAt(0);
  HistoryRot.RemoveAt(0);
  }
  }
  void TimeBack()
  {
  if (HistoryPos.Count > 0)
  {
  int index = HistoryPos.Count - 1;
  this.transform.position = HistoryPos[index];
  HistoryPos.RemoveAt(index);
  }
  if (HistoryRot.Count > 0)
  {
  int index = HistoryRot.Count - 1;
  this.transform.rotation = HistoryRot[index];
  HistoryRot.RemoveAt(index);
  }
  }
  void OnGUI()
  {
  if (GUILayout.Button("时间倒流"))
  {
  _IsTimeBack = true;
  }
  if (GUILayout.Button("Reset"))
  {
  HistoryRot.Clear();
  HistoryPos.Clear();
  _IsTimeBack = false;
  }
  }
  }
  最终完成的效果,更多U3D教程请到丝路教程网学习:http://blog.silucg.com/manew/article-7783.html
DSC0001.gif

评分

参与人数 1泰斗币 +20 收起 理由
泰课_robin + 20 为您的才华点赞

查看全部评分

+1
10179°C
18
  • 泰课_robin
  • 茶LZJE
  • bloodypanda
  • haierjodn
  • daddybear
过: 他们
因分享而快乐,学习以自强!
泰课_robin 发表于 2018-1-12 17:22:03 显示全部楼层
分享很给力
来自苹果客户端来自苹果客户端
因分享而快乐,学习以自强!
茶LZJE 发表于 2018-1-12 18:16:49 显示全部楼层
分享很给力因分享而快乐,学习以自强!
因分享而快乐,学习以自强!
bloodypanda 发表于 2018-1-12 19:41:48 显示全部楼层
谢谢分享,为你点赞
因分享而快乐,学习以自强!
haierjodn 发表于 2018-1-12 20:57:07 显示全部楼层
疑是地上霜,床前明月光
因分享而快乐,学习以自强!
daddybear 发表于 2018-1-13 06:50:51 显示全部楼层
分享很给力因分享而快乐,学习以自强!
因分享而快乐,学习以自强!
瓦片 发表于 2018-1-14 22:56:59 显示全部楼层
很经典的教程,谢谢分享
因分享而快乐,学习以自强!
1151458336 发表于 2018-1-15 11:14:37 显示全部楼层
如果是特效呢怎么回放
因分享而快乐,学习以自强!
anmie7723 发表于 2018-1-21 12:20:29 显示全部楼层
路过看看感谢分享
因分享而快乐,学习以自强!
DieNacht 发表于 2018-1-29 17:25:00 显示全部楼层
很给力
因分享而快乐,学习以自强!
2919974371 发表于 2018-1-31 10:05:26 显示全部楼层
谢谢分享,为你点赞
因分享而快乐,学习以自强!
tmp2go 发表于 2018-2-5 20:28:55 显示全部楼层
非常棒的特效,感谢分享
因分享而快乐,学习以自强!
零点_LCHJ 发表于 2018-2-11 17:02:07 显示全部楼层
分享很给力因分享而快乐,学习以自强!
因分享而快乐,学习以自强!
泛泛在上 发表于 2018-3-15 10:48:10 显示全部楼层
分享很给力因分享而快乐,学习以自强!
因分享而快乐,学习以自强!
irics123 发表于 2018-3-31 18:26:55 显示全部楼层
嗯哈?
因分享而快乐,学习以自强!
12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

VR/AR版块|Unity3d|Unreal4|新手报道|小黑屋|站点地图|沪ICP备14023207号-9|【泰斗社区】-专注互联网游戏和应用的开发者平台 ( 浙ICP 备 13006852号-15 )|网站地图

© 2001-2013 Comsenz Inc.  Powered by Discuz! X3.4

1
QQ