Unity c#检查玩家(Rigidbody2D)是否停止移动x秒

本文关键字:移动 是否 检查 玩家 Rigidbody2D Unity | 更新日期: 2023-09-27 18:10:05

我正在编写一个脚本,所以我可以检测到玩家在x秒内没有移动,并相应地加载另一个场景。

如果玩家在x秒后再次开始移动,那么加载另一个场景不应该被调用。

我试过使用isSleeping函数,并通过包含WaitForSeconds的协程来延迟它,但它仍然每帧检查Rigidbody2D。是否有其他方法可以检查Rigidbody2D是否在x秒内没有移动,然后加载游戏到关卡,否则继续像以前一样移动?

 using UnityEngine;
 using System.Collections;
 public class PlayerStop : MonoBehaviour {

     void Update() {
         if (GetComponent<Rigidbody2D>().IsSleeping()) {
             Application.LoadLevel(2);
         }
     }
 }

此外,我还有一个脚本,它使我能够绘制线条(用鼠标)并停止玩家的移动,然而线条在x秒后消失。例如,如果我设置线条在1秒后消失,我想检查Rigidbody2D是否停止移动2秒,然后加载游戏场景。否则什么也不做,因为Rigidbody2D会在line消失后继续移动。

Unity c#检查玩家(Rigidbody2D)是否停止移动x秒

试试这个

using UnityEngine;
using System.Collections;
public class PlayerStop : MonoBehaviour {
    float delay = 3f;
    float threshold = .01f;
    void Update() {
        if (GetComponent<Rigidbody2D>().velocity.magnitude < threshold * threshold)
            StartCoRoutine("LoadTheLevel");
    }
    IEnumerator LoadTheLevel()
    {
        float elapsed = 0f;
        while (GetComponent<Rigidbody2D>().velocity.magnitude < threshold * threshold)
        {
            elapsed += Time.deltaTime;
            if(elapsed >= delay)
            {
                Application.LoadLevel(2);
                yield break;
            }
            yield return null;
        }
        yield break;
    }
}

你可以试试这个…我现在无法测试这个,所以可能需要一点调整…

首先是一些私有变量:

private float _loadSceneTime;
private Vector3 _lastPlayerPosition;
private float _playerIdleDelay;

Update方法中检查玩家是否移动:

private void Update()
{
    //  Is it time to load the next scene?
    if(Time.time >= _loadSceneTime)
    {
        //  Load Scene
    }
    else
    {
        //  NOTE: GET PLAYERS POSITION...THIS ASSUMES THIS 
        //  SCRIPT IS ON THE GAME OBJECT REPRESENTING THE PLAYER
        Vector3 playerPosition = this.transform.position;
        //  Has the player moved?
        if(playerPosition != _lastPlayerPosition)
        {
            //  If the player has moved we will attempt to load 
            //  the scene in x-seconds
            _loadSceneTime = Time.time + _playerIdleDelay;
        }
        _lastPlayerPosition = playerPosition;
    }
}