
C#
文章平均质量分 60
记录在游戏开发中的知识点
程序届的胖头鱼
打工人,程序猿
展开
-
Unity通用框架搭建(八)—— 消息事件封装
在游戏开发中,消息事件通过委托实现。实际开发中,经常会遇到界面之间、玩家之间的相互通信。本文实现的消息事件封装采用的时监听和分发机制,它主要运用在逻辑判断,减少程序之间的耦合度,而且使用起来非常方便。监听服务器消息也可以运用事件监听机制,收到服务器的信息之后可以执行某个事件。曾经维护过一个项目的网络通信相关逻辑全都写在NetManger中,到后期这个脚本一万多行,维护十分困难。合理的框架结构能够帮助我们降低程序的耦合性,使代码易于维护更新。第一版不定参数设计利用不定参params object[] ar原创 2021-08-12 17:09:28 · 1052 阅读 · 0 评论 -
游戏开发组件——delegate事件监听
在实际的开发过程中经常遇到这样一个问题:游戏的很多个界面同时开着的,这些界面又共享一部分数据信息,需要实时的动态的刷新这些数据信息。设计思路:构造全局的事件监听器,在每个界面打开时做好相应数据的监听事件,当数据发生改变时只需要派发相应的事件即可。using System.Collections.Generic;public delegate void GameEventHandler(params object[] args);public class GlobalEvent{ ///原创 2021-03-04 15:08:51 · 381 阅读 · 1 评论 -
Unity 简单实例——聊天室功能
简单聊天室功能,客户端发送消息后,服务器接收到消息后分发到其它客户端上并显示聊天内容聊天室服务器服务器需要有以下几个步骤1、确定Socket协议类型(采用TCP协议或者UDP协议)2、绑定服务器的IP地址和端口号3、设置最大监听数量4、等到连接并处理消息由于服务器属于一对多的处理关系,因为我们需要用线程来监听消息: class Client { private Socket clientSocket; private Thread t;原创 2021-03-02 10:43:46 · 1160 阅读 · 0 评论 -
C# 学习——反射和特性
反射程序在运行时,可以查看其它程序集或者本身的元数据的行为叫做反射。BCL声明了一个叫做Type的抽象类,它被设计用来包含类型的特性。使用这个类的对象能让我们获取程序使用的类型信息。以下是System.Type类部分成员信息Name:返回类型的名字NameSpace:返回包含类型声明的命名空间Assembly:放回声明类型的程序集Assembly.FullName:获取程序集的全名GetTypes():获取程序集中定义的类型GetCustomAttributes():获取特性原创 2021-02-23 17:09:10 · 399 阅读 · 0 评论 -
C# 学习——LINQ 查询
标题原创 2021-02-23 14:46:02 · 1289 阅读 · 0 评论 -
C# 学习 ——正则表达式
正则表达式概念英文Regular Expression 是计算机科学的一个重要概念,使用一种数学算法来解决计算机程序中的文本检索,匹配等问题。主要用于解决下面的问题:1、检索:通过正则表达式,从字符串中获取我们想要的部分2、判断给定的字符串是否符合正则表达式的过滤逻辑,可以认为正则表达式表述了一个字符串的书写规则在C#中位于命名空间System.Text.RegularExpressions下定位元字符^ :匹配必须出现在字符串的开头或者行的开头$ :匹配必须出现在以下的位置:字符串结尾、字原创 2021-02-19 16:38:31 · 275 阅读 · 0 评论 -
数据结构学习 —— 二叉树(二叉排序、AVL平衡二叉树C#实现)
二叉树每个节点最多有两颗子数;左右子树有序,不能颠倒即使某个节点中只有一颗子树,也要区分是左右;如上图所示:节点C是节点A的右子树,节点F是节点C的右子树。特殊的二叉树:1、斜树:所有节点都只有左子节点或都只有右子节点2、满二叉树:在一颗二叉树中,所有的分支节点都存在左子树和右子树,并且所有叶子节点都在同一层,这样的二叉树称为满二叉树。3、完全二叉树:对一颗具有n个结点的二叉树按层序编号,如果编号为i(1<=i<=n)的节点同样深度的满二叉树中编号为i的节点在二叉树中的位置完原创 2021-01-07 15:45:22 · 379 阅读 · 0 评论 -
Unity通用框架搭建(三)—— 基于Addressable资源加载更新
前一篇文章记录了Addressable可寻址地址系统的一些基本概念和基本用法,本章将会记录一套基于Addressable的资源加载卸载。结合前面学习的享元模式的理念,也会设计缓存池的相关逻辑。如上图所示,整套流程主要分为两大部分:资源加载部分和缓存池设计部分。资源加载AddressableManager通过单例模式,将各种类型的加载、下载以及卸载入口都放入统一的入口处。public void LoadAsset<T>(string address, System.Action<T原创 2020-12-17 16:53:44 · 6030 阅读 · 5 评论 -
算法学习——折半查找(二分查找法)
在有序表中,把待查找的数据值与查找范围的中间元素值进行比较,根据比较结果来确定查找结束或者下一轮查找时在中间元素左边查找还是中间元素的右边查找```public int BinarySerach(int[] arr,int number){ int left=0; int right=arr.Length;//初始化左右边界 int middle=(left+righ...原创 2019-08-29 16:32:46 · 316 阅读 · 0 评论 -
算法学习——递归算法
递归算法算法的主要思想:把问题转化为缩小了的同类问题的子问题,然后递归调用函数(或过程)来表示问题的解。递归算法:在函数或者过程的内部,直接或间接地调用自己的算法。递归算法的特点递归就是在过程或函数里调用自身在使用递归策略时,必须要有一个明确的递归结束条件,成为递归出口递归算法解题通常显得很简洁,但递归解题的运行效率低,所以一般不提倡使用递归算法设计程序在递归调用的过程中系统每一层的...原创 2019-08-29 15:58:02 · 652 阅读 · 0 评论 -
算法学习—— 简单的排序算法
冒泡排序冒泡排序是最简单的排序算法,基本思路如下:比较两个数据项交换两个数据项,如果左边的数据项大,则交换向右移动位置重复1、2步骤public void NormalSort(int[] arr){ for(int i=0;i<arr.Length-1;i++) //确定冒泡比较的趟数 { bool finish=true; fo...原创 2019-08-29 11:17:38 · 151 阅读 · 0 评论 -
C# 学习 —— 数据结构(ArrayList、哈希表、List「T」、Dictionary、Stack「T」、Queue「T」)
ArrayListArrayList代表了可被单独索引的对象的有序集合。但是ArrayList的默认数据类型为Object会涉及装箱和拆箱的操作类似数组,但是没有固定大小,根据需要不断增大Add(object obj):增加元素Remove(object obj)/RemoveAt(index):移除元素Insert(index,object):在指定位置插入一个对象Clear():...原创 2019-08-27 16:28:47 · 314 阅读 · 0 评论 -
C# 学习之路 —— Lambda表达式
C# 3.0引入了Lambda表达式,它是一种简化匿名函数,可用于创建委托或表达式目录树,也可以将表达式作为参数传递或者作为函数调用值调用后返回的一个函数来使用。(input parameters) => expressionLambda表达式组成部分:放在括号中的参数列表(未类型化)=>运算符C# 语句体,可以包含单个或者多个语句,把一个代码块放在花括号中。如...原创 2019-08-13 10:33:20 · 336 阅读 · 0 评论 -
C# 学习 —— 字符串 (string)
在C#开发中可以使用字符数组来表示字符串,但是更常用的是用string来表示字符串。String 属性Chars:在当前string对象中获取指定Char的位置Length:获取字符串长度String 常见方法C#中内置了丰富的字符相关的方法,下面罗列了我在开发中经常使用到的:(其他详见菜鸟教程)方法名函数功能函数返回值Equals(string a,stri...原创 2018-12-19 19:31:14 · 309 阅读 · 1 评论 -
C# 学习 —— 枚举 (Enum)
枚举是一组整型常量。使用enum声明。C#枚举是值类型,枚举包含自己的值,不能继承或者传递继承。如:enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };使用枚举增加代码的可读性,刚刚开始工作的时候经常会switch(整数)的形式来写逻辑,但是时间久后恐怕自己也难弄清楚这是什么意思了。按照命名规范来对枚举值命名的话,那样开发和维护也会方便一点。...原创 2018-12-19 20:00:30 · 342 阅读 · 0 评论 -
C# 学习 —— 类(Class)
类用class进行声明,可以包含属性、方法、构造函数、析构函数等等。使用 static 关键字把类成员定义为静态的。当我们声明一个类成员为静态时,意味着无论有多少个类的对象被创建,只会有一个该静态成员的副本。关键字 static 意味着类中只有一个该成员的实例。静态变量用于定义常量,因为它们的值可以通过直接调用类而不需要创建类的实例来获取。静态变量可在成员函数或类的定义外部进行初始化。你也可以...原创 2018-12-20 19:03:51 · 694 阅读 · 0 评论 -
C#学习之路 —— 接口
接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 “是什么” 部分,派生类定义了语法合同 “怎么做” 部分。定义接口使用interface关键字声明,接口默认是Public:interface IRedPoint{ void UpdateRedPoint();}以上是定义接口的一个实例,默认以I开头,只声明方法,但是没有方法的具体实现。class UIBeStrong...原创 2018-12-20 19:19:21 · 231 阅读 · 0 评论 -
C# 学习之路——基础数据类型
最近刚刚换了一分工作,在找工作的途中发现自己的基础十分薄弱,好几个面试官都认为我基础薄弱,本人从事游戏开发工作,决定重新学习一下基础知识,顺便也学习一下新的技术知识。好记性不如烂笔头,写下来以便日后查阅(知识点来源于菜鸟编程菜鸟编程)值类型(Value types)声明类型时,系统分配内存来存储值常用的数据类型以及相关说明:类型描述范围默认值bool布尔值t...原创 2018-12-18 21:20:29 · 174 阅读 · 0 评论 -
C# 学习之路 —— 异常处理
实际工作处理中,程序可能会因为一些内部或者代码运行环境的不同发生一些未知的错误。但是程序可能会因此奔溃,并且很难定位出错的原因。C# 提供一套异常处理机制,帮助开发人员捕获异常。try{}catch (Exception e){}...catch (Exception e) { Console.WriteLine("Error Message is " + e.Message);...原创 2019-01-11 15:24:06 · 232 阅读 · 0 评论 -
Scheduler 统一调度接口 —— 多线程基础
最近工作不是很忙,抽空整合了以前的老代码,编写一套在Unity游戏开发中使用的统一调用接口。Unity2018 版本后支持.net 4.0+,这套调度接口也利用了多线程并行运行的机制来提高整体的运行效率,虽然在客户端中实际上并不明显,借此来学习一下多线程运行的机制。ParallelParallel提供并行运行机制,常用方法Invoke、For、ForEach。Parallel.Invoke...原创 2019-02-20 15:48:45 · 1001 阅读 · 0 评论 -
Scheduler统一调度 —— Timer 定时器设计
设计Scheduler最主要的目的是在Unity中实现定时器的功能,因此我重点记录下定时器的设计,其他的作为参考。定时器中需要包含:定时时间、出发的任务、重复次数等,根据这些来定义Timer基类(源码): /// &amp;amp;amp;lt;summary&amp;amp;amp;gt; /// 定时器对象,记录定时时间,触发事件 /// &amp;amp;amp;lt;/summary&amp;amp;a原创 2019-02-20 15:59:06 · 620 阅读 · 0 评论 -
C#学习 —— 比较、运算符重载
类型比较在比较对象时,常常需要了解它们的类型,才可以确定是否可以进行值的比较。所有的类都继承自System.Object,将GetType()方法和typeof()运算符一起使用,可以确定对象的数据类型:if(myObj.GetType()==typeof(MyComplexClass)){//处理内容}is 运算符is运算符不是用来说明对象时某种类型,而是用来检查对象是不是给定类...原创 2019-08-09 10:36:39 · 898 阅读 · 0 评论 -
Unity面试汇总——基础二(C#常见基础)
1、private、public、protected、internal的区别原创 2018-12-07 17:02:59 · 1086 阅读 · 0 评论