微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Unity 中重新加载场景后,玩家的跳跃受到影响

如何解决在 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 举报,一经查实,本站将立刻删除。