darkhug 2023-03-29 16:47 采纳率: 100%
浏览 18
已结题

Unity时间回溯问题有bug

unity中时间回溯问题,当我回溯到最初位置时,物体却没有静止,而是随着重力下降,求帮忙解决一下

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TimeBack : MonoBehaviour
{
    public class TimeBack1 // 定义了一个嵌套类 TimeBack1
    {
        public Vector2 position; // 定义了一个 Vector2 类型的 position 变量
        public Quaternion rotation; // 定义了一个 Quaternion 类型的 rotation 变量

        public TimeBack1(Vector2 position, Quaternion rotation) // 定义了 TimeBack1 类的构造函数,接受两个参数 position 和 rotation
        {
            this.position = position; // 将传入的 position 参数赋值给当前实例的 position 变量
            this.rotation = rotation; // 将传入的 rotation 参数赋值给当前实例的 rotation 变量
        }
    }
 
    private List<TimeBack1> timeBackList = new List<TimeBack1>();
    public float RecordTime = 50f;
    private bool _isRewarding = false;
    private Rigidbody2D rb;

    private void Awake()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            StartReward();
        }
        if (Input.GetMouseButton(1))
        {
            StopReward();
        }
    }

    private void FixedUpdate()
    {
        if (_isRewarding)
        {
            Reward();
        }
        else
        {
            Record();
        }
    }

    private void Record() // 定义了一个 Record() 方法,用于记录当前物体的位置和旋转信息
    {
        if (timeBackList.Count > Mathf.Round(RecordTime / Time.deltaTime)) // 如果时间回放列表中的数据数量大于“记录时间除以帧率”后的结果
        {
            timeBackList.RemoveAt(timeBackList.Count - 1); // 移除列表中的最后一个(时间最久远的)元素
        }
        timeBackList.Insert(0, new TimeBack1(transform.position, transform.rotation)); // 在列表的开头插入一个新的元素,存储当前物体的位置和旋转信息
    }
    private void StartReward()
    {
        _isRewarding = true;
        rb.gravityScale = 0;
        rb.isKinematic = true;
    }

    private void StopReward()
    {
        _isRewarding = false;
        rb.gravityScale = 1;
        rb.isKinematic = false;
    }
    private void Reward()
    {
        if (timeBackList.Count > 0)
        {
            TimeBack1 information = timeBackList[0];
            transform.position = information.position;
            transform.rotation = information.rotation;
            timeBackList.RemoveAt(0);
        }
    }
}


  • 写回答

1条回答 默认 最新

  • 於黾 2023-03-29 16:59
    关注

    时间回溯的过程中,先把物理脚本停了
    等全部回溯完了再开
    否则一边回溯一边还要碰撞+往下掉,不乱了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月6日
  • 已采纳回答 3月29日
  • 创建了问题 3月29日

悬赏问题

  • ¥15 (标签-STM32|关键词-智能小车)
  • ¥20 关于#stm32#的问题,请各位专家解答!
  • ¥15 (标签-python)
  • ¥15 第一个已完成,求第二个做法
  • ¥20 搭建awx,试了很多版本都有错
  • ¥15 java corba的客户端该如何指定使用本地某个固定IP去连接服务端?
  • ¥15 activiti工作流问题,求解答
  • ¥15 有人写过RPA后台管理系统么?
  • ¥15 Bioage计算生物学年龄
  • ¥20 如何将FPGA Alveo U50恢复原来出厂设置哇?