Unity C# 爆破计划(一):预备 & 基本操作

文章目录

    • 〇、学习清单与科普
      • 学习清单
      • 啥是 C#
      • .NET 的来龙去脉
    • 一、基本操作
      • 环境与 IDE
      • 新建工程
      • Hello World


〇、学习清单与科普

作者学习 C# 这门语言的目的性非常强:掌握足够应对游戏开发编程的内容,涉及 .NET 框架本身的知识对我们并不重要。

骂人:
说个事,有个网站 www.233tw.com 不要脸转我文章还不标出处,这种没有丝毫版权意识的人还想做游戏,大家品一品嗷。不屑于为此生气,因为他不配,就祝宁的游戏上架第一天被破解好了~

学习清单

最近看到了 Unity 大学的广告,这是个官方推出的培训实体课,看了一下他们的学习内容,又看了看价格,算了算了,感觉一半是智商税。

下面是 Unity 大学广告给出的 C# 部分授课清单:

  1. 基础阶段:
    • 对象与基本操作
    • 变量与常量
    • 类型与运算符
    • 条件语句
    • 循环
    • 数组
    • 方法和函数
    • 枚举和结构体
    • 属性
    • 命名空间
    • 继承
    • 静态类型
    • 基本算法
  2. 强化阶段:
    • 多态(抽象类)
    • 多态(接口)
    • 泛型
    • 集合
    • 列表
    • 字典
    • 栈和队列
    • 异常处理
    • LINQ
    • 单例模式
    • 对象池
    • 文件读取类
    • 委托与事件

看了这~~么长的清单我也是醉醉的,有一种强行凑数的感觉;不过既然他们按这个教,我们就假设学了这些就够用好了,本次爆破计划也(大体上)按照这个来写。

啥是 C#

C#(读作“c sharp”)是微软主导研发的通用编程语言,之所以名字里带 C 是因为它语法风格跟 C++ 很像,名字里带“#”这个诡异的符号,则是因为它的设计者觉得这是比 C++ 更 ++ 的语言,然而实际上也就那样吧,不黑也吹不起来。

作者是 C++ 背景,也假设你有一点点 C++ 知识,因此有些过于常识性的说明会略过。

C# 声称其具有的特点:

  • 完全面向对象:C# 诞生在一个激进倡导面向对象的年代,“完全”的意思是不让你定义任何全局函数和数据,万物都是类,虽然时间已经证明了这样并没有什么本质上的优越性;
  • 简单:你不需要在密集编程时迟疑 1 秒钟来品味 C++ 那份令人又恨又爱的微妙、含蓄、隐晦与禅意;
  • 整洁:任何做不到这一点的程序员都应该锥刺股;
  • 表达力强:不知所云;
  • 内存安全:这个词几乎等价于“运行时垃圾回收(GC)”,Rust 除外,为你带来一份昂贵的安全感;
  • 设计先进:这个词几乎等价于“类具有属性的概念、支持反射”,为你提供些许便利;
  • 语法严谨:形式好看,代码护眼,至少相比于 C/C++/Java;
  • “不安全模式”允许指针、具有与 C++ 的互操作性:“虽然我不咋地,但我朋友牛掰”。

C# 未声称但确实具有的优点:

  • 背靠大厂:虽然垃圾 Windows 狗都不用,但毕竟用户群体庞大;
  • 运行时 .NET 类库极为完善:毕竟是商业产品;
  • 不幸被一个用户量庞大的游戏引擎选为了开发语言,因此刚需进一步扩大。

C# 未声称但确实具有的缺点:

  • 基本绑定 Windows 生态:作为一个设计初衷是跨平台的语言实则并不跨平台,Unity 是个例外,后面会写 Unity 中 C# 的运行时机制;
  • 执行效率低:所有带 GC 语言的通病,因此不适合做高性能算法;
  • 微软与生俱来的那份睾贵的繁复、冗余与形式主义。

以上均为杂谈,除 C# 的读法外,没有任何值得记忆的知识点。

以下补充俩知识点:

  • C# 是 二次编译型语言,与 Java 类似,源码首先经编译器 编译为中间语(Intermediate Language,IL),运行时再由 C# 运行时(由 .NET 或其替代品提供)解释为机器码
  • 源文件扩展名 .cs,没有头文件的概念。

.NET 的来龙去脉

.NET 是微软主导研发的编程框架,它允许我们用 C#(首选语言)、Visual Basic Roslyn、C++ 等各种语言编程。之所以能够做到“语言不敏感”,是因为使用了虚拟机技术,将所有语言都编译成 IL 中间语,说白了就是一个操着各种方言的 JDE,概念上是非常伟大的。

它包括这些部分:

  1. 通用语言运行时(Common Language Runtime,CLR):实际上是一个虚拟机,它负责 IL 的运行时解释,是实现“一次编译,到处运行”的底层基础,相当于 Java 中的 JRE;
  2. 通用类型系统(Common Type System,CTS):在 CLR/IL 中使用的数据类型,它的存在统一了所有语言中的数据类型;
  3. .NET 类库等:不需要关心的东西,就不去操心。

此外,.NET 框架的所有实现都内置各种语言(至少是 C#)到 IL 的编译器

在 .NET 的概念与规范下,产生了 Microsoft .NET Framework(最古老最成熟的闭源 Windows 独占开发框架,雨女无瓜)、.NET Core(微软主导开源运营的新型框架,并且由微软积极推动跨平台)和 Mono(开源第三方框架,理念上推动跨平台,后由微软运营,但保持开源,诞生比 .NET Core 早很多)三大生态系统,它们都是 .NET 的具体实现。

目前 Unity 采用的就是 Mono 框架,通过其产生 IL,再经由 Unity 自研技术 IL2CPP 将 IL 转译为 C++ 代码,最后再在各个平台上用原生 C++ 编译器产生该平台下的原生客户端程序,从而(极为曲折地)实现了跨平台与执行效率的兼得。

每天一个小问题:

  1. 既然最后还是用 C++ 实现跨平台的,为什么不直接用原生 C++ 作为 Unity 的开发语言?—— 你问官方啊,我也想知道;
  2. 以后 Unity 会转用 .NET Core 吗?—— 关心这个没有任何实际意义;
  3. 那 Unity 能用 VB 开发吗?—— 理论上可以用易语言开发,实际上你还是得学 C#。

一、基本操作

Covers:对象与基本操作

环境与 IDE

学习 C# 不一定非得安装巨大的 Visual Studio,可以只 安装 .NET Core 并配合 IDE,如 VS Code 或作者比较喜欢的 JetBrains Rider。

  • .NET Core 是傻瓜式安装的,完毕后打开一个 cmd 运行命令 dotnet --info 确认安装成功,再安装喜欢的 IDE,环境就搭建完毕了;

  • 如果安装 Visual Studio,需要确保“.NET 桌面开发”这个工作负载安装完整,可选项目建议选中“.NET 分析工具”和“实时调试器”。

新建工程

通过 IDE 新建一个控制台项目;如果你用 .NET Core,那么也可以用命令行完成:

  1. cd 到将要存放工程目录的父目录;
  2. dotnet new console -o 工程名,等待完成(初次运行这个命令可能会卡住一会儿,耐心),就会在当先目录下创建与工程名同名的子目录,这就是我们的工程目录;
  3. 工程目录下的 工程名.csproj 就是工程的管理文件,用 IDE 打开即可打开整个工程。
  1. 如果用 IDE 创建工程,可能会产生一个 .sln 文件,这是解决方案的管理文件,在 Unity 开发中也会遇到。现阶段没什么用(因为解决方案里也只有一个工程而已),与 .csproj 文件起到同样的功能;
  2. dotnet 命令只有 .NET Core 才有,如果用 Visual Studio,它安装的是 .NET Framework,就老老实实用 IDE 来完成各种操作吧。

Hello World

在工程目录中找到 Program.cs 这个源码文件,它就包含了程序的入口方法。打开该文件,删掉所有内容,手敲下面的代码(没错,其实跟原有内容差不多,但手敲一遍也许能加深记忆):

// File: Program.cs
using System;

namespace 工程名
{
    class Program
    {
        static void Main(string[] args)
        {
            // Console print:
            Console.WriteLine("Hello World!");
            Console.Write("What's your name? ");
            
            // Console read input:
            string name = Console.ReadLine();
            
            // Console print with string combination:
            Console.WriteLine("Hello, " + name + "!");

            // Wait for a key press, then exit:
            Console.ReadKey();
        }
    }
}

接着构建工程,用命令行的方法是:

  1. 进入工程目录;
  2. 执行 dotnet build 等待完成。

在命令行输出内容中有产生的可执行文件位置,给出的是一个 dll 文件,而同名的 exe 文件就在同一位置:

...
  HelloWorld -> (工程目录)\bin\Debug\net5.0\HelloWorld.dll

已成功生成。
    0 个警告
    0 个错误

运行观察效果,可以直接打开产生的 exe,也可以命令行执行:dotnet run

知识点:

  • 用双斜杠 // 引导行注释,/**/ 包围注释
  • using 引入依赖,我们这里依赖了 System 这个命名空间,有了它才能操作控制台;
  • namespace 定义命名空间,最好与项目名一样,我们自己的代码全都包括在这个命名空间中;
  • class 定义类,C# 硬性要求用类包括程序的入口函数;
  • 程序的入口点必须是 static void 函数,函数名为 Main,区分大小写,括号中的形参 string[] args 用于接收运行参数,现在还用不到,因此也可以留空;
  • 控制台交互需要借助 System 命名空间中的 Console 类完成
  • C# 里不区分方法和函数,函数就是方法,方法就是(某个类具有的)某种功能,用点号 . 调用对象的方法或类的静态方法
  • 字符串可以直接用加号运算符 + 拼接

方法:

  • Console.WriteLine:控制台打印并换行;
  • Console.Write:控制台打印但不换行;
  • Console.ReadLine:从控制台读取一行用户输入,当用户回车时返回读取到的字符串;
  • Console.ReadKey:从控制台等待用户按下某个键,返回用户按下的键,在这里用于卡住控制台,避免直接运行 exe 文件时程序一闪而过。

进一步深挖一点,看不懂可以忽略:

  • Console 是个类,但这里没有它的实例,原来它是一个 静态类,静态类不能实例化,其所有方法都是静态的;
  • 那么我们的类 Program 其实也可以定义成静态类,在 class 关键字前用 static 修饰即可,编译运行效果一样。

T.B.C.

你可能感兴趣的:(Unity,C#,c#,编程语言,unity)