我正在写一个统一的2D游戏。我创建了一个增加点数并将点重置为零的函数。
问题在于,每当我输掉游戏并再次“再次播放”时,ballSpeed
和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++;
}
都会从我丢失的相同值开始。我希望他们重置。
这是我的代码:
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}}
答案 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;
}
另外需要提及的是,您的代码可能甚至无法编译,因为您的ResetPoints
和ResetSpeed
方法返回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更新了它。为一个初学者做了一个很好的工作..快乐狩猎