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消失后继续移动。
试试这个
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;
}
}