在Unity中增加点数和重置点数游戏脚本

increase points and reset points game script in Unity

我正在用 unity 写一个 2D 游戏。我创建了一个用于增加点数并将点数重置为零的函数。

问题是,每当我输掉比赛并击中 "play again," 时,pointsballSpeed 从我输掉的地方的相同值开始。我想让他们重置。

这是我的代码:

shooterMain.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public static class shooterMain {
public enum ShooterStatenum{shielded,Vulnerable};

private static float ballSpeed = 2;
private static int points = 0;
private static int lives = 0;
public static ShooterStatenum shooterState = ShooterStatenum.Vulnerable;

public static float getBallSpeed ()
{
    return ballSpeed;
}

public static void IncreaseSpeed()
{
    ballSpeed += 0.2f;
}

public static void increasePoint()
{
    points++;
}

public static void ResetSpeed()
{
    return ballSpeed;
}

public static void ResetPoint()
{
    return points;
}

public static int getPoints()
{
    return points;
}

public static int getLives(){

    return lives;

}

public static void addLives(){

    lives++;

}

coinhandler.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class coinhandler : MonoBehaviour {

public Transform particles;
// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

}

void OnCollisionEnter2D (Collision2D collider)
{
    if (collider.gameObject.tag == "Player") 
    {
        Instantiate (particles, new Vector3 (transform.position.x, transform.position.y, -0.2f), Quaternion.identity);
        shooterMain.getBallSpeed ();
        shooterMain.getPoints ();
        GameObject.FindWithTag ("points").GetComponent<Text>().text = shooterMain.getPoints ().ToString ();  
        Destroy (gameObject);
    }
}

bombHandler.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class bombHandler : MonoBehaviour {

public Transform particles;

// Use this for initialization
void Start () {
    Destroy (gameObject, 6f);
}

void OnCollisionEnter2D (Collision2D collider)
{
    if (collider.gameObject.tag == "Player") 
    {
        Instantiate (particles, new Vector3 (transform.position.x, transform.position.y, -0.2f), Quaternion.identity);
        Destroy (gameObject);
        if (shooterMain.getLives () == 0 && shooterMain.shooterState == shooterMain.ShooterStatenum.Vulnerable) 
        {
            //shooterMain.getLives (0);
            shooterMain.ResetSpeed ();
            shooterMain.ResetPoint ();
            GameObject.FindWithTag ("points").GetComponent<Text>().text = shooterMain.getPoints ().ToString ();
            SceneManager.LoadScene (0);
        }
    }
}

// Update is called once per frame
void Update () {

}
}

正如 'Programmer' 已经评论过的(抱歉,没有足够的声誉来评论),您必须在各自的方法中实际重置静态变量。你返回了变量 - 我不知道你使用的是什么编辑器/编译器,但是任何 Visual Studio 版本因为......永远......不会编译它。

无论如何,将您的代码替换为:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public static class shooterMain {
public enum ShooterStatenum{shielded,Vulnerable};

private static float ballSpeed = 2;
private static int points = 0;
private static int lives = 0;
public static ShooterStatenum shooterState = ShooterStatenum.Vulnerable;

public static float getBallSpeed ()
{
    return ballSpeed;
}

public static void IncreaseSpeed()
{
    ballSpeed += 0.2f;
}

public static void increasePoint()
{
    points++;
}

public static void ResetSpeed()
{
    ballSpeed = 2;
}

public static void ResetPoint()
{
    points = 0;
}

public static int getPoints()
{
    return points;
}

public static int getLives(){

    return lives;

}

public static void addLives(){

    lives++;

}

是的,'Programmer' 将 class 设为单例是正确的,但我认为这对学习者来说有点过分,所以暂时忽略它。

GameObject.FindWithTag ("points").GetComponent().text = "0"

在 coinhandler.cs 的 Start() 中......这将是最简单的解决方案!第一次呈现硬币处理程序时,它将使分数为零,并且您已经在 perFrame 工作方法中使用 onCollision 对其进行了更新..对于初学者来说做得很好..快乐狩猎

正如程序员在评论中提到的,您应该简单地添加一个方法来将您想要重置的每个变量重置为其默认值。

这里没有什么大问题,最难的部分可能是找到您要重置的所有变量。

public static void Reset ()
{
    ballSpeed = 0;
    lives = 2;
    points = 0;
}

另一件需要提及的事情是,您的代码可能甚至无法编译,因为您的 ResetPointsResetSpeed 方法是 return void,这意味着他们return 什么都没有。您不能执行 return lives;,因为那样会告诉方法 return 为整数,而不是空值。

您可能对 return 的作用感到困惑。 return 退出当前正在执行的方法,同时将值传递回调用方法的位置。如果该方法是 int 类型,则此值将是一个整数,如果它是 void 类型,则根本不会 return 一个值。


如果您理解所有这些并且对进一步改进您的代码有信心,您应该将您的 shooterMain class 实现为 singleton。这将确保它始终只有一个实例,这在处理只应存在一次的变量时很有用。