c#
文章平均质量分 78
Metallic Cat
这个作者很懒,什么都没留下…
展开
-
Unity脚本 --- 常用API(常用类) --- Component类和Transform类
1.Translate方法,输入一个参数 --- 同时包含距离和方向的向量,就可以将物体移动到对应的位置。原创 2023-01-17 23:19:24 · 983 阅读 · 0 评论 -
Unity脚本 --- VS调试工具
此时在下面就会出现一个监视窗口,在监视窗口中我们可以输入想要监视数值的变量,也可以输入简单的计算公式以及相应的变量来看结果,同时我们还可以通过this调用组件来看组件中的各项数值(PS:在调试时使用即时窗口也能实现同样的功能)2.在调试的时候点击f11可以逐语句调试,同时当我们在调试的时候想要查看某个值或者某个组件设计到的数值的时候,我们可以点击右键,然后点击添加监视。Update方法会在每一帧中被调用执行,有的时候我们并不想看每一帧的调试结果,只想看到某一帧的调试结果时,就可以使用单帧调试法。原创 2023-01-04 20:16:25 · 1795 阅读 · 0 评论 -
Unity脚本(2) --- 脚本生命周期以及脚本的控制台调试
控制台如何打开?1.第一种方法是点击Windows然后选择Console即可;第二种则是利用快捷键:ctrl + shift + c2.对之前的内容做一个修正 --- 我们需要给Debug.Log()方法传一个参数,这个参数可以是任意类型的变量,该方法执行的时候会将传进来的变量的数据以字符串的形式在Unity控制台中输出关于控制台的一些功能的介绍:1.Clear --- 清除控制台中所有已显示的内容2. Collapse --- 折叠相同项 --- 将在控制台中输出的相同项折叠起来。原创 2022-12-13 11:09:41 · 1442 阅读 · 0 评论 -
Unity脚本 (1) --- 创建脚本以及挂载脚本的本质,脚本模板的修改
2.每当我们给游戏物体挂载一个组件(对象) / 脚本的时候,实际上发生的是一个组件 / 脚本对象通过对应的类实例化出来,然后一个引用被创建并指向组件对象,接着在游戏物体数组中存储这个引用。2.脚本的本质就是一个类,当我们把一个脚本挂载到游戏物体上的时候,实际发生的过程是通过脚本中的类实例化了一个对象挂载到游戏物体上,然后我们就是通过这个对象调用方法来控制游戏物体的。写一个脚本(编程文本文件),挂载到对象上,游戏运行的时候会自动读取对象上挂载的代码并将其运行,使得对象能够根据代码做出对应的反应。原创 2022-12-10 21:34:27 · 4512 阅读 · 0 评论 -
C# --- 结构体
1.结构体与类的第一个区别是创建的时候使用的关键字不同 --- 结构体 struct ; 类是 class2.结构体中不能够自定义无参构造函数,因为结构体中已经隐式包含了一个无参构造函数,这个不像类中自带无参构造函数可以被我们替代,它是无法替代的3.除了上面这两个区别外,结构体中可以有成员字段,方法,属性和自动属性(包括静态的),同时我们还可以自己添加有参构造函数4.在结构体中调用一个自动属性前需要先将其对应的隐式字段初始化(在类中不需要),而负责初始化功能的则是构造函数,如果说我们创建结构体对象的时候使用原创 2022-12-07 12:03:08 · 2842 阅读 · 0 评论 -
类和对象之 封装 继承 与 多态
1.进行类继承的前提是我们要有两个类,且已经确定好了这两个类谁为父类谁为子类2.先创建父类然后再创建子类3.创建子类的时候我们要使用继承语法,使用的方式是在创建子类时的第一条代码的最后面加上冒号 : 和父类的类名 4.继承的本质就是将父类中的代码全都拷贝了一份到子类中,此时子类具有父类的代码,但是父类不具有子类的代码(换句话说就是子类能够使用父类和自己的成员,但是父类只能够使用父类成员)5.父类的 public 成员既能够被其子类调用,也能被进行其它类外调用procted 成员只能够被其子类调用,不能够进行原创 2022-12-06 16:34:23 · 380 阅读 · 0 评论 -
C#重启 --- 类和对象
类和对象也能够使用数组数据结构,上图就是创建一个数组,里面装的都是同一类的对象数组的元素个数等于数组的长度,通过点操作符来调用 Lenght 属性可以访问得到元素个数121.类中有字段,与字段对应的属性,构造函数以及方法1.创建一个自动属性的时候,就相当于我们创建了一个字段以及一个get方法和set方法这样自动属性中的get方法是固定的,我们无法改变,访问这个自动属性的时候就会调用get方法,返回对应字段中的数据。原创 2022-11-25 22:10:54 · 534 阅读 · 0 评论 -
C#重启 --- 枚举
上图这个是在将字符串类型转换为枚举类型(如果有的话)熟悉通过Enum基类调用Parse方法,第一个参数后面会讲,第二个参数就是我们要转换的字符串传唤成功后就会返回一个object类型的数据,我们不能将这个数据直接传给枚举类型变量(原创 2022-11-13 20:04:24 · 1057 阅读 · 0 评论 -
C#重启 --- 数据类型
2.在方法中创建引用类型的变量时,这个变量的声明在栈中,同时也会在栈中给这个变量开辟一个内存空间,但是这个内存空间中存储的不是变量对应的数据(这些数据会存储在堆区开辟的内存空间中),存储的是变量所对应的堆区内存空间的内存地址(32为系统中,为这个变量开辟的空间大小为4个字节,64位则为8个字节)1.值类型变量在栈中的内存空间中存储是数据本身,引用类型变量在栈中的内存空间中存储的是内存地址,这个内存地址对应的内存空间在堆区,且存储的是变量对应的数据。原创 2022-11-11 21:35:34 · 639 阅读 · 0 评论 -
C#重启 --- 数组
3.通过交错数组名 + 索引能够访问到交错数组中对应的一维数组,此时对这个一维数组加索引就能够访问到这个数组中对应的元素,或者是加点操作符就能够调用和访问这个数组对象中内置的方法和属性。1.实例化一个数组的方式如上,首先是创建一个数组对象,然后是在堆区中创建一个数组,并将返回的地址通过赋值号的函数重载形式传给我们创建的对象的属性。1.采用上图中的第一种方法来初始化一个数组的话,这个数组中的元素个数就等于花括号里的元素个数,且元素也等于花括号中的元素。原创 2022-11-02 15:37:55 · 1014 阅读 · 0 评论 -
C#重启 --- 语言基础2
2.相较于循环,使用递归的话性能开销会增大,因为递归操作的本质就是在内存开辟一个栈,并不断进行栈操作,相较于循环这就是一个额外的性能开销点(但是递归有一个很大的优势就是能够不停的将复杂的问题简单化)1.方法的重载,也可以称为函数的重载 --- 这个特性的特点就是在方法名相同的时候,让计算机能够根据参列表的不同区分同名的方法。6.writeline方法和write方法的区别就是,writeline是写完后直接换行,而write则是写完后不换行。4.在方法中一旦遇到return,方法就直接结束了。原创 2022-10-29 14:47:19 · 2218 阅读 · 0 评论 -
C#重启 --- 语言基础
1.调用writeline方法后会输出括号内的字符串,同时在输出之后还会自动换行 1.左边是扳手的都是属性,是方块的都是方法2.定义类 --- 做工具 ; 定义函数 --- 做方法,main方法 --- 程序的入口方法 ; 定义命名空间 --- 决定类的住址1.调用一个方法的步骤:首先引入类所在的命名空间,然后在命名空间中找到类,最后在类中找到方法进行调用2.命名空间其实就相当于类的地址,计算机会通过命名空间 + 类名来找到具体的类3.为了简化代码,我们可以在代码段的开头提前引入命名空间 --- using原创 2022-10-27 22:06:20 · 576 阅读 · 0 评论 -
C# --- 面向对象六大原则
1.使用组合聚合的话可以只调用我们想调用的方法/属性,使用继承的话则会导致我们会被迫装载一些我们不想要的方法/属性。意思就是:所有能够用到老爹的地方都能够用儿子来替代,但用到儿子的地方不一定能用老爹来代替。零耦合就是没有关系 ,具体耦合就是指以具体类的形式关联,抽象则是以抽象的形式关联。一个按钮只有一个功能,且影响按钮的事件只有一个,按钮的开和关。1.应当为客户段提供尽可能小的接口!1.信息的隐藏指的是尽可能的隐藏不必要的信息。单一职责原则的最简单例子就是 --- 按钮。抽象类与其子类的关系。原创 2022-08-21 08:15:43 · 525 阅读 · 0 评论 -
c# --- 碰撞检测与敌人坦克生成 --- 结束
3.碰撞检测的时候不可以用本体矩形直接去检测 --- 因为检测成功后我们的判定为停止,由于停止我们动不了,当我们再次进行判定的时候依然处于碰撞状态,这时候就永远动不了了。如果发生碰撞 --- 游戏对象停止 ---> 游戏对象转向 ---> 游戏对象方向改变 ---> 碰撞体更新到新方向 ---> 碰撞体在新方向上进行碰撞检测。--- 答案是采用拖影式碰撞检测,我们将碰撞体沿着游戏物体对象当前方向偏移几个像素后,用这个碰撞体进行检测。现象:若发生了碰撞的话,长方形A必有一个顶点在长方体B中(B也同理)原创 2022-08-20 22:12:05 · 493 阅读 · 0 评论 -
C# --- 设计游戏类与游戏地图和坦克移动
目前我们的游戏图像显示逻辑:在画面加载的同时显示画面 --- 此时二者同时进行,这样的逻辑是有问题的,因为这就会导致我们能够看到的画面首先是黑画布,然后是黑画布+游戏物体,然后又是黑画布,又是黑画布+游戏物体...当画面转换足够快的时候(事实上也确实足够快,计算机的操作速度非常快),消失又出现的游戏物体就像灯泡一样,亮暗亮暗频繁切换进而出现闪烁现象,而黑画布由于处于常亮状态所以能够一直保持稳定显现,而不是和游戏物体一样闪烁。具有私有访问权限的变量,这个变量的类型和属性相同,变量名为属性名的首字母小写版本。原创 2022-08-20 16:38:52 · 468 阅读 · 0 评论 -
C# --- 坦克大战开发 --- 绘制游戏界面
原因是:在一个线程中代码是按照由上往下的顺序执行的,执行到循环的时候就会在循环执行完后再往下执行,此时如果我们需要同时执行另一个循环的话是不可能的,也就是说我们无法再刷新画面的同时检测玩家的移动,这就会导致游戏逻辑的缺失,为了实现游戏逻辑的并发性,我们需要通过线程来执行不同的逻辑,使其并发运行。3.并且一个游戏是由多个逻辑循环组合而成的(玩家的操作检测逻辑循环,敌人的AI逻辑循环,画面的刷新逻辑循环,动画效果的播放逻辑循环,碰撞判定....等等),为了在一个程序中实现多个逻辑循环,我们就需要使用到线程。原创 2022-08-19 11:13:11 · 1284 阅读 · 0 评论 -
C# --- WinForm基本知识与绘图(下)
3.接收好图像资源之后就是画图像了,这个操作就要在Paint事件的事件方法中实现了,和上面的画线一样,创建画布画笔,然后用画布对象的drawimage方法来画,传两个参数,一个是图像对象,一个是对象的位置。然后再用Resource(类名).资源名(属性名)来调用对应的资源 --- 此时我们调用图像资源并将其传给图像对象来接收 --- 注意使用Resouces类名的时候我们要引入对应的命名空间。如果要绘制图片的话,首先我们得有对应的图片资源 --- 要有图片资源的话就需要我们去导入资源。...原创 2022-08-19 08:18:31 · 1294 阅读 · 0 评论 -
C# --- WinForm基本知识与绘图(上)
比如我们在窗口中添加了一个按钮控件,然后我们双击这个按钮,这个时候就会自动跳转到窗口名.cs文件中,并在文件中生成一个方法,这个方法会在我们设置的按钮被点击后自动执行 --- 这种方法也被我们称为事件(Event),此处为点击事件。这个窗体文件中的resx文件就是资源文件 --- res -- resource --- 我们可以把各种资源导入到这个文件中,把资源导入到这个文件中后,我们就能在实际的可视化窗体中引用这些资源了。...原创 2022-08-18 22:32:04 · 4224 阅读 · 0 评论 -
C# --- 坦克大战项目(1)--- 类型转换与多线程
8.多线程的时候,线程之间的运行顺序从宏观角度来讲是并发的(即同时进行的),但这是一种假并发,从微观的角度的来看Cpu在一定时间里依然只是执行一个线程,只不过此时Cpu采用的是时间片方式执行线程 --- 所谓的时间片就是我们设定每10毫秒就是一个时间片段,Cpu每执行一个线程一个时间片段就会结束这个进程去执行另一个进程,就这样执行了所有的进程之后再开始一轮进程执行循环,这种方式就称为时间片管理。答案是可以的,人们基于原本的单道批处理系统(内存中只能存储一个程序)开发出了功能更加强大的多道批处理处理系统。..原创 2022-08-18 17:06:47 · 654 阅读 · 0 评论 -
c# --- 实现MyList列表
建立两个数组引用,把一个置为Null另一个不置为NULL,不置为NULL的存储数据,当存满的时候我们通过新容量数据来创建新的数组然后将新数组的引用传给置为NULL的数组引用,然后把就数据拷贝到新数组中,然后再将指向就数组的引用置为Null,下次容量再更新的时候就变成它承接新数组的引用了,就这样不断循环,至于开辟的内存空间的释放问题不需要我们担心,系统会自动帮我们释放。其实也可以不用上面这么麻烦。然后,Equals方法中能够传的比较参数的类型必须和调用它的对象的类型一致,这是在方法设计的时候就规定好的。...原创 2022-08-18 11:05:27 · 374 阅读 · 0 评论 -
c# --- 泛型
3.ToString方法是能够被重写的,原因是ToString方法是属于Object类中的成员函数(且已经被virtual修饰),而这个Object类是所有的类都会继承(间接继承或直接继承的方式)的父类,所以我们可以直接在子类中直接用override关键字进行函数重写。通过动态类型dynamic创建的对象可以直接跳过编译时的类型检查,然后在代码运行时动态检查对象的类型 --- 这样字的化编译器就不需要去判断类型是否能够进行运算符操作了(解决不了问题就解决问题本身,直接跳过编译判断这一步)......原创 2022-08-17 22:49:42 · 667 阅读 · 0 评论 -
c# --- 列表
如果创建两个具有相同结构体类型的变量a,b,并将a赋值给b的话,a中的数据就会直接赋值给b(因为存的是数据而不是地址),然后有趣的是结构体变量的创建方式和对象的创建方式是一致的,但是存储结构体数据的内存空间是在栈区中开辟的,而存储对象的内存空间是在堆区中开辟的。三.对于数组而言,如果数组中的元素是值类型那么数组在栈区中开辟,如果数组中的成员是引用类型,那么数组在堆区中开辟。二.如果是引用类型的话,那就在堆区中创建 --- string , 自定义的类,系统提供的类都是引用类型。4.重构又称为重新设计。...原创 2022-08-17 21:05:08 · 4303 阅读 · 0 评论 -
c# --- 索引器与运算符重载
1.索引器其实就是数组中的那个 [ ],索引器常常用在数组中。哎其实就是下标引用操作符,本质上还是解引用那一套。2.在类中我们可以定义自己的索引器定义语法:索引器访问权限 调用索引器后的返回权限 this(调用索引器的对象)[ index的类型 index(用来接收索引值的index) ]{ get{当我们调用用索引器给别的变量进行赋值的时候,就会运行这里面的代码}set{当我们调用索引器,并给索引器赋值的时候,就会运行着里面的代码} }...原创 2022-08-17 16:49:05 · 709 阅读 · 0 评论 -
c# --- 接口
接口从某种程度上来说也是一个类,但是接口中只包含方法的声明而没有方法的实现z创建接口的关键字:interface(接口,人机交互界面)创建接口的语法:接口的访问权限 interface(接口关键字) 接口名(I + 自命名) --- 给接口命名的时候我们都会在我们给定的自命名前面加一个I 来区分接口和类{放在接口中的函数(方法)声明}实现接口的方法:我们通常通过继承的方式来实现接口继承了接口的类就要负责将接口定义中的所有函数声明进行实现接口中只能够有声明,不能有字段(变量)...原创 2022-08-17 14:51:42 · 5130 阅读 · 0 评论 -
c# --- 修饰符
1.方法的可见性其实就是方法的访问权限2.修饰符不仅可以用来修饰方法,还可以用来修饰类,变量等数据3.目前同一程序集可以理解为同一个项目4.关于protected的补充 : 具有protected权限的成员不能够从类外访问,不过有一个特列,就是可以从具有继承关系的子类中访问,除此之外都不行5.internal 哪里的补充: 但(其它程序集)的代码不可以在一个项目a中的类文件d中用另一个项目b中的类文件c有三个前提 :1.该类被 puclic 关键词修饰 2.该类所在的项目b必须被项目a引用。...原创 2022-08-17 11:42:03 · 350 阅读 · 0 评论 -
c# --- 抽象类,密封类与子类的构造函数
1.抽象类的定义和密封类的定义没有什么区别,然后c#中允许我们将类和函数通过abstract关键词修饰为抽象类和抽象函数2.我们不能通过抽象类来实例化对象,抽象类中能够同时包含普通函数和抽象函数抽象函数其实就是c++中的虚函数,没有函数实现只有函数声明3.如果子类继承的抽线类中有抽线函数的话,这个抽象函数在子类中必须被重写,不然的话编译器就会报错。...原创 2022-08-17 09:54:27 · 452 阅读 · 0 评论 -
c# --- 继承与重写函数
1. 实现继承其实就是类的继承 ---- 父类(基类),子类(派生类)2.子类中重写父类函数的实现代码后,再通过子类调用这个函数的话,就能够执行重写后的代码了3.c#不支持多重类继承,但支持多重接口继承4.在c#中每一个类都必须具有一个父类,且只能有一个父类。当你没有给一个类指定父类的时候,编译器就会给这个类指定一个默认的父类 Object ,如果给一个类指定了一个父类后,Object父类就会被替代,然后新的父类不会出现被替代的情况。......原创 2022-08-16 23:17:13 · 1907 阅读 · 0 评论 -
c# -- 内存讲解和类型
c#和c++中的new表达式的区别是,c#中的new表达式要求类型后面必须跟(),[]或{}作为自变量列表,而c++则是可有可无一.对于类而言,它能选的有()和{ }:当它选择()时又会有三种情况,如果括号里无参数,则在堆区创建对象的同时会调用无参构造函数,如果有参就调用有参构造函数如果选择 { } 的话,括号内可以直接对能访问的成员变量/属性赋值,不同的成员变量属性之间用逗号隔开二.对于数组而言,他能选的只有[ ] 和 { },其中[ ]必选。...原创 2022-08-16 19:55:33 · 1361 阅读 · 1 评论 -
c# --- 类与对象,属性,匿名类型
面向对象编程的思想是将一个问题抽象成多个类,然后每个类都解决自己的问题,大问题就被解决了,所以在c#中一般是一个类对应一个文件(当然一个文件也可以包含多个类,不过一般不这么用)1.当一个类对应一个文件的时候,文件的名称要和文件中的类名对应一致2.一个解决方案是用来解决一个问题的,而一个解决方案中可以有多个项目,每个项目都有一个属于自己的命名空间,每个命名空间中都有属于自己的类。......原创 2022-08-16 15:23:37 · 441 阅读 · 0 评论 -
c#特性 --- 委托(delegate)与 异常处理
委托的定义:委托关键字(delegate) 返回类型 委托类型标识符 (参数列表);通过委托类型创建的变量只能被赋值之后这个委托变量就指向了函数名所对应的函数的函数引用此时我们就能通过这个委托变量来直接执行函数功能了 --- 执行方式:委托变量名(参数) --- 这样子调用后执行的功能是赋值给委托变量的函数的功能为什么要出现委托?...原创 2022-08-16 12:43:57 · 765 阅读 · 0 评论 -
c# --- 函数(方法Method)与常量与枚举类型与结构体
然后成员函数自然也有自己的访问权限,c#中的访问权限修饰和c++中的不一样,c#中是直接在函数返回类型的左边加上访问权限修饰,而c++则是 访问权限: 这种方式来进行修饰。修改之后这个值后面的值的编号也会跟着一起改变,且修改方式是以被修改的值为起始值,不停的往后+1递增改变。3.值得注意的是,一个项目的函数都必须写在这个我们创建项目类中,而这个项目类又在我们给定的命名空间中。4.通过枚举类型创建的变量能够被赋予的值只有我们定义的枚举类型中所包含的值。...原创 2022-08-16 09:35:39 · 594 阅读 · 0 评论 -
c# --- 关于各种变量的一些补充
三.数字变量+字符串变量+数字变量:首先执行第一个+号(注意这里就是运算符优先性的问题了)返回一个字符串,再执行第二个加号,返回的字符串+数字变量,再返回一个字符串,结束。但是数字类型与字符串类型则是完全不同的两个类型,这两个类型之间是无法进行类型转换,如果要转换的话必须通过convert类中的转换函数,来将特定的字符串转换为特定的数字类型。如果直接写一个浮点数的话,这个浮点数的类型会被默认位double类型,如果想创建一个float类型的浮点数的话,我们需要在我们创建的浮点数后面加上一个f。...原创 2022-08-15 16:52:25 · 356 阅读 · 0 评论 -
c# --- 数据存储再识 与数组创建 与字符串
跟大写B的话表示的是计量单位是字节(Byte),跟小写b的话计量单位是比特位(bit)十六进制的10,11,12,13,14,15由字母 a b c d e f来表示。原创 2022-08-15 22:47:47 · 1049 阅读 · 0 评论 -
c# -- 初始.Net
Net平台是我们进行开发的地方,而 .Net框架则是我们进行开发的工具和环境,以及基于 .Net平台开发的应用运行的环境,有了稳定的开发环境,运行环境和好的开发工具我们才能够顺利的进行开发,且我们开发的引用才能够在 .Net平台上平稳运行。1.解决方案包含了项目文件,且我们可以直接通过解决方案创建新的项目文件 -- 即一个解决方案可以包含多个项目。1. .Net由两部分组成,分别是 .Net平台和 .Net框架。1.c#是一种编程语言,可以开发基于.Net平台的应用。就是一个集成开发环境。...原创 2022-08-15 10:13:52 · 1433 阅读 · 0 评论