时间.时间刻度不会暂停游戏



这是我正在构建的一个球赛的脚本。游戏应该在击中Time.timescale后暂停,但没有。

我需要知道我做错了什么,我需要在这里改变什么。

我是Unity和C#的初学者,所以我可能把一切都搞砸了。

如果有其他方法可以暂停游戏而不是使用Time.timescale,我也想知道。

using System.Collections;
using System.Collections.Generic;
using System.Threading;
using UnityEngine;
public class PauseScript : MonoBehaviour
{
    public bool paused = false;
    void Start()
    {
        paused = false;
        Time.timeScale = 1;
    }
    // Update is called once per frame
    public void Pause()
    {
        if (Input.GetKeyDown("p") && paused == false)
        {
            Time.timeScale = 0;
            paused = true;
        }
        if (Input.GetKeyDown("p") && paused == true)
        {
            Time.timeScale = 1;
            paused = false;
        }
    }
}

Ball.cs

using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;
public class Ball : MonoBehaviour
{  
    
    //configuration parameter
    [SerializeField] Paddle paddleInitial;
    [SerializeField] float horizontalPush = 2f;
    [SerializeField] float verticalPush = 15f;
    [SerializeField] AudioClip[] ballSounds; 
    //state parameter
    Vector2 paddleToBallVector;
    bool mouseButtonClicked = false;
    //Cached COmponent References
    AudioSource myAudioSource;
    // Start is called before the first frame update
    void Start()
    {
        paddleToBallVector = transform.position - paddleInitial.transform.position;
        myAudioSource = GetComponent<AudioSource>();
    }
    // Update is called once per frame
    void Update()
    {
        if (mouseButtonClicked == false)
        {
            stickBallToPaddle();
            launchOnMouseClick();
        }
        if (Input.GetMouseButtonDown(1))
        {
            GetComponent<Rigidbody2D>().velocity = new Vector2(horizontalPush,verticalPush);
        }
    }
    private void launchOnMouseClick()
    {
        if (Input.GetMouseButtonDown(0))
        {
            mouseButtonClicked = true;
            GetComponent<Rigidbody2D>().velocity = new Vector2(horizontalPush, verticalPush);
        }
    }
    private void stickBallToPaddle()
    {
        Vector2 paddlePosition = new Vector2(paddleInitial.transform.position.x, paddleInitial.transform.position.y);
        transform.position = paddlePosition + paddleToBallVector;
    }
    //audio settings
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (mouseButtonClicked)
        {
            AudioClip clip = ballSounds[UnityEngine.Random.Range(0, ballSounds.Length)];
           myAudioSource.PlayOneShot(clip);
        }
    }
}

存在几个潜在问题。

  1. 您的函数应该被称为Update,否则它不会每帧运行一次
  2. 如果按键已开始按下,则Input.GetKeyDown返回,但这种情况在当前帧上持续存在(它只在下一次Update调用之前重置,因此每次在同一Update功能块中调用它时都会返回true(

当您按下p时,您会检查键是否按下,然后设置暂停标志/时间刻度,但如果您在更新方法中进行另一次检查,则会执行相反的操作。

    // Update is called once per frame
    public void Pause()
    {
        // The p key is down and the game isn't paused, set timescale to 0 and paused to true...
        if (Input.GetKeyDown("p") && paused == false)
        {
            Time.timeScale = 0;
            paused = true;
        }
        // The p key is still down since we are on the same frame and paused flag is set so here we set timescale to 1 and paused to false...
        if (Input.GetKeyDown("p") && paused == true)
        {
            Time.timeScale = 1;
            paused = false;
        }
    }

您可能希望确保每次更新只运行其中一个条件,并确保该函数被称为Update,否则它不会每帧运行一次

    // Update is called once per frame
    public void Update()
    {
        if (Input.GetKeyDown("p") && paused == false)
        {
            Time.timeScale = 0;
            paused = true;
        }
        // Use else to make sure this block only gets executed if the above doesn't
        else if (Input.GetKeyDown("p") && paused == true)
        {
            Time.timeScale = 1;
            paused = false;
        }
    }

可以说,剥猫皮的方法有很多;替代代码可能看起来像这样:

public void Update()
{
    if(Input.GetKeyDown("p"))
    {
        // Toggle paused
        paused != paused;
        // Use ternary operator to save lines because making code harder to read is fun
        Time.timeScale = paused ? 0 : 1;
    }
}

--编辑:

还要确保每帧将运动等的任何矢量乘以deltaTime,否则模拟将继续。

您可能还需要显式处理其他方面的暂停,如动画等-这取决于它们的实现方式,但只要它们逐帧考虑增量,它们就会在timeScale设置为0时做出反应。

相关内容

  • 没有找到相关文章

最新更新