Unity - 我的数组没有更新它的元素

时间:2018-01-24 16:51:41

标签: arrays unity3d elements updating

我正在Unity制作我的第一个应用程序来学习英语单词而且我被卡住了。 我创建了这样的数组:

public string[] words = {
    "apple",
    "banana",
    "big",
    "blue",
    "book",
    "one",
    "two"
};

我正在使用PlayerPrefs来保存我正在学习的数组元素。 问题是我无法在此数组中添加或删除元素。无论我做什么,它总是显示这7个元素。 你能告诉我为什么吗?

问题是我不想动态添加元素或在脚本中添加元素。我只是想通过添加更多元素手动扩展我的数组,如下所示:

public string[] words = {
    "apple",
    "banana",
    "big",
    "blue",
    "book",
    "one",
    "two",
    "colours",
    "green",
    "orange",
    "pencil",
    "yellow",
    "four",
    "five",
    "six",
    "small",
};

事情是,在将数组从我的第一篇文章更改为此文章后,更改不起作用。程序仍然只看到7个元素。 我试图删除一些元素,结果是一样的。它看起来像程序将我的数组保存在内存中......或者什么......

这是我的完整代码:

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

public class GameManager : MonoBehaviour {

    public static GameManager instance;
    public bool isLearnOn;
    public bool isFrontMenuActive;
    public GameObject frontMenuEmpty;
    Animator frontMenu;
    Animator finishPanel;

    //Tasks Elements
    Image taskImage;
    GameObject taskImageEmpty;
    GameObject taskAllElementsEmpty;
    GameObject taskTextEmpty;
    Text taskText;
    InputField taskInputField;
    AudioSource taskAudio;
    int randomWord;
    int wordCount;
    int allWordsCount;
    int collectPoint;
    Text pointsBoard;
    Text hint;
    public bool isHintShown;
    GameObject hintTextEmpty;
    int innerTaskCount;
    public bool isFinishPanelOn;



    void Awake(){
        if (instance == null) {
            instance = this;
        }
    }

    void Start () {
        collectPoint = (PlayerPrefs.GetInt ("points"));
        isLearnOn = false;
        //Variable assignment
            //Tasks Elements 
        taskAllElementsEmpty = GameObject.Find ("TaskAllElementsEmpty");
        taskImage = GameObject.Find ("TaskImage").GetComponent <Image>();
        taskTextEmpty = GameObject.Find ("TaskTextEmpty");
        taskText = GameObject.Find ("TaskText").GetComponent <Text>();
        taskInputField = GameObject.Find ("TaskInputField").GetComponent <InputField>();
        taskAudio = GameObject.Find ("GameManager").GetComponent <AudioSource>();
        pointsBoard = GameObject.Find ("PointsBoard").GetComponent <Text>();
        hint = GameObject.Find ("Hint").GetComponent <Text>();
        hintTextEmpty = GameObject.Find ("HintTextEmpty");
        finishPanel = GameObject.Find ("FinishPanel").GetComponent <Animator>();
        taskImageEmpty = GameObject.Find ("TaskImageEmpty");

        frontMenuEmpty = GameObject.Find ("FrontMenuEmpty");
        frontMenu = GameObject.Find ("FrontMenuEmpty").GetComponent <Animator>();

        pointsBoard.text = collectPoint.ToString ();

        allWordsCount = words.Length;
        Debug.Log (allWordsCount);

        isFrontMenuActive = false;

        FrontMenuShowHide ();
        taskAllElementsEmpty.SetActive (false);
        isHintShown = false;
        hint.text = "";
        innerTaskCount = 0;
        isFinishPanelOn = false;
        //TODO  Disable finisih panel


    }


    void Update () {
        if (isLearnOn == true) {
            if (wordCount < allWordsCount) {
                if  ((taskInputField.text == words [wordCount]) && innerTaskCount == 0) {
                    Task1 ();
                    taskText.text = "";
                    taskInputField.placeholder.GetComponent<Text>().text = "What is it?";
                    innerTaskCount = 1;

                } 
                else if  ((taskInputField.text == words [wordCount]) && innerTaskCount == 1) {
                    Task1 ();
                    taskText.text = "";
                    taskInputField.placeholder.GetComponent<Text>().text = "Listen and type the word down";
                    taskImageEmpty.SetActive (false);
                    innerTaskCount = 2;
                }

                else if ((taskInputField.text == words [wordCount]) && innerTaskCount == 2){
                    if (isHintShown == false) {
                        CollectPoints ();
                        NextTask ();
                        Debug.Log (wordCount);
                        innerTaskCount = 0;
                    } else {
                        NextTask ();
                        innerTaskCount = 0;
                    }
                }
            } else {

                if(isFinishPanelOn == false){
                    HideFinishPanel ();
                    wordCount = 0;
                }


            }

        } else {
            if (taskInputField.text == words [randomWord]) {

                if (isHintShown == false) {
                    CollectPoints ();
                    RandomTask ();
                } else {
                    RandomTask ();
                }
            }
        }

    }

    public void FrontMenuShowHide(){
        if (isFrontMenuActive == true) {
            frontMenu.Play ("FrontMenuOut");
            isFrontMenuActive = false;
        } else {
            frontMenu.Play ("FrontMenu");
            isFrontMenuActive = true;

        }
    }



    public void Task1(){
        isHintShown = false;
        wordCount = (PlayerPrefs.GetInt ("wordCountPrefs"));
        taskAllElementsEmpty.SetActive (true);
        taskText.text = words[wordCount];
        taskInputField.text = "";
        taskInputField.ActivateInputField ();
        //SoundPlay ();
        LoadPicture ();
        taskTextEmpty.SetActive (true);
        hint.text = "";
        taskInputField.placeholder.GetComponent<Text>().text = "Copy the word, please...";
        string path = "audio/" + words [wordCount];
        taskAudio.clip = (AudioClip)Resources.Load(path, typeof(AudioClip));
        taskAudio.Play ();
        taskImageEmpty.SetActive (true);
    }

    public void RandomTask(){
        isHintShown = false;
        randomWord = Random.Range (0, allWordsCount);
        taskAllElementsEmpty.SetActive (true);
        taskText.text = words[randomWord];
        taskInputField.text = "";
        taskInputField.ActivateInputField ();
        //SoundPlay ();
        LoadRandomPicture ();
        taskTextEmpty.SetActive (false);
        hint.text = "";
        taskImageEmpty.SetActive (true);
        taskInputField.placeholder.GetComponent<Text>().text = "What is it?";
        string path = "audio/" + words [randomWord];
        taskAudio.clip = (AudioClip)Resources.Load(path, typeof(AudioClip));
        taskAudio.Play ();
    }


    public void SoundPlay(){
        if (isLearnOn == true) {
            string path = "audio/" + words [wordCount];
            taskAudio.clip = (AudioClip)Resources.Load(path, typeof(AudioClip));
            taskAudio.Play ();
        } else {
            string path = "audio/" + words [randomWord];
            taskAudio.clip = (AudioClip)Resources.Load(path, typeof(AudioClip));
            taskAudio.Play ();
        }

    }

    public void LoadPicture(){
        string path = "img/" + words [wordCount];
        taskImage.sprite = (Sprite)Resources.Load(path, typeof(Sprite));
    }


    public void LoadRandomPicture(){
        string path = "img/" + words [randomWord];
        taskImage.sprite = (Sprite)Resources.Load(path, typeof(Sprite));
    }

    public void NextTask(){
        wordCount++;
        PlayerPrefs.SetInt ("wordCountPrefs", wordCount);
        Task1 ();
    }


    public void LearnIsOn(){
        isLearnOn = true;
    }
    public void LearnIsOff(){
        isLearnOn = false;
    }

    public void CollectPoints(){
            collectPoint++;
            PlayerPrefs.SetInt ("points", collectPoint);
            pointsBoard.text = collectPoint.ToString ();
    }

    public void ShowHint(){

        if (isLearnOn == true ) {
            if (innerTaskCount != 0){
                hint.text = words [wordCount];
                isHintShown = true;
            }

        } else {
            hint.text = words [randomWord];
            isHintShown = true;

        }
    }

    public void HideFinishPanel(){
        if (isFinishPanelOn == true) {
            finishPanel.Play ("FinishPanelOut");
            isFinishPanelOn = false;
        } else {
            finishPanel.Play ("FinishPanel");
            isFinishPanelOn = true;
        }


    }



    public string[] words = {
        "apple",
        "banana",
        "big",
        "blue",
        "book",
        "one",
        "two",
        "colours",
        "green",
        "orange",
        "pencil",
        "yellow",
        "four",
        "five",
        "six",
        "small",
    };

}

`

3 个答案:

答案 0 :(得分:1)

您需要使用list代替数组。列表允许您添加或删除任何项目。

 List <string> names = new List<string>();

 Void Start()
    {
          names.Add(“apple”); 

  }

答案 1 :(得分:1)

这是因为Unity初始化了序列化的公共对象本身。如果您在手动初始化变量时首次在脚本中定义变量,Unity会使用您的值对其进行序列化。 Else Unity使用默认值对其进行序列化。

例如。当您在第一次创建脚本时,如;

public class GameManager : MonoBehaviour {

public string[] words = {
        "one",
        "two",
        "three",
        "four",
        "five",
        "six",
    };
}

Unity使用此值序列化单词。之后,即使您从脚本更改初始值,下次运行时,它实际上也不会更改。

为此,有两种选择。第一;使用[System.NonSerialized]属性在脚本中定义变量。

[System.NonSerialized] public string[] words = {};

第二个选择,从层次结构中选择游戏对象。在检查器上,选择脚本组件并在更改初始变量时重置它。

答案 2 :(得分:1)

如果您希望能够同时执行这两项操作,在编辑器和脚本中添加元素,则应该使用List<string> words并检查列表中是否已存在该值,然后再将其添加到脚本中:

[SerializeField]
private List<string> words = new List<string>();

private void Start(){
    if(!words.Contains("apple")){
        words.Add("apple")
    }

    if(!words.Contains("banana")){
        words.Add("banana")
    }
}

独立于此,如果您想在编辑器中更新列表/数组,我建议您使用[ContextMenu]标记:

e.g。对于你的阵列:

public string[] words; // you don't set it here but expect it to be set in the editor

[ContextMenu("Import scripted array")]
private void ImportScriptedArray(){
    // Note in this case I simply overwrite any setting within the editor
    // There are multiple ways to prevent this like before using List or other methods
    words = new [] {
        "bla",
        "bli",
        "blub"
    };
}

这会将方法ImportScriptedArray添加到编辑器中此组件的上下文菜单中。首先你有这个未设置的数组:

unset array

在您的脚本/组件上,您现在可以单击设置图标以打开上下文菜单。

method in context menu

在上下文菜单中,点击刚刚生成的Import Scripted Array,从脚本中导入数组。

imported array