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

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日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改