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日

悬赏问题

  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法