如何解决在 Unity 中重新加载场景后,玩家的跳跃受到影响
首先,请不要太技术化:我只学习了两个月的 Unity 编码,我不是一般的程序员!我是一个完全的初学者! :-) 所以,我正在构建一个游戏,你可以在跑步机上控制一个球,通过左右移动和跳跃来避免无尽的产卵障碍。 我在游戏结束后使用 SceneManager.LoadScene 方法设置了一个重启功能,它可以工作,但在重新加载跳跃功能后会受到影响:看起来玩家上方有一堵无形的墙阻挡了它的跳跃。而且看起来它也是一个“附加”问题:如果我死了然后重新开始,玩家跳得更少,直到它根本不跳。其他功能看起来还不错。 知道为什么会这样吗?
public class PlayerController : MonoBehavIoUr
//Jump code:
void Update()
{
if (Input.GetKeyDown(KeyCode.Space) && isOnLane)
{
Jump();
}
}
void Jump()
{
playerRb.AddForce(Vector3.up * forceMult,ForceMode.Impulse);
isOnLane = false;
}
private void OnCollisionEnter(Collision other)
{
//checks if player is touching the ground
if (other.gameObject.CompareTag("Lane"))
{
isOnLane = true;
}
}
重启代码:
public class GameManager : MonoBehavIoUr
//restart game by clicking Restart Button
public void RestartGame()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
谢谢!
解决方法
问题是当只有一个场景时会使用附加场景加载。最好将它们分成 2 个场景:
- GameManager 和 Player 对象的场景
- 正在重新加载的关卡本身的场景
这样 GameManager 就不会被重新加载,玩家也不会被重新加载。重新加载时,您需要将玩家的变量“重置”回 0 并将他移动到起始位置。
RestartGame 需要一些逻辑来重置玩家和他的物理。
public void RestartGame()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
playerController.playerRb.velocity = Vector3.zero;
playerController.playerRb.angularVelocity = Vector3.zero;
playerTransform.position = spawnLocation.tranform.position;
}
您可能想要卸载场景,等待 1 帧,然后加载场景。这样场景中的变量就可以正确重置。
public void RestartGame()
{
SceneManager.UnloadScene(scene);
playerController.playerRb.isKinematic = true; // Try setting kinematic between scenes
StartCoroutine(RestartLoad());
}
private IEnumerator RestartLoad()
{
yield return new WaitForEndOfFrame();
// Reset the player here
SceneManager.LoadScene(scene);
playerController.playerRb.isKinematic = false; // Player can use physics again
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。