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

时间:2018-01-19 10:29:47

标签: c# unity3d unity5

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

问题在于,每当我输掉游戏并再次“再次播放”时,ballSpeedusing 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++; } 都会从我丢失的相同值开始。我希望他们重置。

这是我的代码:

shooterMain.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);
    }
}

coinhandler.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 () {

}
}

bombHandler.cs

{{1}}

3 个答案:

答案 0 :(得分:3)

由于'程序员'已经评论过(抱歉,没有足够的声誉来评论),你必须在相应的方法中重新设置静态变量。您返回了变量 - 而且我不知道您使用的是哪个编辑器/编译器,但是任何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++;

}

是的,'程序员'对于制作单身单身是正确的,但我认为这对学习者来说有点太多了,所以现在就忽略它。

答案 1 :(得分:3)

正如程序员在评论中提到的那样,您只需添加一个方法,将要重置的每个变量重置为默认值。

这里没有大的复杂因素,最困难的部分可能是找到你要重置的所有变量。

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

另外需要提及的是,您的代码可能甚至无法编译,因为您的ResetPointsResetSpeed方法返回void,这意味着它们返回没什么。你不能做return lives;,因为这会告诉方法以整数形式返回,而不是虚空。

你可能会对return的所作所为感到困惑。 return退出当前正在执行的方法,同时将值传递回调用方法的位置。如果方法的类型为int,则此值将为整数,如果类型为void,则它将不会返回任何值。

如果您理解了这一切并对进一步改进代码充满信心,那么您应该将shooterMain课程设为singleton。这将确保始终只有一个实例,这在处理只应存在一次的变量时非常有用。

答案 2 :(得分:1)

GameObject.FindWithTag(&#34; points&#34;)。GetComponent()。text =&#34; 0&#34;

在coinhandler.cs的Start()中的

..这将是最简单的解决方案!第一次当硬币处理程序被渲染时,它会将得分归零,并且你已经在perFrame工作方法中使用onCollision更新了它。为一个初学者做了一个很好的工作..快乐狩猎