Unity——C#数组

Posted yancy994

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity——C#数组相关的知识,希望对你有一定的参考价值。

byte b=1;
b+=3;
b=b+3;//报错

最后一行代码的是byte+int无法隐式转换,而第二行代码为快捷运算符,不做类型提升。

读取数字类型的方法

int number=int.Parse(Console.ReadLine())

循环语句

for(int i=0;i<5;i++)

Console.WriteLine("Hello World");

此时的i只在for语句中使用。

数组的建立

int[] a;
//声明
a=new int[6];
//初始化 new 数据类型【容量】
bool[] b=true,false false;
//声明+初始化+赋值(必须为此写法)

取数组长度:array.Length

foreach循环:按顺序循环数组

/*
foreach(元素类型 变量名(谁便取) in 数组名称 )

    变量名 即 数组每个元素

/*
    int[] nmonth =  31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ;
    foreach(int item in nmonth)
    
        Console.WriteLine(item);
    
    Console.ReadLine();

缺点:只能读取全部元素

           不能修改元素

           从头到尾,依次遍历

var(推断类型):根据所赋数据,推断出类型

var v1=1;//int
var v2="string";//string
var v3='1';//char
var v4=ture;//bool
var v5=1.0;//double

Array:数组的的父类,声明一个Array,可以赋值所有数组类

object:声明一个object,可以赋值所有类

交错数组:相当于不规则的二维数组,由多个数组组成

using System;

namespace ConsoleApp3

    internal class Program
    
        static void Main(string[] args)
        
            int[][] array01;
            array01=new int[4][];
            array01[0]=new int[3];
            array01[1]=new int[4];
            array01[2]=new int[2];
            array01[3]=new int[1];
            for (int i = 0; i < array01.Length; i++)
            
                for(int j=0;j<array01[i].Length;j++)
                
                    array01[i][j]=int.Parse(Console.ReadLine());
                
            
            foreach (int[] array in array01)
            
                foreach(int item in array)
                
                    Console.WriteLine(item);
                
            
            Console.ReadLine();
        
      
    

 params(参数数组):对于方法内部而言,就是一个普通的数组。对于方法外部调用者而言,可以传递数组,也可以传递一种类型相同的变量集合。

using System;

namespace ConsoleApp3

    internal class Program
    
        static void Main(string[] args)
        
            int sum = Add(1, 2, 5, 6, 7, 8);
            Console.WriteLine(sum);
            Console.ReadLine();
        
        private static int Add(params int[] arr)
        
            int sum = 0;
            foreach(int item in arr)
            
                sum+=item;
            
            return sum;
        
    

二维数组

int[,] arr=null;
arr=new int[5,3];
arr[0,3]=100;

Unity C# 数组 - 如何克隆

【中文标题】Unity C# 数组 - 如何克隆【英文标题】:Unity C# Array - how to clone 【发布时间】:2014-11-20 19:17:04 【问题描述】:

我正在使用 Unity3D 开发一个小型应用程序/游戏。

问题是: 我需要克隆一个数组(称为 tempArray)并对其进行一些修改。然后我需要将 MAIN 数组的值更改为修改后的 tempArray。但是,每当我对克隆数组进行更改时,都会对主数组进行相同的更改。

所以我使用了以下代码:

private Cell[,] allCells = new Cell[256, 256];
private Cell[,] cellClone = new Cell[256,256];

//meanwhile initiated to some values//

//Here i clone the array.
cellClone = (Cell[,])allCells.Clone();

//Here i output the values for an element from both arrays.
Debug.Log(cellClone[0, 0].region.name.ToString());
Debug.Log(allCells[0, 0].region.name.ToString());

//Here i want to change "Region" variable of cellClone ONLY.
cellClone[0, 0].setRegion(new Region("testregion123", Color.cyan, false));

//Finally, i output the same values again. Only cellClone should change.
Debug.Log(cellClone[0, 0].region.name.ToString());
Debug.Log(allCells[0, 0].region.name.ToString());

但是,输出显示 allCells[0,0] 元素也已更改。这意味着我对克隆数组所做的任何操作都会执行到主数组。


编辑:

在玩了很多之后,我将其作为解决方案实施。我发布这个以防万一有人遇到类似问题。

但我不确定这是否应该这样做,所以如果有人有任何信息 - 我会检查这篇文章。

for (int i = 0; i < allCells.GetLength(0); i++)

    for (int j = 0; j < allCells.GetLength(1); j++)
    
        //cellClone[i, j] = allCells[i, j].Clone();
        //cellClone[i, j] = new Cell((int)allCells[i, j].position.x, (int)allCells[i, j].position.y, allCells[i, j].getRegionName());
        cellClone[i, j] = allCells[i, j].clone();
    

还有克隆功能:

public Cell clone()

        Cell n = new Cell((int)position.x, (int)position.y, regionName);
        return n;

【问题讨论】:

您检查过“深度复制或克隆”吗?这是一些例子***.com/questions/4054075/… 我试过深拷贝。但是,当它要求我将“UnityEngine.Vector2”设置为可序列化时,我放弃了它。 【参考方案1】:

但是,输出显示 allCells[0,0] 元素也已更改。这意味着我对克隆数组所做的任何操作都会执行到主数组。

除非Cell 是一个结构,否则您的setRegion 方法(听起来它应该只是一个Region 属性)根本不会改变数组的内容。它正在更改两个数组都包含 reference 的对象中存储的数据。

您正在执行数组的浅克隆,这意味着正在复制引用 - 但每个Cell 对象没有被克隆。 (我们甚至不知道该操作是否已经在Cell 内部实现。)

听起来您想执行深度克隆,例如:

for (int i = 0; i < allCells.GetLength(0); i++)

    for (int j = 0; j < allCells.GetLength(1); j++)
    
         cellClone[i, j] = allCells[i, j].Clone();
    

... 您需要自己实现 Clone 方法。 (例如,它可能需要依次克隆该区域。)

【讨论】:

谢谢。我一定会看看这个。【参考方案2】:

看看这个:

Array.Copy

Array.Copy (Array, Array, Int32)

更简单,只需 1 行代码;

【讨论】:

这是最好的答案,我不明白为什么 Jon Skeet 的答案在上面

以上是关于Unity——C#数组的主要内容,如果未能解决你的问题,请参考以下文章

Unity & C# - 从数组中选择一个随机字符串

从字典的 JSON 数组访问键/值 C#,Unity [重复]

C# Unity如何只选择数组中的一项并取消选择其他项

将字节数组从 Unity C# 传递到 C++ 库方法

不同应用程序(WPF 和 Unity)中的 C# struct 序列化返回不同大小的字节数组

Unity3d开发中与oc交互之类型转换