C#基础学习(三)
泛型基础介绍泛型类就是一个模子,装入对应类型的材料,就可以塑造出想要的产品
语法展示比如我们想要设计一个笼子类,填充对应的宠物类型来得到专属的笼子
12345678910class Cage<T>{ T[] petsArray ; public void PutIn(T pet){ ... } public T TakeOut(int index){ ... }}
T就是一个占位符,等具体参数传入之后,它就会变成对应的东西
Why泛型用基类或者公告的接口,甚至是所有类的基类Object,也可以实现上述的Cage类————但是类型过于宽泛1.需要显示转换类型2.需要判定真实的类型是什么
使用泛型123class Cage<T>{...} //声明Cage<Dog> dogCahe ; //Cage<Dog>类型的引用dogCage = new Cage<Dog>(); //构造实例
优 ...
C#基础学习(二)
静态静态成员概念被标识为static的字段、方法。属性、构造函数、事件,就是静态成员
1234class Dog{ static int Num ; }
静态成员将会被类的所有实例共享,所有实例都访问同一内存位置
就是说,“静态”的成员,对于该类的实例,就是“公共”的
介绍静态成员直接通过类名访问,它们仅仅和整个类有关Dog.Num += 1 ;
生存周期独立于任何实例,没有实例也可以访问。其初始化语句在任何静态成员使用之前调用
静态函数成员静态函数不能访问实例成员,仅能访问其他静态成员(不过实例成员反过来可以访问静态函数)
静态构造函数1.静态构造函数用于初始化静态字段(为静态成员而生)2.在引用任何静态成员之前,和创建任何实例之前调用3.与类同名,使用static,无参数,无访问修饰符
12345class Dog{ static Dog(){ num = 0 ; }}
静态类介绍1.如果类只包含了静态的方法和属性,并且标识为了static ,那么它就是一个静态类2.静态类不能创 ...
C#基础学习(四)
委托初介绍委托介绍委托就是持有一个或多个方法的对象,并且该对象可以执行,也可以传递委托可以持有方法委托可以声明,因为它实际上是一种引用类型delegate void ActCute();而且委托作为类型,我们就可以定义该类型的对象ActCute actCute ; 定义了一种委托类型,这种委托接受的是没有返回值且没有参数的方法
给委托对象赋值利用=和之后会说的+=进行赋值
1234567class Dog{ public void WagTail(){ ... }}actCute = dog.WagTail ; //注意赋值和调用是不一样的:这里不需要()
使用委托对象就像调用函数对象一样使用委托actCute();并且委托可能持有多个方法,我们调用一次这个委托,就相当于调用了所有它所持有的方法第一个方法利用=添加,第二个使用+=添加
Lambda表达式可以利用delegate关键字,直接声明匿名方法给委托:
123delegate void ActCute();ActCute del ; del = de ...
工厂模式:简单工厂与工厂方法
工厂模式核心在于实现了创建者和调用者的分离详细可以分为简单工厂模式、工厂方法模式、抽象工厂模式
抽象工厂模式在专门的笔记中
对应的三个原则是:开闭原则:一个软件的实体应当对外扩展开放,对修改关闭依赖倒转原则:要针对接口编程,不要针对实现编程迪米特法则:只与你直接的朋友通信,避免和陌生人通信
核心本质与简介本质:1.不使用new来实例化对象,转而使用工厂方法代替2.将选择实现类,创建对象统一管理和控制。从而将调用者和实现类解耦
简单工厂:用来生产同一等级结构中的任意产品(对于增加新的产品,需要修改已有的代码)工厂方法:用来生产同一等级结构中的固定产品抽象工厂:围绕一个超级工厂来创建其他工厂,这个超级工厂又称为其他工厂的工厂
简单工厂/静态工厂实现核心在于实现在工厂中,使用者只需要调用比如说我要造车
123public interface Car { void name();}
123456public class Wulin implements Car{ @Override public v ...
C#基础学习(一)
1.0继承:虚、多态、抽象、密闭、接口、结构和类这部分内容主要是规范,方便各种类/方法/结构 在使用中的分类提高了代码的整洁度和优美,而且一定程度对降低代码耦合性也有帮助因此放在了一起
继承派生、虚方法、多态设计原则——依赖倒置原则程序设计套依赖于抽象类,而不依赖于具体类
基类派生类的引用可以引用基类来创建一个派生类的对象
派生类的对象包含基类部分和派生类部分我们可以通过一个基类类型的引用指向派生类通过这种方式的指向,我们只能访问派生类中的基类部分
相当于就是你用基类的模子整了一个派生类出来
1Pet Dog = new Dog();
比如此时我调用了基类和派生类都有的一个方法Name()本来基类的Name()应该被隐藏而调用派生类新的Name()方法但是因为此时我们是利用了基类的引用而创建了该对象,所以我们只能访问基类的部分因此调用的还是基类的方法
虚方法与多态虚方法:声明为vitrual的方法就是虚方法。基类的虚方法可以在派生类中使用override进行重写
多态:通过指向派生类的基类引用,调用虚函数。根据引用所指向派生类的实 ...
单例模式
总述单例,就是单个实例的意思,一般用于只需要一个实例的场景典型的例子就是各种Mgr,以及游戏的角色操控
写法一般来说,单例模式有七种写法,下面一一列出
1饿汉类加载到内存后,就实例化一个单例,此时JVM会保证线程安全简单实用,实用性强唯一确定是不管是否被用到,在装载类的时候就会完成实例化
但是如果你不用它,你装载啥啊
1234567891011121314public class Mgr01 { private static final Mgr01 INSTANCE = new Mgr01(); private Mgr01(){}; //这里的private保证了它不会被随随便便NEW出来 //设置一个getInstance方法,想要得到它只能使用这个方法 public static Mgr01 getInstance(){ return INSTANCE ; }}
2饿汉改和第一个本质上没区别
12345678910111213public class ...
【算法】双指针与典型例题
双指针双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的
换言之,双指针法充分使用了数组有序这一特征,从而在某些情况下能够简化一些运算
双指针不一定真的要来个x*搞个指针的,核心还是在于思想
基本概念对撞指针在有序数组中,讲指向最左侧的索引定义为left,最右侧的定义为right然后利用两个指针从两个往中间对数组进行遍历
对有序数组的招数,碰到有序数组可以第一时间想到对撞
与后面那位“快慢指针”相比,它更喜欢解决数组中的问题
1234567891011121314//伪代码function fn (list) { var left = 0; var right = list.length - 1; //遍历数组 while (left <= right) { left++; // 一些条件判断 和处理 ... ... right--; }}
快慢指针但是 ...
【算法】二分查找与典型例题
二分查找基础不好还怎么继续塔塔开,这里再次好好分析一下两个模板
分析二分查找的一个技巧是:不要出现 else,而是把所有情况用 else if 写清楚,这样可以清楚地展现所有细节。https://blog.csdn.net/xiao_jj_jj/article/details/106018702当我们把二分的各种模板看作搜索区[left,right]的各种变体,就好理解很多了
分析模板A我喜欢叫做加减模板,在每次更新时都是对left/right进行加减处理可以说是最常见的模板
1234567891011121314151617181920212223int binarySearch(int[] nums, int target){ if(nums == null || nums.length == 0) return -1; int left = 0, right = nums.length - 1; while(left <= right){ // Prevent (left + right) overflow ...
【Unity2D】如何让角色的起跳与落下更舒适
[Unity2D]如何让角色的起跳与落下更舒适本文概要
如何简单地通过四行代码,增加角色在“起跳-落下”过程中的操作体验2D/3D通用,但是一般用于2D游戏中涉及重力更改,不涉及跳跃代码
前言在2D横版游戏中,跳跃常常是不可或缺的因素,甚至是主要因素。但很多Unity新手在设置跳跃力度与手感这一方面会遇到两个问题:1.起跳困难,或者是跳跃力度过下2.但是若加大了跳跃的力度,整体的手感就会飘起来
这一切的问题其实就是重力的设置,或者换句话说:很多2D游戏的跳跃,其重力尺度并非不变的
理论基础我们以经典的Super Mario Bros 为例,如果我们逐帧分析过主角的跳跃轨迹,则会得到以下的轨迹:(图源自Board To Bits Games,也是后文Better Jumping in Unity的作者)注意前后的力度变化以及它们改变的节点,正是这种变化优化了“起跳-腾空-落地”的体验它使得玩家操作起跳与移动的时间更长、距离更远,而最后作为收尾的落地却是十分干净利索的
代码实现我们需要有两个重力尺度(也就是修改Physics2D.gravity)进行跳跃的优化,分别是起跳和 ...
【Unity】实现鼠标拖拽的各种方法
Unity中实现鼠标拖拽前言起因是想写一个类似王权的Demo,然后发现自己对应拖拽这个操作没有系统地归纳与理解一下,于是去看了一下文章、API和视频,然后有了这一篇文在这里,只讨论鼠标的相关拖拽方式,不讨论移动端也就是屏幕点击拖拽的实现(以后有必要的话把PC->移动专门弄一下好了)
鼠标拖拽这件事在游戏中并不少见,而我们想要通过Unity实现它也并不困难
本文从基本的坐标系对齐,再到API应用,最后到接口调用。从三个角度小结的如何在Unity中实现”鼠标拖拽”以及相关优劣性
参考的视频:Unity常用的三种拖拽方法 来自Joe
坐标系判定个人认为是最最基本的做法了,甚至有了很愚蠢的造轮子的感觉
核心做法很简单:对于鼠标: 判定鼠标在不在物品上面->判定鼠标是否点击->根据是否点击来修改bool->改变物品
对于物品: 实时更新上述的bool值->如果在“被拖动”的状态,则更新坐标
这里要注意的是鼠标所在的屏幕坐标系和物品所在的世界坐标系的转换,使用内置的ScreenToWorldPoint()就可以轻松解决这件事
贴一下代码,挂在物品上的 ...