【编程语言】在Unity3D中的C#编程初级

##一、前言
这篇文章主要是给零基础想要Unity入门的关于C#编程的一些意见

##二、参考文章
unity中的C#编程-零基础(Unity2017)

##三、正文

###

1、支持Unity3D的编程语言

  • C#、JavaScript、UnityScript
    先说C#与JavaScript,因为JavaScript是动态的,肯定不如编译的C#好,但是JavaScript更快捷一点, JavaScript适合个人开发,敏捷快速。c#适合公司开发,规范严谨。

  • 然后说说这个C#和Unity内置的UnityScript
    UnityScript脱胎于.Net平台的第三方语言Boo,差距可能是全方位,立体式的。社区支持,代码维护,甚至是编译出来的CIL代码质量都可能有很大的差距。另外从Unity5.0版本开始就会停止对Boo的文档支持。同时消失的还有从菜单创建Boo脚本的选项“Create Boo Script”。从U3D团队对Boo的态度,也可以窥见和Boo联系密切的UnityScript未来的走势。
    ###

    2、编程工具(IDE)

  • Visual Studio 全系列

  • Visual Studio Code

  • Xamarin Studio
    这个主要是在Mac上使用的IDE,因为在Mac上不能使用VS,MonoDevelop也不能输入中文,就挺难受的,就可以使用XamarinStudio,关于这个IDE使用可以参考这篇文章。http://www.xuanyusong.com/archives/3545

  • MonoDevelop
    Unity3D内置的编辑器,操作感觉一般,但是胜在方便,在安装Unity3D的时候就可以一起安装了,不用另外安装IDE了

  • JetBrains Rider
    一款强大的强大的跨平台C#编辑器,官网https://www.jetbrains.com/zh/dotnet/promo/unity/

###

3、创建C#代码

  1. 在工程目录下右键点击,选择Create->C# Script
    这里写图片描述
  2. 在任意对象上,点击Add Component->New Script
    这里写图片描述
    这个是创建成功后的初始脚本的样子
    这里写图片描述

###

4、场景的保存和脚本的保存

  • 快捷键F2 点击场景名或者脚本名字可以重命名
  • 快捷键Ctrl+S 快速保存场景或者保存脚本
  • 状态栏中显示“*”号的都是未保存的
    这里写图片描述
  • 编辑器意外奔溃,场景未来得及保存?
    这时可以打开工程目录,找到/Temp/_Backupscenes/文件夹,可以看到有后缀名为.backup的文件,将该文件的后缀名改为.unity拖拽到项目视图,即可还原编辑器崩溃前的场景。
    这里写图片描述

###

5、关于日志输出(指控制输出,其中Log有三类:正常、警告、错误输出)

  • print
    是MonoBehaviour的一个成员,必须继承MonoBehaviour才能使用,通过反编译可以看到print的方法为
public static void print(object message)
{
	Debug.Log(message);
}

说明print方法还是通过Debug.Log实现的,print就是Debug.Log的一个简单封装。

  • Debug.Log
    输出log信息,可以在运行的时候查看关键数据的变化

  • Debug.LogWarning
    输出警告信息

  • Debug.LogError
    输出错误信息

这里写图片描述
这里写图片描述

###

6、变量与常量
因为两个比较相似,就放一块说

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

  • 常量
    常量是固定值,程序执行期间不会改变。常量可以是任何基本数据类型,比如整数常量、浮点常量、字符常量或者字符串常量,还有枚举常量。
    常量可以被当作常规的变量,只是它们的值在定义后不能被修改。

  • 变量的类型

类型 举例
整数类型 sbyte、byte、short、ushort、int、uint、long、ulong 和 char
浮点型 float 和 double
十进制类型 decimal
布尔类型 true 或 false 值,指定的值
空类型 可为空值的数据类型
其他变量类型 枚举enum,引用类型变量class,结构体类型struct
- 变量的定义
int i, j, k;
char c, ch;
float f, salary;
double d;
  • 变量的初始化
int d = 3, f = 5;    /* 初始化 d 和 f. */
byte z = 22;         /* 初始化 z. */
double pi = 3.14159; /* 声明 pi 的近似值 */
char x = 'x';        /* 变量 x 的值为 'x' */

实例

namespace VariableDefinition
{
    class Program
    {
        static void Main(string[] args)
        {
            short a;
            int b ;
            double c;

            /* 实际初始化 */
            a = 10;
            b = 20;
            c = a + b;
            Console.WriteLine("a = {0}, b = {1}, c = {2}", a, b, c);
            Console.ReadLine();
        }
    }
}

编译执行结果:

a = 10, b = 20, c = 30
  • 常量的定义
 const double pi = 3.14159; // 常量声明
  • 常量的类型
    #####整数常量
    整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,没有前缀则表示十进制。

整数常量也可以有后缀,可以是 U 和 L 的组合,其中,U 和 L 分别表示 unsigned 和 long。后缀可以是大写或者小写,多个后缀以任意顺序进行组合。

212         /* 合法 */
215u        /* 合法 */
0xFeeL      /* 合法 */
078         /* 非法:8 不是一个八进制数字 */
032UU       /* 非法:不能重复后缀 */
85         /* 十进制 */
0213       /* 八进制 */
0x4b       /* 十六进制 */
30         /* int */
30u        /* 无符号 int */
30l        /* long */
30ul       /* 无符号 long */

#####浮点常量
一个浮点常量是由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。
这里有一些浮点常量的实例:

3.14159       /* 合法 */
314159E-5L    /* 合法 */
510E          /* 非法:不完全指数 */
210f          /* 非法:没有小数或指数 */
.e55          /* 非法:缺少整数或小数 */

使用小数形式表示时,必须包含小数点、指数或同时包含两者。使用指数形式表示时,必须包含整数部分、小数部分或同时包含两者。有符号的指数是用 e 或 E 表示的。

#####字符常量
字符常量是括在单引号里,例如,‘x’,且可存储在一个简单的字符类型变量中。一个字符常量可以是一个普通字符(例如 ‘x’)、一个转义序列(例如 ‘\t’)或者一个通用字符(例如 ‘\u02C0’)。

在 C# 中有一些特定的字符,当它们的前面带有反斜杠时有特殊的意义,可用于表示换行符(\n)或制表符 tab(\t)。在这里,列出一些转义序列码:

转义序列含义
\\\ 字符
\'' 字符
\"" 字符
\?? 字符
\aAlert 或 bell
\b退格键(Backspace)
\f换页符(Form feed)
\n换行符(Newline)
\r回车
\t水平制表符 tab
\v垂直制表符 tab
\ooo一到三位的八进制数
\xhh . . .一个或多个数字的十六进制数
实例:
namespace EscapeChar
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello\tWorld\n\n");
            Console.ReadLine();
        }
    }
}

编译执行结果:

Hello   World

#####字符串常量
字符串常量是括在双引号 “” 里,或者是括在 @"" 里。字符串常量包含的字符与字符常量相似,可以是:普通字符、转义序列和通用字符

使用字符串常量时,可以把一个很长的行拆成多个行,可以使用空格分隔各个部分。

这里是一些字符串常量的实例。下面所列的各种形式表示相同的字符串。

string a = "hello, world";                  // hello, world
string b = @"hello, world";               // hello, world
string c = "hello \t world";               // hello     world
string d = @"hello \t world";               // hello \t world
string e = "Joe said \"Hello\" to me";      // Joe said "Hello" to me
string f = @"Joe said ""Hello"" to me";   // Joe said "Hello" to me
string g = "\\\\server\\share\\file.txt";   // \\server\share\file.txt
string h = @"\\server\share\file.txt";      // \\server\share\file.txt
string i = "one\r\ntwo\r\nthree";
string j = @"one
two
three";

实例:

using System;

namespace DeclaringConstants
{
    class Program
    {
        static void Main(string[] args)
        {
            const double pi = 3.14159; // 常量声明
            double r;
            Console.WriteLine("Enter Radius: ");
            r = Convert.ToDouble(Console.ReadLine());
            double areaCircle = pi * r * r;
            Console.WriteLine("Radius: {0}, Area: {1}", r, areaCircle);
            Console.ReadLine();
        }
    }
}

编译执行结果:

Enter Radius: 
3
Radius: 3, Area: 28.27431

###

7、方法的定义和调用

  • 方法的定义
    语法如下:
<Access Specifier> <Return Type> <Method Name>(Parameter List)
{
   Method Body
}

下面是方法的各个元素:

  • Access Specifier:访问修饰符,这个决定了变量或方法对于另一个类的可见性。
  • Return type:返回类型,一个方法可以返回一个值。返回类型是方法返回的值的数据类型。如果方法不返回任何值,则返回类型为 void
  • Method name:方法名称,是一个唯一的标识符,且是大小写敏感的。它不能与类中声明的其他标识符相同。
  • Parameter list:参数列表,使用圆括号括起来,该参数是用来传递和接收方法的数据。参数列表是指方法的参数类型、顺序和数量。参数是可选的,也就是说,一个方法可能不包含参数。
  • Method body:方法主体,包含了完成任务所需的指令集。
实例: 下面的代码片段显示一个函数 FindMax,它接受两个整数值,并返回两个中的较大值。它有 public 访问修饰符,所以它可以使用类的实例从类的外部进行访问。 ``` class NumberManipulator { public int FindMax(int num1, int num2) { /* 局部变量声明 */ int result;
  if (num1 > num2)
     result = num1;
  else
     result = num2;

  return result;

}

}

- 方法的调用

using System;

namespace CalculatorApplication
{
class NumberManipulator
{
public int FindMax(int num1, int num2)
{
/* 局部变量声明 */
int result;

     if (num1 > num2)
        result = num1;
     else
        result = num2;

     return result;
  }
  static void Main(string[] args)
  {
     /* 局部变量定义 */
     int a = 100;
     int b = 200;
     int ret;
     NumberManipulator n = new NumberManipulator();

     //调用 FindMax 方法
     ret = n.FindMax(a, b);
     Console.WriteLine("最大值是: {0}", ret );
     Console.ReadLine();
  }

}
}

编译执行后的结果:

最大值是: 200

您也可以使用类的实例从另一个类中调用其他类的公有方法。例如,方法 FindMax 属于 NumberManipulator 类,您可以从另一个类 Test 中调用它。

using System;

namespace CalculatorApplication
{
class NumberManipulator
{
public int FindMax(int num1, int num2)
{
/* 局部变量声明 */
int result;

        if (num1 > num2)
            result = num1;
        else
            result = num2;

        return result;
    }
}
class Test
{
    static void Main(string[] args)
    {
        /* 局部变量定义 */
        int a = 100;
        int b = 200;
        int ret;
        NumberManipulator n = new NumberManipulator();
        //调用 FindMax 方法
        ret = n.FindMax(a, b);
        Console.WriteLine("最大值是: {0}", ret );
        Console.ReadLine();

    }
}

}

编译执行的结果:

最大值是: 200


- 递归方法的调用
一个方法可以自我调用。这就是所谓的 递归。下面的实例使用递归函数计算一个数的阶乘:

using System;

namespace CalculatorApplication
{
class NumberManipulator
{
public int factorial(int num)
{
/* 局部变量定义 */
int result;

        if (num == 1)
        {
            return 1;
        }
        else
        {
            result = factorial(num - 1) * num;
            return result;
        }
    }

    static void Main(string[] args)
    {
        NumberManipulator n = new NumberManipulator();
        //调用 factorial 方法
        Console.WriteLine("6 的阶乘是: {0}", n.factorial(6));
        Console.WriteLine("7 的阶乘是: {0}", n.factorial(7));
        Console.WriteLine("8 的阶乘是: {0}", n.factorial(8));
        Console.ReadLine();

    }
}

}

编译执行后的结果:

6 的阶乘是: 720
7 的阶乘是: 5040
8 的阶乘是: 40320

-  参数传递
当调用带有参数的方法时,您需要向方法传递参数。在 C# 中,有三种向方法传递参数的方式:
<table>
<tr><th>方式</th><th>描述</th></tr>
<tr><td>值参数</td><td>这种方式复制参数的实际值给函数的形式参数,实参和形参使用的是两个不同内存中的值。在这种情况下,当形参的值发生改变时,不会影响实参的值,从而保证了实参数据的安全。</td> </tr>
<tr><td>引用参数</td><td>这种方式复制参数的内存位置的引用给形式参数。这意味着,当形参的值发生改变时,同时也改变实参的值。</td> </tr>
<tr><td>输出参数</td><td>这种方式可以返回多个值。</td> </tr>
</table>
- 按值参数传递

这是参数传递的默认方式。在这种方式下,当调用一个方法时,会为每个值参数创建一个新的存储位置。
实际参数的值会复制给形参,实参和形参使用的是两个不同内存中的值。所以,当形参的值发生改变时,不会影响实参的值,从而保证了实参数据的安全。下面的实例演示了这个概念:

using System;
namespace CalculatorApplication
{
class NumberManipulator
{
public void swap(int x, int y)
{
int temp;

     temp = x; /* 保存 x 的值 */
     x = y;    /* 把 y 赋值给 x */
     y = temp; /* 把 temp 赋值给 y */
  }
  
  static void Main(string[] args)
  {
     NumberManipulator n = new NumberManipulator();
     /* 局部变量定义 */
     int a = 100;
     int b = 200;
     
     Console.WriteLine("在交换之前,a 的值: {0}", a);
     Console.WriteLine("在交换之前,b 的值: {0}", b);
     
     /* 调用函数来交换值 */
     n.swap(a, b);
     
     Console.WriteLine("在交换之后,a 的值: {0}", a);
     Console.WriteLine("在交换之后,b 的值: {0}", b);
     
     Console.ReadLine();
  }

}
}


编译执行后的结果:

在交换之前,a 的值:100
在交换之前,b 的值:200
在交换之后,a 的值:200
在交换之后,b 的值:100

结果表明,swap 函数内的值改变了,且这个改变可以在 Main 函数中反映出来。

- 按输出传递参数

return 语句可用于只从函数中返回一个值。但是,可以使用 输出参数 来从函数中返回两个值。输出参数会把方法输出的数据赋给自己,其他方面与引用参数相似。

下面的实例演示了这点:

using System;

namespace CalculatorApplication
{
class NumberManipulator
{
public void getValue(out int x )
{
int temp = 5;
x = temp;
}

  static void Main(string[] args)
  {
     NumberManipulator n = new NumberManipulator();
     /* 局部变量定义 */
     int a = 100;
     
     Console.WriteLine("在方法调用之前,a 的值: {0}", a);
     
     /* 调用函数来获取值 */
     n.getValue(out a);

     Console.WriteLine("在方法调用之后,a 的值: {0}", a);
     Console.ReadLine();

  }

}
}

编译执行后的结果:

在方法调用之前,a 的值: 100
在方法调用之后,a 的值: 5

提供给输出参数的变量不需要赋值。当需要从一个参数没有指定初始值的方法中返回值时,输出参数特别有用。请看下面的实例,来理解这一点

using System;

namespace CalculatorApplication
{
class NumberManipulator
{
public void getValues(out int x, out int y )
{
Console.WriteLine("请输入第一个值: ");
x = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("请输入第二个值: ");
y = Convert.ToInt32(Console.ReadLine());
}

  static void Main(string[] args)
  {
     NumberManipulator n = new NumberManipulator();
     /* 局部变量定义 */
     int a , b;
     
     /* 调用函数来获取值 */
     n.getValues(out a, out b);

     Console.WriteLine("在方法调用之后,a 的值: {0}", a);
     Console.WriteLine("在方法调用之后,b 的值: {0}", b);
     Console.ReadLine();
  }

}
}

编译执行后的结果:

请输入第一个值:
7
请输入第二个值:
8
在方法调用之后,a 的值: 7
在方法调用之后,b 的值: 8


###<h4 id="8">8、方法中的参数,返回值
- 方法中参数的类型有三种

#####in型参数

int 型参数通过值传递的方式将数值传入方法中,即我们在Java中常见的方法。
#####ref型参数

该种类型的参数传递变量地址给方法(引用传递),传递前变量必须初始化。

该类型与out型的区别在与:

 1).ref 型传递变量前,变量必须初始化,否则编译器会报错, 而 out 型则不需要初始化
 2).ref 型传递变量,数值可以传入方法中,而 out 型无法将数据传入方法中。换而言之,ref 型有进有出,out 型只出不进。
####out 型参数

与 ref 型类似,仅用于传回结果。

注意:

1). out型数据在方法中必须要赋值,否则编译器会报错。

eg:如下图若将代码中的sum1方法的方法体

改为 a+=b; 则编译器会报错。原因:out 型只出不进,在没给 a 赋值前是不能使用的

改为 b+=b+2; 编译器也会报错。原因:out 型数据在方法中必须要赋值。

2). 重载方法时若两个方法的区别仅限于一个参数类型为ref 另一个方法中为out,编译器会报错

eg:若将下面的代码中将方法名 vsum1 改为 sum(或者将方法名 sum 改为 sum1),编译器会报错。

######Error 1 Cannot define overloaded method ‘sum’ because it differs from another method only on ref and out 
原因:参数类型区别仅限于 为 ref 与为 out 时,若重载对编译器而言两者的元数据表示完全相同。

class C
{
//1. in型参数
public void sum(int a, int b) {
a += b;
}
//2. ref型参数
public void sum(ref int a, int b)
{
a += b;
}
//3. out型参数
public void sum1(out int a, int b)
{
a = b+2;
}
public static void Main(string[] args)
{
C c = new C();
int a = 1, b = 2;
c.sum(a,b);
Console.WriteLine(“a:{0}”, a);
a = 1; b = 2;
c.sum(ref a, b);
Console.WriteLine(“ref a:{0}”, a);
a = 1; b = 2;
c.sum1(out a, b);
Console.WriteLine(“out a:{0}”, a);
}
}

输出结果:
![这里写图片描述](http://www.runoob.com/wp-content/uploads/2018/03/1521532063-6576-.png)
从代码也可以看出,int 型参数为值传递,所以当将变量 a 传入方法时,变量 a 的值并不会发生变化。而 ref 型参数,由于是引用传递,将变量的值和地址都传入方法中故变量值改变。out 型无法将变量的值传入。但可以将变量的地址传入并为该地址上的变量赋值。 

 - 按值传递参数的问题: 

为什么即使在函数内改变了值,值也没有发生任何的变化呢?

在交换之前,a 的值:100
在交换之前,b 的值:200
在交换之后,a 的值:100
在交换之后,b 的值:200

解析:

调用一个方法时相当于复制一个对象到新分配的内存中,方法完毕对象也就del了,两个变量是不同的两个地址,a只不过是栈里的临时变量而已,和主函数里的变量没有关系,因此不会改变b的值。

而指针和引用直接访问内存地址,故直接修改所指向的对象,两者指向同一变量。
###<h4 id="9">9、类的定义
定义一个类的时候相当于定义了一个数据类型的蓝图,本身没有定义任何数据,但是它定义了类的名称意味着什么,就是说可以在这个类由什么对象组成,以及在这个对象上可以执行什么操作

- 累的定义
关键字 class 后跟类的名称,类的主体包含在一段花括号中{},下面是类的一般形式

class class_name
{
// member variables
variable1;
variable2;

variableN;
// member methods
method1(parameter_list)
{
// method body
}
method2(parameter_list)
{
// method body
}

methodN(parameter_list)
{
// method body
}
}


<p>请注意:</p>
<ul class="list">
<li>访问标识符 &lt;access specifier&gt; 指定了对类及其成员的访问规则。如果没有指定,则使用默认的访问标识符。类的默认访问标识符是 <b>internal</b>,成员的默认访问标识符是 <b>private</b>。</li>
<li>数据类型 &lt;data type&gt; 指定了变量的类型,返回类型 &lt;return type&gt; 指定了返回的方法返回的数据类型。</li>
<li>如果要访问类的成员,你要使用点(.)运算符。</li>
<li>点运算符链接了对象的名称和成员的名称。</li>
</ul>
<p>下面的实例说明了目前为止所讨论的概念:</p>

using System;
namespace BoxApplication
{
class Box
{
public double length; // 长度
public double breadth; // 宽度
public double height; // 高度
}
class Boxtester
{
static void Main(string[] args)
{
Box Box1 = new Box(); // 声明 Box1,类型为 Box
Box Box2 = new Box(); // 声明 Box2,类型为 Box
double volume = 0.0; // 体积

        // Box1 详述
        Box1.height = 5.0;
        Box1.length = 6.0;
        Box1.breadth = 7.0;

        // Box2 详述
        Box2.height = 10.0;
        Box2.length = 12.0;
        Box2.breadth = 13.0;
       
        // Box1 的体积
        volume = Box1.height * Box1.length * Box1.breadth;
        Console.WriteLine("Box1 的体积: {0}",  volume);

        // Box2 的体积
        volume = Box2.height * Box2.length * Box2.breadth;
        Console.WriteLine("Box2 的体积: {0}", volume);
        Console.ReadKey();
    }
}

}

编译执行后的结果:

Box1 的体积: 210
Box2 的体积: 1560


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

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

让我们使用上面的概念来设置和获取一个类中不同的类成员的值:

using System;
namespace BoxApplication
{
class Box
{
private double length; // 长度
private double breadth; // 宽度
private double height; // 高度
public void setLength( double len )
{
length = len;
}

   public void setBreadth( double bre )
   {
        breadth = bre;
   }

   public void setHeight( double hei )
   {
        height = hei;
   }
   public double getVolume()
   {
       return length * breadth * height;
   }
}
class Boxtester
{
    static void Main(string[] args)
    {
        Box Box1 = new Box();        // 声明 Box1,类型为 Box
        Box Box2 = new Box();         // 声明 Box2,类型为 Box
        double volume;                 // 体积


        // Box1 详述
        Box1.setLength(6.0);
        Box1.setBreadth(7.0);
        Box1.setHeight(5.0);

        // Box2 详述
        Box2.setLength(12.0);
        Box2.setBreadth(13.0);
        Box2.setHeight(10.0);
   
        // Box1 的体积
        volume = Box1.getVolume();
        Console.WriteLine("Box1 的体积: {0}" ,volume);

        // Box2 的体积
        volume = Box2.getVolume();
        Console.WriteLine("Box2 的体积: {0}", volume);
       
        Console.ReadKey();
    }
}

}

编译执行后的结果:

Box1 的体积: 210
Box2 的体积: 1560

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

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

下面的实例说明了构造函数的概念:

using System;
namespace LineApplication
{
class Line
{
private double length; // 线条的长度
public Line()
{
Console.WriteLine(“对象已创建”);
}

  public void setLength( double len )
  {
     length = len;
  }
  public double getLength()
  {
     return length;
  }

  static void Main(string[] args)
  {
     Line line = new Line();    
     // 设置线条长度
     line.setLength(6.0);
     Console.WriteLine("线条的长度: {0}", line.getLength());
     Console.ReadKey();
  }

}
}

编译执行后的结果:

对象已创建
线条的长度: 6

默认的构造函数没有任何参数。但是如果你需要一个带有参数的构造函数可以有参数,这种构造函数叫做参数化构造函数。这种技术可以帮助你在创建对象的同时给对象赋初始值,具体请看下面实例:

using System;
namespace LineApplication
{
class Line
{
private double length; // 线条的长度
public Line(double len) // 参数化构造函数
{
Console.WriteLine(“对象已创建,length = {0}”, len);
length = len;
}

  public void setLength( double len )
  {
     length = len;
  }
  public double getLength()
  {
     return length;
  }

  static void Main(string[] args)
  {
     Line line = new Line(10.0);
     Console.WriteLine("线条的长度: {0}", line.getLength()); 
     // 设置线条长度
     line.setLength(6.0);
     Console.WriteLine("线条的长度: {0}", line.getLength()); 
     Console.ReadKey();
  }

}
}

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

对象已创建,length = 10
线条的长度: 10
线条的长度: 6

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

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

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

下面的实例说明了析构函数的概念:

using System;
namespace LineApplication
{
class Line
{
private double length; // 线条的长度
public Line() // 构造函数
{
Console.WriteLine(“对象已创建”);
}
~Line() //析构函数
{
Console.WriteLine(“对象已删除”);
}

  public void setLength( double len )
  {
     length = len;
  }
  public double getLength()
  {
     return length;
  }

  static void Main(string[] args)
  {
     Line line = new Line();
     // 设置线条长度
     line.setLength(6.0);
     Console.WriteLine("线条的长度: {0}", line.getLength());           
  }

}
}

当上面的代码被编译和执行时,它会产生下列结果:
> 对象已创建
线条的长度: 6
对象已删除

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

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

下面的实例演示了静态变量的用法:

using System;
namespace StaticVarApplication
{
class StaticVar
{
public static int num;
public void count()
{
num++;
}
public int getNum()
{
return num;
}
}
class StaticTester
{
static void Main(string[] args)
{
StaticVar s1 = new StaticVar();
StaticVar s2 = new StaticVar();
s1.count();
s1.count();
s1.count();
s2.count();
s2.count();
s2.count();
Console.WriteLine(“s1 的变量 num: {0}”, s1.getNum());
Console.WriteLine(“s2 的变量 num: {0}”, s2.getNum());
Console.ReadKey();
}
}
}

编译执行后的结果:
> s1 的变量 num: 6
s2 的变量 num: 6

你也可以把一个成员函数声明为 static。这样的函数只能访问静态变量。静态函数在对象被创建之前就已经存在。下面的实例演示了静态函数的用法:

using System;
namespace StaticVarApplication
{
class StaticVar
{
public static int num;
public void count()
{
num++;
}
public static int getNum()
{
return num;
}
}
class StaticTester
{
static void Main(string[] args)
{
StaticVar s = new StaticVar();
s.count();
s.count();
s.count();
Console.WriteLine(“变量 num: {0}”, StaticVar.getNum());
Console.ReadKey();
}
}
}

编译执行后的结果:
> 变量 num: 3

###<h4 id="10">10、枚举类型:
枚举是一组命名整型常量。枚举类型是使用 enum 关键字声明的。

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

enum <enum_name>
{
enumeration list
};


enum RoleType{ //关键字+命名
apple, //对象,以逗号分隔
pen,
erase
}
RoleType rt = RoleType.apple; //使用枚举


<p>其中,</p>
<ul class="list">
<li><i>enum_name</i> 指定枚举的类型名称。</li>
<li><i>enumeration list</i> 是一个用逗号分隔的标识符列表。</li>
</ul>
<p>枚举列表中的每个符号代表一个整数值,一个比它前面的符号大的整数值。默认情况下,第一个枚举符号的值是 0.例如:</p>
<pre class="prettyprint">
enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };
</pre>
实例:
下面的实例演示了枚举变量的用法:

using System;
namespace EnumApplication
{
class EnumProgram
{
enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };

  static void Main(string[] args)
  {
     int WeekdayStart = (int)Days.Mon;
     int WeekdayEnd = (int)Days.Fri;
     Console.WriteLine("Monday: {0}", WeekdayStart);
     Console.WriteLine("Friday: {0}", WeekdayEnd);
     Console.ReadKey();
  }

}
}

编译执行后的结果:
> Monday: 1
Friday: 5

###<h4 id="11">11、组件的创建与使用
![这里写图片描述](https://img-blog.csdn.net/20180814113753576?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3E3NjQ0MjQ1Njc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
恬静的小魔龙 CSDN认证博客专家 CSDN博客专家
博主从2017年9月开始在CSDN写博客,于2019年8月成为博客专家,比起那些4个月就成为博客专家的确实水平差了点,但是本来写博客也是为了对学习的东西的记录,慢慢的写出来的东西能帮助更多的人,也慢慢的提升了自己的水平。想起来一个例子:1.01^365=37.8,1.02^365=1377.4,每天进步一点点,一年后就差了几十倍的差距,加油吧少年。
已标记关键词 清除标记
<p><span style="font-size: 24px; color: #e53333;">“中级/进阶篇”讲解特点与内容:</span><br />      <span style="font-size: 18px;">   本“中级”与“进阶”篇, 是面向初中级游戏研发人员,以及Unity中高级学习者。为了更加深入的刨析各个语法的本质,我们采用反编译解读IL中间语言的方式,来解构语法重点与难点。 中级篇内容主要讲解: .Net 框架、里氏替换原则(LSP)、类的属性极其本质特性、IS ,AS 关键字、字符串的“驻留性” 原理、深入解析Equals() 原理、枚举类型、自定义集合、深入解析动态集合特性与内部原理、泛型集合、泛型约束、初级委托与事件讲解等。</span><br /><span style="font-size: 18px;"> "进阶篇"是在中级篇的基础之上,进一步研究与讲解关于IO操作、序列化、正则表达式、系统委托(Action、Function、Predicate等)、反射原理与特性、Linq查询表达式、多线程、线程池、任务、Socket套接字编程(Tcp与UDP协议),以及最后使用Unity开发具备实战价值的通讯聊天程序等。</span></p> <p><br /><span style="font-size: 24px; color: #e53333;">C#“进阶篇”教学详细说明如下:</span><br /><br /><span style="font-size: 18px;">1: IO操作与序列化</span><br /><span style="font-size: 18px;">      学习文件、目录、二进制文件、文本文件的读取与写入底层原理。学习文件序列化与反序列化技能。</span><br /><span style="font-size: 18px;">2: 正则表达式</span><br /><span style="font-size: 18px;">      学习正则表达式的强大作用与常用原字符的含义与应用场景。</span><br /><span style="font-size: 18px;">3: 深入委托与事件</span><br /><span style="font-size: 18px;">      学习Action、Func、Predicate 系统内置委托类型,已经适用场合。学习匿名方法、Lambda表达式。深入解析委托与事件的区别。</span><br /><span style="font-size: 18px;">4: 反射与特性</span><br /><span style="font-size: 18px;">      学习反射的概念与动态调用的重要应用价值,以及Type、Assembley核心类等,最后讲解“特性”技术。</span><br /><span style="font-size: 18px;">5: Linq 查询表达式</span><br /><span style="font-size: 18px;">     学习Linq 查询表达式对于“对象集合”(支持IEnumberable 或IEnumberable<T>) 以及SQL数据库、XML文档方面的强大查询功能。</span><span style="font-size: 18px;">    </span><br /><span style="font-size: 18px;">6: 多线程</span><br /><span style="font-size: 18px;">     学习多线程以及线程传参、线程取得返回数值技术,前台与后台线程、线程的同步、线程池、任务等技术。</span><span style="font-size: 18px;">   </span><br /><span style="font-size: 18px;">7: Socket套接字通讯</span><br /><span style="font-size: 18px;">     学习Socket套接字通讯中,Tcp与UPD通讯协议的不同应用场景,以及各自的演示示例,最后用Unity开发一款实用性的聊天通讯工具。</span></p> <p><span style="font-size: 24px; color: #e53333;"><strong>温习提示:</strong></span></p> <p><span style="font-size: 18px;">      </span><span style="font-size: 18px;">    </span><span style="font-size: 18px;"> 本C# for Unity 使用Virtual Studio2012,以及Unity5.2 进行开发与讲解。(学员使用更高版本,对学习没有任何影响)。      </span></p> <div>A:《C# For Unity系列之入门篇》<br />https://edu.csdn.net/course/detail/4560<br />B:《C# For Unity系列之基础篇》<br />https://edu.csdn.net/course/detail/4595<br />C: 《C# For Unity系列之中级篇》<br />https://edu.csdn.net/course/detail/24422<br /><br /></div>
相关推荐
<p> <strong><span style="color:#E53333;font-size:24px;"> 课程总体目标:</span></strong> </p> <p> <span style="font-size:16px;">    本中级篇面向的学员不再是完全的编程“小白”,而是具备一定C#编程经验,需要进一步查漏补缺、或者需要进一步全面完善自己C#编程知识体系的广大Unity学员。相信通过本中级篇的学习,可以使得Unity初中级开发人员对于编程语言的掌握更进一步;对于开发中大型游戏项目,在编程语言这一层级进一步打下坚实的语言基础。</span> </p> <p> <br /> </p> <p> <span style="font-size:24px;"><span style="color:#E53333;font-size:18px;"><strong>“中级</strong></span><span style="color:#E53333;font-size:18px;"><strong>篇”课程讲解特点:</strong></span></span> </p> <p> <span style="font-size:16px;">      本中级篇面向初中级游戏研发人员,以及Unity中高级学习者。为了更加深入的刨析各个语法的本质,我们采用反编译解读IL中间语言的方式,来解构语法难点,使得学员最短时间掌握语法本质。</span> </p> <p> <br /> </p> <p> <span style="font-size:18px;color:#E53333;"><strong>本课程讲解内容:</strong></span> </p> <p> <span style="font-size:16px;"> </span><span style="font-size:16px;">     </span><span style="font-size:16px;">"C#(for Unity)中级篇" 在“C#入门”、“基础篇”的基础之上,从以下四个方面着重研究我们游戏开发(包含软件开发)过程中,C#最重要、最实用的技能模块,使得广大游戏研发人员,对于C#这门Unity脚本有进一步更加完善的认识。</span><br /> <br /> <br /> <span style="font-size:16px;"><strong>一:.Net 框架讲解。</strong></span><br /> <span style="font-size:16px;">    A) .Net 发展历史。</span><br /> <span style="font-size:16px;">    B)  IL  中间语言。 CLR  公共语言运行时。</span><br /> <span style="font-size:16px;">    C) 多维数据(常用二维数组)与交错数组。</span><br /> <span style="font-size:16px;">    D) 可变参数 Params</span><br /> <span style="font-size:16px;">    E) 进一步解释“实参”,“形参”。</span><br /> <span style="font-size:16px;">    F) 类的实例化内存分配机制。</span><br /> <br /> <span style="font-size:16px;"><strong>二:深入学习对象类型</strong></span><br /> <span style="font-size:16px;">    A)  里氏替换原则(LSP)</span><br /> <span style="font-size:16px;">    B)  类的属性极其本质特性</span><br /> <span style="font-size:16px;">    C)  IS ,AS 关键字</span><br /> <span style="font-size:16px;">    D)  深入学习字符串理论</span><br /> <span style="font-size:16px;">        1] 字符串的“驻留性” 原理。</span><br /> <span style="font-size:16px;">        2] 字符串==与Equals() 的本质区别</span><br /> <span style="font-size:16px;">        3] 更多字符串常用方法学习。</span><br /> <span style="font-size:16px;">    E)  枚举类型以及适用场合。</span><br /> <br /> <span style="font-size:16px;"><strong>三:深入学习集合特性</strong></span><br /> <span style="font-size:16px;">    A)  什么是索引器,以及索引器的适用范围。</span><br /> <span style="font-size:16px;">    B)  学习自定义集合类,以及深入了解Foreach 语句的原理。</span><br /> <span style="font-size:16px;">    C)  深入学习 ArrayList,了解内部存储机制以及原理。</span><br /> <span style="font-size:16px;">    D)  深入学习 HashTable,了解内部存储机制以及原理。</span><br /> <span style="font-size:16px;">    E)  为什么学习泛型集合?</span><br /> <span style="font-size:16px;">    F)  泛型集合与普通集合的性能测试对比实验。</span><br /> <span style="font-size:16px;">    G)  学习“泛型约束”,以及“泛型约束”的适用条件。</span><br /> <br /> <span style="font-size:16px;"><strong>四:委托与事件</strong></span><br /> <span style="font-size:16px;">        A)  什么是委托,先从讲故事学习起:“老板来啦”!</span><br /> <span style="font-size:16px;">    B)  反编译掌握委托的本质。</span><br /> <span style="font-size:16px;">    C)  委托的四大开发步骤。</span><br /> <span style="font-size:16px;">    D)  什么是事件,以及委托与事件的区别。</span><br /> <span style="font-size:16px;">    E)  事件的常用使用方式。</span> </p> <p> <br /> </p> <p> <span style="font-size:18px;color:#E53333;">温馨提示:</span> </p> <p> <span style="font-size:16px;">      本C# for Unity 使用Virtual Studio2012,进行开发与讲解。(学员使用更高版本,对学习没有任何影响)</span> </p> <p> <!--StartFragment --> </p> <div> 一、热更新系列(技术含量:中高级):<br /> A:《lua热更新技术中级篇》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27087<br /> B:《热更新框架设计之Xlua基础视频课程》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27110<br /> C:《热更新框架设计之热更流程与热补丁技术》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27118<br /> D:《热更新框架设计之客户端热更框架(上)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27132<br /> E:《热更新框架设计之客户端热更框架(中)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27135<br /> F:《热更新框架设计之客户端热更框架(下)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27136<br /> 二:框架设计系列(技术含量:中级):<br />  A:《游戏UI界面框架设计系列视频课程》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27142<br /> B:《Unity客户端框架设计PureMVC篇视频课程(上)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27172<br /> C:《Unity客户端框架设计PureMVC篇视频课程(下)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27173<br /> D:《AssetBundle框架设计_框架篇视频课程》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27169<br /> 三、Unity脚本从入门到精通(技术含量:初级)<br /> A:《C# For Unity系列之入门篇》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/4560<br /> B:《C# For Unity系列之基础篇》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/4595<br /> C: 《C# For Unity系列之中级篇》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24422<br /> D:《C# For Unity系列之进阶篇》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24465<br /> 四、虚拟现实(VR)与增强现实(AR):(技术含量:初级)<br /> A:《虚拟现实之汽车仿真模拟系统 》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/26618<br /> 五、Unity基础课程系列(技术含量:初级)<br />  A:《台球游戏与FlappyBirds—Unity快速入门系列视频课程(第1部)》<br />  <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24643<br /> B:《太空射击与移动端发布技术-Unity快速入门系列视频课程(第2部)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24645<br />  C:《Unity ECS(二) 小试牛刀》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27096<br /> 六、Unity ARPG课程(技术含量:初中级):<br /> A:《MMOARPG地下守护神_单机版实战视频课程(上部)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24965<br /> B:《MMOARPG地下守护神_单机版实战视频课程(中部)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24968<br /> C:《MMOARPG地下守护神_单机版实战视频课程(下部)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24979<br /> </div> <p> <br /> </p>
<p> 你想当“李逍遥”式的“大侠”吗? 这里无需计算机基础,无需编程经验,你也不必是计算机专业的在校大学生....只要爱好游戏,怀揣梦想! 有一定自主学习能力,跟着刘老师从“编程小白”修炼为游戏研发“大虾”吧!!!学习好Unity,其先决条件是一定要有稳固、扎实的编程基础!课程 《C# For Unity系列之入门篇》配套学习资料链接:http://pan.baidu.com/s/1gflxreN 密码:sou5;刘老师讲Unity学员群(2) 497429806 </p> <p> <br /> </p> <p> <!--StartFragment --> </p> <div> 一、热更新系列(技术含量:中高级):<br /> A:《lua热更新技术中级篇》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27087<br /> B:《热更新框架设计之Xlua基础视频课程》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27110<br /> C:《热更新框架设计之热更流程与热补丁技术》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27118<br /> D:《热更新框架设计之客户端热更框架(上)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27132<br /> E:《热更新框架设计之客户端热更框架(中)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27135<br /> F:《热更新框架设计之客户端热更框架(下)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27136<br /> 二:框架设计系列(技术含量:中级):<br />  A:《游戏UI界面框架设计系列视频课程》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27142<br /> B:《Unity客户端框架设计PureMVC篇视频课程(上)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27172<br /> C:《Unity客户端框架设计PureMVC篇视频课程(下)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27173<br /> D:《AssetBundle框架设计_框架篇视频课程》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27169<br /> 三、Unity脚本从入门到精通(技术含量:初级)<br /> A:《C# For Unity系列之入门篇》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/4560<br /> B:《C# For Unity系列之基础篇》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/4595<br /> C: 《C# For Unity系列之中级篇》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24422<br /> D:《C# For Unity系列之进阶篇》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24465<br /> 四、虚拟现实(VR)与增强现实(AR):(技术含量:初级)<br /> A:《虚拟现实之汽车仿真模拟系统 》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/26618<br /> 五、Unity基础课程系列(技术含量:初级)<br />  A:《台球游戏与FlappyBirds—Unity快速入门系列视频课程(第1部)》<br />  <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24643<br /> B:《太空射击与移动端发布技术-Unity快速入门系列视频课程(第2部)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24645<br />  C:《Unity ECS(二) 小试牛刀》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27096<br /> 六、Unity ARPG课程(技术含量:初中级):<br /> A:《MMOARPG地下守护神_单机版实战视频课程(上部)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24965<br /> B:《MMOARPG地下守护神_单机版实战视频课程(中部)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24968<br /> C:《MMOARPG地下守护神_单机版实战视频课程(下部)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24979<br /> </div> <p> <br /> </p>
<span style="color:#000000;font-size:24px;"> <p>      <span style="font-size:18px;"> 本套C#语言教程,全部采用案例化教学模式。结合C#知识点在实际游戏中具体的应用场景,让初级学员快速、深入的学好C#语言,为进一步全面、高效的学习Unity游戏引擎,制作精良的游戏产品,打下坚实的语言基础!</span><br /> <span style="font-size:18px;">       真正学好Unity,其先决条件是一定要有稳固、扎实的编程基础!因此目前绝大多数(线下)Unity培训机构(一般4-5个月)都会先给学员讲解C# for Unity编程加强课程。(一般高校的编程课程内容少、不深入...)</span><br /> <span style="font-size:18px;">        本套《C# for Unity》课程共分为“入门篇”、“基础篇”、“中级篇”、“进阶篇”,分别对应于完全“零”编程基础、较少编程基础、需要强化C#编程、需要深入学习C#脚本,等各类型学员群体。</span><br /> <span style="font-size:18px;">      说明:  本课程使用Virtual Studio2012,以及Unity5.2 进行开发与讲解。(学员使用更高版本,对学习影响不大)</span> </p> <p> <!--StartFragment --> </p> <div> 一、热更新系列(技术含量:中高级):<br /> A:《lua热更新技术中级篇》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27087<br /> B:《热更新框架设计之Xlua基础视频课程》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27110<br /> C:《热更新框架设计之热更流程与热补丁技术》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27118<br /> D:《热更新框架设计之客户端热更框架(上)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27132<br /> E:《热更新框架设计之客户端热更框架(中)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27135<br /> F:《热更新框架设计之客户端热更框架(下)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27136<br /> 二:框架设计系列(技术含量:中级):<br />  A:《游戏UI界面框架设计系列视频课程》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27142<br /> B:《Unity客户端框架设计PureMVC篇视频课程(上)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27172<br /> C:《Unity客户端框架设计PureMVC篇视频课程(下)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27173<br /> D:《AssetBundle框架设计_框架篇视频课程》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27169<br /> 三、Unity脚本从入门到精通(技术含量:初级)<br /> A:《C# For Unity系列之入门篇》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/4560<br /> B:《C# For Unity系列之基础篇》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/4595<br /> C: 《C# For Unity系列之中级篇》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24422<br /> D:《C# For Unity系列之进阶篇》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24465<br /> 四、虚拟现实(VR)与增强现实(AR):(技术含量:初级)<br /> A:《虚拟现实之汽车仿真模拟系统 》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/26618<br /> 五、Unity基础课程系列(技术含量:初级)<br />  A:《台球游戏与FlappyBirds—Unity快速入门系列视频课程(第1部)》<br />  <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24643<br /> B:《太空射击与移动端发布技术-Unity快速入门系列视频课程(第2部)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24645<br />  C:《Unity ECS(二) 小试牛刀》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/27096<br /> 六、Unity ARPG课程(技术含量:初中级):<br /> A:《MMOARPG地下守护神_单机版实战视频课程(上部)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24965<br /> B:《MMOARPG地下守护神_单机版实战视频课程(中部)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24968<br /> C:《MMOARPG地下守护神_单机版实战视频课程(下部)》<br /> <img src="file://C:/Users/17849/AppData/Roaming/Tencent/QiDian/Temp/%25W@GJ$ACOF(TYDYECOKVDYB.png" />https://edu.csdn.net/course/detail/24979<br /> </div> <p> <br /> </p> </span>
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值