Unity学习记录

目录

一、C#基础

1.1、数据类型

1.2、变量

1.3、常量

1.4、运算符

1.5、判断

1.6、循环

1.7、数组

1.8、枚举

1.9、字符串

1.10、命名空间

1.11、类

1.12、结构体

二、Unity入门

三、Unity初级


根据新发大佬的目录,整理一下基础知识!补补基础知识。

https://blog.csdn.net/linxinfa/article/details/119731272?spm=1001.2014.3001.5501

一、C#基础

该部分抄录自C#基础,有需要查看详细内容的请点击

https://www.runoob.com/csharp/csharp-class.html

1.1、数据类型

  • 值类型(Value types)

值类型变量可以直接分配给一个值。它们是从类 System.ValueType 中派生的。

值类型直接包含数据。比如 int、char、float,它们分别存储数字、字符、浮点数。当您声明一个 int 类型时,系统分配内存来存储值。

  • 引用类型(Reference types)

        引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用。

        换句话说,它们指的是一个内存位置。使用多个变量时,引用类型可以指向一个内存位置。如果内存位置的数据是由一个变量改变的,其他变量会自动反映这种值的变化。内置的 引用类型有:objectdynamic 和 string

 1.对象(Object)类型

        对象(Object)类型 是 C# 通用类型系统(Common Type System - CTS)中所有数据类型的终极基类。Object 是 System.Object 类的别名。所以对象(Object)类型可以被分配任何其他类型(值类型、引用类型、预定义类型或用户自定义类型)的值。但是,在分配值之前,需要先进行类型转换。

 2.动态(Dynamic)类型

        您可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。

声明动态类型的语法:

dynamic <variable_name> = value;

 例如:

dynamic d = 20;

        动态类型与对象类型相似,但是对象类型变量的类型检查是在编译时发生的,而动态类型变量的类型检查是在运行时发生的。

 3.字符串(String)类型

        字符串(String)类型 允许您给变量分配任何字符串值。字符串(String)类型是 System.String 类的别名。它是从对象(Object)类型派生的。字符串(String)类型的值可以通过两种形式进行分配:引号和 @引号。

        用户自定义引用类型有:class、interface 或 delegate。

  • 指针类型(Pointer types)

        指针类型变量存储另一种类型的内存地址。C# 中的指针与 C 或 C++ 中的指针有相同的功能。

        C#在有限的范围内支持指针。C#的指针只不过是一个持有另一类型内存地址的变量。但是在C#中,指针只能被声明为持有值类型和数组的内存地址。与引用类型不同,指针类型不被默认的垃圾收集机制所跟踪。出于同样的原因,指针不允许指向引用类型,甚至不允许指向包含引用类型的结构类型。我们可以说,指针只能指向非托管类型,包括所有基本数据类型、枚举类型、其他指针类型和只包含非托管类型的结构。

例如:

char* cptr;
int* iptr;

  • 装箱与拆箱

        当一个值类型转换为对象类型时,则被称为 装箱;另一方面,当一个对象类型转换为值类型时,则被称为 拆箱

object obj;
obj = 100; // 这是装箱

        装箱:值类型转化为引用类型的过程。在堆上为新生成的引用对象分配内存,然后将值类型的数据拷贝到分配的内存中,返回堆中新分配对象的地址,这个地址就是指向对象的引用。

        拆箱:引用类型转化为值类型的过程。获取引用类型的地址,将用用对象的值拷贝到栈上的值类型实例中(注意 拆箱时可能会引发“转换无效”的异常。要记住,拆箱时强转的值类型,应以装箱时的值类型一致)

        注:装拆箱分配内存和拷贝数据会影响性能的操作,尽量避免装拆箱。

1.2、变量

      

         一个变量只不过是一个供程序操作的存储区的名字。在 C# 中,每个变量都有一个特定的类型,类型决定了变量的内存大小和布局。范围内的值可以存储在内存中,可以对变量进行一系列操作。

        我们已经讨论了各种数据类型。C# 中提供的基本的值类型大致可以分为以下几类:

  • 定义

        C# 中变量定义的语法:

<data_type> <variable_list>;

        在这里,data_type 必须是一个有效的 C# 数据类型,可以是 char、int、float、double 或其他用户自定义的数据类型。variable_list 可以由一个或多个用逗号分隔的标识符名称组成。

一些有效的变量定义如下所示:

int i, j, k;
char c, ch;
float f, salary;
double d;

        您可以在变量定义时进行初始化:

int i = 100;
  • 初始化

        变量通过在等号后跟一个常量表达式进行初始化(赋值)。初始化的一般形式为:

variable_name = value;

        变量可以在声明时被初始化(指定一个初始值)。初始化由一个等号后跟一个常量表达式组成,如下所示:

<data_type> <variable_name> = value;

        一些实例:

int d = 3, f = 5;    /* 初始化 d 和 f. */
byte z = 22;         /* 初始化 z. */
double pi = 3.14159; /* 声明 pi 的近似值 */
char x = 'x';        /* 变量 x 的值为 'x' */

1.3、常量

        常量是固定值,程序执行期间不会改变。常量可以是任何基本数据类型,比如整数常量、浮点常量、字符常量或者字符串常量,还有枚举常量。

        常量可以被当作常规的变量,只是它们的值在定义后不能被修改。

  • 定义 

        常量是使用 const 关键字来定义的 。定义一个常量的语法如下:

const <data_type> <constant_name> = value;

1.4、运算符

        运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。

  • 算术运算符

        下表显示了 C# 支持的所有算术运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:

  • 关系运算符

        下表显示了 C# 支持的所有关系运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:

  • 逻辑运算符

        下表显示了 C# 支持的所有逻辑运算符。假设变量 A 为布尔值 true,变量 B 为布尔值 false,则:

  • 位运算符

        位运算符作用于位,并逐位执行操作。&、 | 和 ^ 的真值表如下所示:

        假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:

A = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

~A  = 1100 0011

        下表列出了 C# 支持的位运算符。假设变量 A 的值为 60,变量 B 的值为 13,则:

  • 赋值运算符

        下表列出了 C# 支持的赋值运算符:

1.5、判断

        判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。

        下面是大多数编程语言中典型的判断结构的一般形式:

        


        

  • if 语句
  • if … else语句
  • 嵌套 if 语句
  • switch 语句
  • 嵌套 switch 语句

         C# 提供了以下类型的判断语句。点击链接查看每个语句的细节。

  • ?: 条件运算符

        条件运算符 ? :,可以用来替代 if...else 语句。它的一般形式如下: 

Exp1 ? Exp2 : Exp3;

        其中,Exp1、Exp2 和 Exp3 是表达式。请注意,冒号的使用和位置。

        ? 表达式的值是由 Exp1 决定的。如果 Exp1 为真,则计算 Exp2 的值,结果即为整个 ? 表达式的值。如果 Exp1 为假,则计算 Exp3 的值,结果即为整个 ? 表达式的值。

1.6、循环

        有的时候,可能需要多次执行同一块代码。一般情况下,语句是顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。

        编程语言提供了允许更为复杂的执行路径的多种控制结构。

        循环语句允许我们多次执行一个语句或语句组,下面是大多数编程语言中循环语句的一般形式:

        

         

  • 循环类型

         C# 提供了以下几种循环类型。

  • 循环控制语句

         循环控制语句更改执行的正常序列。当执行离开一个范围时,所有在该范围中创建的自动对象都会被销毁。

        

  • 无限循环

        如果条件永远不为假,则循环将变成无限循环。for 循环在传统意义上可用于实现无限循环。由于构成循环的三个表达式中任何一个都不是必需的,您可以将某些条件表达式留空来构成一个无限循环。        

        当条件表达式不存在时,它被假设为真。您也可以设置一个初始值和增量表达式,但是一般情况下,程序员偏向于使用 for(;;) 结构来表示一个无限循环。

1.7、数组

      

        数组是一个存储相同类型元素的固定大小的顺序集合。数组是用来存储数据的集合,通常认为数组是一个同一类型变量的集合。

声明数组变量并不是声明 number0、number1、...、number99 一个个单独的变量,而是声明一个就像 numbers 这样的变量,然后使用 numbers[0]、numbers[1]、...、numbers[99] 来表示一个个单独的变量。数组中某个指定的元素是通过索引来访问的。

所有的数组都是由连续的内存位置组成的。最低的地址对应第一个元素,最高的地址对应最后一个元素。

  • 声明

        在 C# 中声明一个数组,您可以使用下面的语法:

datatype[] arrayName;

        

        其中,

                datatype 用于指定被存储在数组中的元素的类型。

                [ ] 指定数组的秩(维度)。秩指定数组的大小。

                arrayName 指定数组的名称。

        例如:

double[] balance;

  • 初始化

        

        声明一个数组不会在内存中初始化数组。当初始化数组变量时,您可以赋值给数组。

        数组是一个引用类型,所以您需要使用 new 关键字来创建数组的实例。

        例如:

double[] balance = new double[10];

  • 赋值

         您可以通过使用索引号赋值给一个单独的数组元素,比如:

double[] balance = new double[10];
balance[0] = 4500.0;

        您可以在声明数组的同时给数组赋值,比如:

double[] balance = { 2340.0, 4523.69, 3421.0};

        您也可以创建并初始化一个数组,比如:

int [] marks = new int[5]  { 99,  98, 92, 97, 95};

  • 访问

        元素是通过带索引的数组名称来访问的。这是通过把元素的索引放置在数组名称后的方括号中来实现的。例如:

double salary = balance[9];
  • 遍历

        我们使用一个 for 循环来访问每个数组元素,您也可以使用一个 foreach 语句来遍历数组

  • 多维数组

        C# 支持多维数组。多维数组又称为矩形数组。

        您可以声明一个 string 变量的二维数组,如下:        

string [,] names;

  • Array与ArrayList的区别

        1、Array数组可以包含基本类型和对象类型;ArrayList只能包含对象类型

        2、Array数组的空间是固定的,要事前确定合适的空间大小;ArrayList的空间是动态增长的

        3、ArrayList的许多方法都是在内部数组的基础上直接调用Array的对应方法。

1.8、枚举

        枚举是一组命名整型常量。枚举类型是使用 enum 关键字声明的。

        C# 枚举是值类型。换句话说,枚举包含自己的值,且不能继承或传递继承。

  • 声明

        声明枚举的一般语法:

enum <enum_name>
{ 
    enumeration list 
};

        其中,

        enum_name 指定枚举的类型名称。

        enumeration list 是一个用逗号分隔的标识符列表。

  • 访问
  • 与int、string的转换

        下面的实例演示了枚举变量的用法:

using System;

public class EnumTest
{
    enum Day { Sun, Mon, Tue, Wed, Thu, Fri, Sat };

    static void Main()
    {
        int x = (int)Day.Sun;
        int y = (int)Day.Fri;
        Console.WriteLine("Sun = {0}", x);
        Console.WriteLine("Fri = {0}", y);
    }
}

        当上面的代码被编译和执行时,它会产生下列结果:

Sun = 0
Fri = 5
  • 判断枚举是否包含id
Enum.IsDefined(typeof(你的枚举)

1.9、字符串

  • 字符串比较
public static int Compare( string strA, string strB )
比较两个指定的 string 对象,并返回一个表示它们在排列顺序中相对位置的整数。该方法区分大小写。

public static int Compare( string strA, string strB, bool ignoreCase )
比较两个指定的 string 对象,并返回一个表示它们在排列顺序中相对位置的整数。但是,如果布尔参数为真时,该方法不区分大小写。
  • 字符串替换
public string Replace( char oldChar, char newChar )
把当前 string 对象中,所有指定的 Unicode 字符替换为另一个指定的 Unicode 字符,并返回新的字符串。

public string Replace( string oldValue, string newValue )
把当前 string 对象中,所有指定的字符串替换为另一个指定的字符串,并返回新的字符串。
  • 字符串连接
public static string Concat( string str0, string str1 )
连接两个 string 对象。

public static string Concat( string str0, string str1, string str2 )
连接三个 string 对象。

public static string Concat( string str0, string str1, string str2, string str3 )
连接四个 string 对象。
  • 判断是否含有字符串
public bool Contains( string value )
返回一个表示指定 string 对象是否出现在字符串中的值。
  • 复制字符串
public static string Copy( string str )
创建一个与指定字符串具有相同值的新的 String 对象。

public void CopyTo( int sourceIndex, char[] destination, int destinationIndex, int count )
从 string 对象的指定位置开始复制指定数量的字符到 Unicode 字符数组中的指定位置。
  • 判断是否是以某个字符串结尾
public bool EndsWith( string value )
判断 string 对象的结尾是否匹配指定的字符串。
  • 判断是否是以某个字符串开头
public bool StartsWith( string value )
判断字符串实例的开头是否匹配指定的字符串。
  • 字符串判等
public bool Equals( string value )
判断当前的 string 对象是否与指定的 string 对象具有相同的值。

public static bool Equals( string a, string b )
判断两个指定的 string 对象是否具有相同的值。
  • 字符串格式化
public static string Format( string format, Object arg0 )
把指定字符串中一个或多个格式项替换为指定对象的字符串表示形式。
  • 求索引
public int IndexOf( char value )
返回指定 Unicode 字符在当前字符串中第一次出现的索引,索引从 0 开始。

public int IndexOf( string value )
返回指定字符串在该实例中第一次出现的索引,索引从 0 开始。

public int IndexOf( char value, int startIndex )
返回指定 Unicode 字符从该字符串中指定字符位置开始搜索第一次出现的索引,索引从 0 开始。

public int IndexOf( string value, int startIndex )
返回指定字符串从该实例中指定字符位置开始搜索第一次出现的索引,索引从 0 开始。

public int IndexOfAny( char[] anyOf )
返回某一个指定的 Unicode 字符数组中任意字符在该实例中第一次出现的索引,索引从 0 开始。

public int IndexOfAny( char[] anyOf, int startIndex )
返回某一个指定的 Unicode 字符数组中任意字符从该实例中指定字符位置开始搜索第一次出现的索引,索引从 0 开始。
  • 字符串判空
public static bool IsNullOrEmpty( string value )
指示指定的字符串是否为 null 或者是否为一个空的字符串。
  • 使用分隔符连接字符串数组
public static string Join( string separator, string[] value )
连接一个字符串数组中的所有元素,使用指定的分隔符分隔每个元素。

public static string Join( string separator, string[] value, int startIndex, int count )
连接一个字符串数组中的指定位置开始的指定元素,使用指定的分隔符分隔每个元素。
  • 使用分隔符分割字符串
public string[] Split( params char[] separator )
返回一个字符串数组,包含当前的 string 对象中的子字符串,子字符串是使用指定的 Unicode 字符数组中的元素进行分隔的。

public string[] Split( char[] separator, int count )
返回一个字符串数组,包含当前的 string 对象中的子字符串,子字符串是使用指定的 Unicode 字符数组中的元素进行分隔的。int 参数指定要返回的子字符串的最大数目。
  • 插入字符串
public string Insert( int startIndex, string value )
返回一个新的字符串,其中,指定的字符串被插入在当前 string 对象的指定索引位置。
  • 移除字符串
public string Remove( int startIndex )
移除当前实例中的所有字符,从指定位置开始,一直到最后一个位置为止,并返回字符串。

public string Remove( int startIndex, int count )
从当前字符串的指定位置开始移除指定数量的字符,并返回字符串。
  • 转char[]
public char[] ToCharArray()
返回一个带有当前 string 对象中所有字符的 Unicode 字符数组。

public char[] ToCharArray( int startIndex, int length )
返回一个带有当前 string 对象中所有字符的 Unicode 字符数组,从指定的索引开始,直到指定的长度为止。
  • 大小写转换
public string ToLower()
把字符串转换为小写并返回。

public string ToUpper()
把字符串转换为大写并返回。
  • 去除前后空白字符
public string Trim()
移除当前 String 对象中的所有前导空白字符和后置空白字符。

1.10、命名空间

        

        命名空间的设计目的是提供一种让一组名称与其他名称分隔开的方式。在一个命名空间中声明的类的名称与另一个命名空间中声明的相同的类的名称不冲突。

        我们举一个计算机系统中的例子,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。

  • 定义

        命名空间的定义是以关键字 namespace 开始,后跟命名空间的名称,如下所示:

namespace namespace_name
{
   // 代码声明
}

        为了调用支持命名空间版本的函数或变量,会把命名空间的名称置于前面,如下所示:

namespace_name.item_name;

  • using

        using 关键字表明程序使用的是给定命名空间中的名称。例如,我们在程序中使用 System 命名空间,其中定义了类 Console。我们可以只写:

Console.WriteLine ("Hello there");

        我们可以写完全限定名称,如下:

System.Console.WriteLine("Hello there");

        您也可以使用 using 命名空间指令,这样在使用的时候就不用在前面加上命名空间名称。该指令告诉编译器随后的代码使用了指定命名空间中的名称。

  • 嵌套命名空间

        命名空间可以被嵌套,即您可以在一个命名空间内定义另一个命名空间,如下所示:

namespace namespace_name1 
{
   // 代码声明
   namespace namespace_name2 
   {
     // 代码声明
   }
}

1.11、类

        当你定义一个类时,你定义了一个数据类型的蓝图。这实际上并没有定义任何的数据,但它定义了类的名称意味着什么,也就是说,类的对象由什么组成及在这个对象上可执行什么操作。对象是类的实例。构成类的方法和变量称为类的成员。

  • 定义

        类的定义是以关键字 class 开始,后跟类的名称。类的主体,包含在一对花括号内。下面是类定义的一般形式:

<access specifier> class  class_name
{
 // member variables
    <access specifier> <data type> variable1;
    <access specifier> <data type> variable2;
    ...
    <access specifier> <data type> variableN;
    // member methods
    <access specifier> <return type> method1(parameter_list)
    {
        // method body
    }
    <access specifier> <return type> method2(parameter_list)
    {
        // method body
    }
    ...
    <access specifier> <return type> methodN(parameter_list)
    {
        // method body
    }
}

        请注意:

        访问标识符 <access specifier> 指定了对类及其成员的访问规则。如果没有指定,则使用默认的访问标识符。类的默认访问标识符是 internal,成员的默认访问标识符是 private

        数据类型 <data type> 指定了变量的类型,返回类型 <return type> 指定了返回的方法返回的数据类型。

        如果要访问类的成员,你要使用点(.)运算符。

        点运算符链接了对象的名称和成员的名称。

  • 成员函数

        类的成员函数是一个在类定义中有它的定义或原型的函数,就像其他变量一样。作为类的一个成员,它能在类的任何对象上操作,且能访问该对象的类的所有成员。

        成员变量是对象的属性(从设计角度),且它们保持私有来实现封装。这些变量只能使用公共成员函数来访问。

  • 构造函数

        类的 构造函数 是类的一个特殊的成员函数,当创建类的新对象时执行。

        构造函数的名称与类的名称完全相同,它没有任何返回类型。

        默认的构造函数没有任何参数。但是如果你需要一个带有参数的构造函数可以有参数,这种构造函数叫做参数化构造函数

  • 析构函数

        类的 析构函数 是类的一个特殊的成员函数,当类的对象超出范围时执行。

        析构函数的名称是在类的名称前加上一个波浪形(~)作为前缀,它不返回值,也不带任何参数。

        析构函数用于在结束程序(比如关闭文件、释放内存等)之前释放资源。析构函数不能继承或重载。

  • 静态成员

        我们可以使用 static 关键字把类成员定义为静态的。当我们声明一个类成员为静态时,意味着无论有多少个类的对象被创建,只会有一个该静态成员的副本。

        关键字 static 意味着类中只有一个该成员的实例。静态变量用于定义常量,因为它们的值可以通过直接调用类而不需要创建类的实例来获取。静态变量可在成员函数或类的定义外部进行初始化。你也可以在类的定义内部初始化静态变量。

        你也可以把一个成员函数声明为 static。这样的函数只能访问静态变量。静态函数在对象被创建之前就已经存在。

  • 密封类

        密封类可以用来限制扩展性,如果密封了某个类,则其他类不能从该类继承;如果密封了某个成员,则派生类不能重写该成员的实现。默认情况下,不应密封类型和成员。密封可以防止对库的类型和成员进行自定义,但也会影响某些开发人员对可用性的认识。

        C#中使用密封类时,如果类满足如下条件,则应将其密封。                

  • 类是静态类。
  • 类包含带有安全敏感信息的继承的受保护成员。
  • 类继承多个虚成员,并且密封每个成员的开发和测试开销明显大于密封整个类。
  • 类是一个要求使用反射进行快速搜索的属性。密封属性可提高反射在检索属性时的性能。

                

① 密封类不能作为基类被继承,但它可以继承别的类或接口。

② 在密封类中不能声明受保护成员或虚成员,因为受保护成员只能从派生类进行访问,而虚成员只能在派生类中重写。

③ 由于密封类的不可继承性,因此密封类不能声明为抽象的,即sealed修饰符不能与abstract修饰符同时使用。

  • 静态类

        静态类与非静态类基本上是相同的,但有一点明显不同:静态类无法被实例化。换言之,你无法使用new操作符来创建一个静态类的变量。因为它根本没有实例变量,所以你需要使用静态类的类名来访问静态类的成员。

        静态类可用作操作一组方法的便捷容器,这些方法只需关心操作输入的参数,不需要获取或设置任何内部实例字段。

        与所有类一样,当引用该类的程序被加载时,.NET运行环境将加载静态类的类型信息。程序无法确切地指定何时加载类。但是,在程序中第一次引用类之前,得保证加载它、初始化它的字段并且调用它的静态构造函数。静态构造函数仅调用一次,静态类在程序所在的应用程序域(Application domain)的生命周期内一直保存在内存中。

注意:
要创建一个只允许一个实例存在的非静态的类,请参阅C#中单例(singleton)实现的相关资料。

        下面列出了一些静态类的主要特征:

  •                 只包含静态成员。
  •                 无法被实例化。
  •                 是密封的(无法被继承)。
  •                 不能包含实例构造器。

        因此,创建静态类与创建只包含静态成员和私有构造函数的类基本相同。私有构造函数也会阻止类被实例化。使用静态类的好处是,编译器可以检查,以确保没有意外添加实例成员。编译器还能保证类的实例无法被创建。

        静态类是密封的,因此不能被继承。同时也不能继承除Object以外的任何类。静态类无法包含实例构造函数。不过,可以包含静态构造函数。如果非静态类包含需要非平凡初始化(non-trivial initialization,大概指不是在类中写死的)的静态成员,则还应定义静态构造函数(详细信息看静态构造函数相关内容)。

1.12、结构体

        在 C# 中,结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。struct 关键字用于创建结构体。

        结构体是用来代表一个记录。假设您想跟踪图书馆中书的动态。您可能想跟踪每本书的以下属性:

  • Title
  • Author
  • Subject
  • Book ID
  • 定义

        为了定义一个结构体,您必须使用 struct 语句。struct 语句为程序定义了一个带有多个成员的新的数据类型。

struct Books
{
   public string title;
   public string author;
   public string subject;
   public int book_id;
};  
  • 特点

  • 结构可带有方法、字段、索引、属性、运算符方法和事件。
  • 结构可定义构造函数,但不能定义析构函数。但是,您不能为结构定义无参构造函数。无参构造函数(默认)是自动定义的,且不能被改变。
  • 与类不同,结构不能继承其他的结构或类。
  • 结构不能作为其他结构或类的基础结构。
  • 结构可实现一个或多个接口。
  • 结构成员不能指定为 abstract、virtual 或 protected。
  • 当您使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 New 操作符即可被实例化。
  • 如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。
  • 类与结构体的区别

        类和结构有以下几个基本的不同点:

  • 类是引用类型,结构是值类型。
  • 结构不支持继承。
  • 结构不能声明默认的构造函数。

1.13、接口

二、Unity入门

在这里插入图片描述

三、Unity初级

在这里插入图片描述

四、Unity中级

五、Unity中高级

 

六、Unity高级

七、管理与规范

八、数学基础

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值