2017-02-16 33 views
3

我不知道为什么我的脚本在统一c#中总是得到空?Array.FindIndex总是在统一C中为空#

public class WeatherControl : MonoBehaviour { 
    public GameObject Rain; 

    public int[] RainTime = new int[]{6,7,8,9,10,18,19,20,21,22,16}; 

    int day; 
    System.DateTime dates; 

    // Use this for initialization 
    void Start() { 
     dates = System.DateTime.UtcNow; 
     day = (int) dates.Day; 
     //day = 16; 
     Debug.Log ("DAY : " + day); 
     int posRain = System.Array.FindIndex (RainTime, x => x.Equals(16)); 

     Debug.Log ("POS RAIN : " + posRain); 
     if (posRain >= 0) { 
      Rain.SetActive (true); 
     } else { 
      Rain.SetActive (false); 
     } 

    } 

} 

我的变量INT posRain总是返回-1即使在阵列存在价值包含它。变量日包含16。我把它手动并输入16。但总是返回-1。 我不知道为什么。

我也尝试过这样:

int posRain = System.Array.IndexOf (RainTime, day); 

这一直返回-1了。

我在网上的C#测试这里测试它:https://csharppad.com/

它工作在它返回10

但在统一的C#编辑器是不同的总是返回-1。

有人可以解释发生了什么?

感谢

丹尼斯

+0

如何简单地尝试x == 16而不是x.equals(16)? –

+3

我没有看太多你的代码,但你的数组变量是公开的,这使得unity在检查器中序列化它。检查员对该字段的任何值都将覆盖您设置的代码值。所以我猜测这个数组在检查器中没有值或者没有代码中的值。 “-1”值意味着它不存在于列表中。 – Maakep

+0

@PiotrKamoda它是一样的并返回-1。弗雷德里克我猜你在这里有点儿不对。我终于找到了答案。这不是关于序列化。但是它将重置检查员的价值。或重新附加脚本。所以所有数组值的大小都会更新。当你说督察的价值时,我得到了这个。我检查它,并且右边的值16不在那里。 –

回答

0

你的阵列是公开的,所以它是由统一序列化。 Unity会将数组设置为您在检查器中给出的值,覆盖您在代码中声明的值。如果您不需要从检查员访问数组,则应该使用[NonSerialized]属性。如果您确实需要从检查员那里访问它,您还应该从那里进行编辑。

0

最后得到的答案....

最后,这是我们应该记住的一个小东西。有时候这可能会让我们陷入困境。

一旦您在脚本更新数组值。不要忘记重置或重新附加检查器中包含数组值的脚本。重置或重新附加脚本时,所有值数组大小都会更新。

例如:

在脚本你有一个数组:

public int[] RainTime = new int[]{6,7,8,9,10,18,19,20,21,22}; 

这是不包括在阵列16。现在你在编辑器中运行代码。 在检查器中,您将看到数组大小包含所有RainTime数组值。

现在回到脚本在更新数组值:

public int[] RainTime = new int[]{6,7,8,9,10,18,19,20,21,22,**16**}; 

你已经把16最后阵列。现在在编辑器中运行代码。并且在检查器数组大小值中看到,即使您已通过脚本更新它,检查器中的值16也不包含在数组中。

你应该怎样重置检查器的值或者从检查器重新连接脚本。它会更新值,现在检查器中的数组现在也包含值16。

感谢