使用Unity实现时光倒流

首先声明,博主Unity版本为5.4.4

在游戏中加入时光逆流可以衍生出很多有趣的事,独立游戏《时空幻境》里面就有这个功能,这篇文章就是模拟时光逆流


首先简单的搭建一下场景

这里写图片描述

这里就是拿cube堆出了大方块

这里写图片描述

所有的cube都添加刚体,脚本后面附上

这里写图片描述

把bomb摆到cube中间


上代码:

using UnityEngine;
using System.Collections;

public class Bomb : MonoBehaviour {

    public float radius = 5.0f;//爆炸半径
    public float power = 10;//爆炸力
    public float explosiveLift = 1.0f;//从下方多少距离施加力


    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        if (Input.GetKeyDown (KeyCode.Space))
            Fire ();
    }

    private void Fire(){
        Vector3 pos = transform.position;
        Collider[] colliders = Physics.OverlapSphere (pos,radius);
        foreach (var hit in colliders) {
            if (hit.GetComponent<Rigidbody> ()) {
                hit.GetComponent<Rigidbody> ().AddExplosionForce (power,pos,radius,explosiveLift);
            }
        }
    }
}
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class TimeBack : MonoBehaviour {

    public bool isRewinding = false;//用来判断是否需要时光逆流
    public float recordTime;//时光逆流时间

    private List<Information> informations;
    private Rigidbody rb;

    // Use this for initialization
    void Start () {
        rb = GetComponent<Rigidbody> ();
        informations = new List<Information> ();
    }

    // Update is called once per frame
    void Update () {
        //按下shift开始时光倒流
        if (Input.GetKeyDown (KeyCode.LeftShift)) {
            StartRewind ();
        }
        //松开时停止
        if (Input.GetKeyUp (KeyCode.LeftShift)) {
            StopRewind ();
        }
    }

    void FixedUpdate(){
        if (isRewinding)
            Rewind ();
        else
            Record ();

    }

    /// <summary>
    /// 开始时光逆流
    /// </summary>
    private void StartRewind(){
        isRewinding = true;
        rb.isKinematic = true;//使物体不受力
    }

    /// <summary>
    /// 停止时光逆流
    /// </summary>
    private void StopRewind(){
        isRewinding = false;
        rb.isKinematic = false;//物体开始受力
    }

    /// <summary>
    /// 时光逆流
    /// </summary>
    private void Rewind(){
        //记录点数量大于0时才可以倒流
        if (informations.Count >0) {
            Information information = informations [0];
            transform.position = information.position;
            transform.rotation = information.rotation;
            informations.RemoveAt (0);
        }
    }

    /// <summary>
    /// 记录物体的信息
    /// </summary>
    private void Record(){
        if (informations.Count > Mathf.Round (recordTime / Time.fixedDeltaTime)) {
            informations.RemoveAt (informations.Count-1);
        }
        informations.Insert (0,new Information(transform.position,transform.rotation));
    }
}
using System;
using UnityEngine;

/// <summary>
/// 记录物体的位置跟旋转信息,用于实现时光倒流的技能
/// </summary>
public class Information{
    public Vector3 position;
    public Quaternion rotation;
    public Information (Vector3 _position,Quaternion _rotation)
    {
        position = _position;
        rotation = _rotation;
    }
}

最后的效果的话,博主不会录gif所以,喜欢的自己去试吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值