C# 针对特定项目的统一C编码问题

C# 针对特定项目的统一C编码问题,c#,unity3d,C#,Unity3d,我正在使用Unity为一个学校项目制作一个简单的游戏。游戏的目的是控制一个球并捡起硬币。这个游戏有三个场景。我已经用C写了一些代码来计算我捡到的硬币,并设置了一个条件来检查是否所有硬币都捡到了,如果是,屏幕中央会出现一个wintext。 对于第一个场景lvl1,它可以正常工作,但对于其他2个场景则不行。 所有3个场景都有不同数量的硬币。C对我来说是新的,我尝试过各种组合,但都不起作用。 如何重新编写此代码,以便在每个场景/关卡上拾取正确数量的硬币后显示wintext? 这是我的代码: using

我正在使用Unity为一个学校项目制作一个简单的游戏。游戏的目的是控制一个球并捡起硬币。这个游戏有三个场景。我已经用C写了一些代码来计算我捡到的硬币,并设置了一个条件来检查是否所有硬币都捡到了,如果是,屏幕中央会出现一个wintext。 对于第一个场景lvl1,它可以正常工作,但对于其他2个场景则不行。 所有3个场景都有不同数量的硬币。C对我来说是新的,我尝试过各种组合,但都不起作用。 如何重新编写此代码,以便在每个场景/关卡上拾取正确数量的硬币后显示wintext? 这是我的代码:

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

public class PlayerController : MonoBehaviour
{

    public float speed;
    public Text countText;
    public Text winText;

    private Rigidbody rb;
    private int count;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        count = 0;
        SetCountText();
        winText.text = "";

    }

    void FixedUpdate()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);

        rb.AddForce(movement * speed);
    }

    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("Pick Up"))
        {
            other.gameObject.SetActive(false);
            count = count + 1;
            SetCountText();

        }
    }

    void SetCountText()
    {
        countText.text = "Coins: " + count.ToString();
        if (count >= 2)
        {
            winText.text = "You Win!";
        }

    }

}

此代码段将根据场景动态设置win条件,但是如果场景可以包含coinToCollect变量则更好

void SetCountText()
{
    countText.text = "Coins: " + count.ToString();
    int coinsToCollect = 0;
    switch( /* get current scene here */)
    {
        case "scene1": // repeat for other scenes
            coinsToCollect = 2;
            break;
    }
    if (count >= coinsToCollect)
    {
        winText.text = "You Win!";
    }

}

创建一个新的公共变量

...
public float speed;
public Text countText;
public Text winText;
public int numberOfCoinsToWin;
... 
记住在编辑器中为每个场景设置此新值

在您的条件下使用变量

if (count >= numberOfCoinstoWin)
{
    winText.text = "You Win!";
}
听起来你对C语言和编程缺乏基本的了解。以下是一些可以让你的生活更轻松的事情:

变量 控制流 访问修饰符 计算机科学课程 面向对象
使用Unity学习C语言也不是很好。你会错过很多基础知识。我建议在不统一的情况下学习C一两周,然后再回来

当你说它在其他场景中不起作用时,你的意思是在捡起2枚硬币后,它会触发赢的文本吗?我实际上在第一个场景中有88枚硬币,在第二个场景中有32枚,在第三个场景中有31枚。我只设定了2个硬币,这样我就不必完成整个关卡来看看它是否有效。我在第一个场景中有88个硬币,第二个场景有32个,第三个场景有31个。我只设置了2个硬币,这样我就不必完成整个关卡来看看它是否有效。你说的coinToCollect是什么意思?coinToCollect将作为每个场景需要收集的硬币数量来设置赢取条件我需要在切换参数之间写些什么,我需要在某处添加更多的东西吗else?void SetCountText{countText.text=Coins:+count.ToString;int coinsToCollect=0;切换robs\u scene\u lvl1{case robs_scene_lvl1://重复其他场景coinsToCollect=88;break;case rahils_scene_lvl2:coinsToCollect=32;break;case jonas_scene_lvl3:coinsToCollect=31;break;}如果count>=coinsToCollect{winText.text=You Win!;}}}使用switch语句只会无缘无故地给你的生活带来困难,只是为了给storm所说的话添加一些东西,如果我没有弄错unity,你实际上需要将变量设置为[Serializable]为了能够从编辑器中设置它们,仅当它们是私有的。如果它们是公共变量,它们已经可以序列化。因此,我建议OP研究访问修饰符。否如果创建类,则需要将其标记为[serializable]就像nalnpir说的,除非你提到scriptableobjects,但那是另一回事了,这确实是为了让私有变量出现在inspector中。@StormMuller,C不是我课程的一部分。我们现在在Unity上有一个为期一个月的课程,但我下周就要开始学习Java了。再次,非常感谢=@immoritary这是一种单一行为,您不需要将其标记为可序列化