通过文章记录自己的C#学习历程😀,后续可能会继续更新Unity的学习笔记,感谢浏览

我在这里介绍一个挺好用的C#网站,结构层次清晰,适合小白使用~

C# 属性(Property) | 菜鸟教程

下面几部分的内容我会把C#分成基础的几个部分进行学习,欢迎大家批评指正。

1:C#和.NET渊源

C#语言是微软于2000年6月发布的一种编程语言,它从定义上是从C和C++继承而来的,从很多方面更像java语言,个人认为从计算机的层级方面来看,他们确实更像兄弟,汇编语言/机器语言像爷爷,是偏向汇编层面,C语言是父亲,偏向系统层级,而C++像C的表弟,C++早期的编译方法是将C++的代码编译成C代码然后再调用C的编译器来生成机器码,而C++的目标是提高编程人员的生产率,Java和C#,objectC则是孙子,偏向应用层级,学习哪个基本取决于自己的学习路线。

但是C#需要和微软的.NET框架共同工作的,说起这个就得提一提.NET平台了,它是起源于2002年2月14日,今年2月14日迎来了它20岁的生日,从发布至今已经经历了多个版本的迭代更新,我们可以使用 .NET 构建多种类型的应用程序,为了解释它,可以引用Java,之前为了使用jave实现跨平台而设计了java虚拟机,Java代码只需编译成字节码,通过不同的虚拟机(为不同的平台而有不同的虚拟机)解析运行,从而实现的跨平台,也就是说一套同样的Java代代在windows、linux上编译出来的字节码可能不同,但最后由各自实现的虚拟机执行,这里的.NET就相当于一口大锅,我们要生产各种菜品(不同平台的比如web应用,移动端ios,andriod,云服务,游戏开发等),那么制作菜品的工艺就比如C#,F# ,Visual Basic。

.NET Framework开发平台包括公共语言运行库CLR(common language runtime)和基类库BCL(Base Class Library),前者负责管理代码的执行,程序的运行环境,内存的分配,垃圾收集,安全检查等工作,在计算机中,为.NET Framework编写的所有应用程序都共享相同版本的CLR,后者BCL则提供了丰富的类库来构建应用程序。

.NET的中间语言:dotnet CLI工具使用C#编译器,会将C#源码转换为中间语言IL(Intermediate Language)代码,并将IL存储在程序集(DLL或EXE文件)中,IL代码语句就像汇编语言指令,由.NET的虚拟机Core CLR执行,它从程序集中加载IL代码,再由即时编译器(JIT)将IL代码编译成本机CPU指令,最后由于CPU执行,以此,微软能为LInux、macOS和Windows创建CLR。

2:从Unity中创建C#脚本

由上面的介绍我们直到,想要应用C#编程,必须先下载.NET,我们可以通过.NET官网免费下载。同时需要下载一个能够书写C#的编程工具,我这里采用了VSCODE,因为买的工具书(C#入门经典)里介绍的编程是VSCODE,安装好了VSCODE和.NET以后我们可以打开VSCODE,进入页面后点击ctrl+shift+x进入扩展页面,分别搜索并安装C#、C# Extensions 、Chinese Language 、Debugger for Unity 、Unity Code(用来补全代码),

安装完成后则可以进入unity中,在windows选项中选择penel(面板)设置好各个组件的位置,在Project里面看到了Assets,在scene处点击右键创建新的文件夹,并命名,scene代表我们的场景管理,在此处我们可以创建并管理游戏中的很多场景,接着打开scene,在下方scripts里面新建文件夹,并在文件夹里右键新建scripts,这里的scripts代表的就是我们的脚本,那么何为脚本,假设在我们的场景中有一个小球,我们需要在游戏中让小球有各种移动方式,那么我们就需要在脚本中书写我们的代码,并将脚本挂载在我们的object上,从而使得物体可以达到我们的移动方法。

此时我们双击我们新建的script,跳转至vscode页面,会有如下的页面:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using System在C#中代表引入命名空间(namespace),那么何为命名空间呢?

做个具体的解释,我们在计算机的同一文件夹无法创建两个相同名字的文件,如果想要实现此操作,必须为此文件重新创建一个文件夹,此处的命名空间就是起到了重新创建文件夹的作用,我们在coding中把一些全局实体分别放在了各个命名空间中,从而与其他全局的实体分割开来,因此它的作用就是建立一些相互分隔的作用域。

我们在此处是引用了C#中的命名空间Collections和Collections.Generic

System命名空间包含基本类和基类,这些类定义常用的值和引用类型、事件和事件处理程序、接口、属性和异常处理。其他类提供的服务支持数据类型转换、方法参数操作、数学运算、远程和本地程序调用、应用程序环境管理和对托管与非托管的引用程序的监管。

public class NewBehaviourScript : MonoBehaviour

public意思是全局的,class是类,后面加类名字,: MonoBehaviour是继承自父类MonoBehaviour

class是什么呢?

类是群体和个体之间的关系,一个是概念,一个是实体,比如人类和张三的例子,而类内的变量和常量表明了这个类的属性,相当于给张三各种装饰,类内的函数表明了对象具备什么能力,就像人具备了各种能力一样

MonoBehaviour是什么呢?

首先,MonoBehaviour是一种类,一个unity的脚本必须继承自MonoBehaviour,而unity引擎的所有代码都需要按照规则顺序执行,分别从Object→Component→Behaviour→Monobehaviour,因此继承自MonoBehaviour的脚本就是充当了组件,所以当我们为一个Object添加脚本时,它必须时继承自MonoBehaviour的,不然无法添加组件。有关生命周期等问题,后续讨论。
 

继承是什么呢?

继承是类与类之间的一种关系,在实际的写代码过程中,我们难免会有很多相同的功能需要调用多次,如果重复写代码不仅会增加我们的工作量,而且会使我们的代码显的比较拖沓,因此如果有一种方式可以将一个类中的方法和属性直接使用在另一个类中,将大大提高效率,这就是继承,继承者为子类,被继承者就是父类,具体的知识见后续。

{

 // Start is called before the first frame update

在C#中,//可以添加注释,/**/可以注释段落

    void Start()

    {

       理解为不含参数的一种方法,也是开始介入点

    }

    // Update is called once per frame

    void Update()

    {

       理解为实时更新的方法

    }

}

因此理解完从unity中打开C#的全部操作以后,就可以进一步学习C#的基础部分

3:C#基础—Ⅰ

(1):Debug接口

Degbug代表unity提供的日志接口,此间输入内容可以在Unity中输出,比如在C#中书写代码Debug.Log(HelloWorld),则会在Unity的console面板输出HelloWorld,我们学习始终是和unity结合的,如果是从vscode中新建console项目,则需要调用Console.WriteLine()命令,

Debug.Log("HelloWorld");  //打印普通日志

Debug.LogWarning("HelloWorld");//打印警告

Debug.LogError("HelloWorld");//打印错误

(2):变量

变量内存中开辟的一块用于存储数据的空间,变量的值是可以改变的,它的存储单位是字节(byte),一个字节包含8个二进制位(bit),注意,字节是计算机能够使用的最小单位,而不是bit,那么二进制又是什么呢?

00000000

二进制的原则是逢1进位,上面表示了一个字节的内存空间,8个0代表0

00000001

代表二进制数1

00000010

代表二进制数2,以此类推

变量包含了整数型、浮点型、字符型

整形变量(整数)

1个字节:有符号sbyte(-127-128),无符号byte(0-255)

2个字节:有符号short(-32768-32767),无符号ushort(0-65535)

4字节:有符号int,无符号uint,存整数尽量用int,因为空间够用。

8字节:有符号long,无符号ulong

浮点型(小数)

4字节:单精度浮点,float,精度8位。书写格式为具体数字+f,比如1.2f

8字节:双精度浮点型double.                                                 同理  1.2d

16字节:128位数据类型decimal                                                    1.2m

非数值型

char字符,2字节,存储单个字符,使用单引号;

string字符串,存储文本,使用双引号“”。

Bool(布尔)类型,一个字节,可以直接赋值true和false

存储任意类型的对象

有一种名为object的特殊类型,可以存储任意类型的数据,但这种灵活性会以混乱的代码和较差的性能为代价的

动态存储类型

一种特殊的类型名为dynamic,可以存储任意类型的数据,灵活性比Object还强,代价也是性能下降,具体作用用到了再添加。

(3)变量的声明和赋值

int a;

a=10;   //变量的赋值(当变量第一次赋值的时候,称之为初始化)

int b=2;   //变量的声明+赋值

int c=30,d=40;     //单行赋值多个数据类型的变量

        

Debug.Log("a:"+a+"b:"+b+"c:"+c+"d:"+d);     //"a"+a:字符串的拼接形式;

使用var来声明局部变量,编译器将从在赋值操作符=之后赋予的值自行推断类型。

(4)变量的命名规则

匈牙利命名法(驼峰式),前面小写,后面大写;

int iHpVaule=2000;                                      short shID=100;

srting strMonsterName="树人";                   bool bOpen=true;

char chUnicode="a";                                    long lID=1000;

更多推荐

零基础自学C#——Part1:C#与.NET、C#与Unity接口、变量