![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C#
Emmmwzh
已经成为一只码农
展开
-
贪吃小怪兽介绍之服务层框架
服务层没有框架。。。每一个管理器都是单例,很独立了,依赖的都是一些工具类,比如ResUtils加载资源的工具,NetUtils获取IP、安全关闭Socket之类的。只要在游戏开始的驱动类中Init一下管理器,就可以一直用。...原创 2018-09-13 17:33:27 · 164 阅读 · 0 评论 -
Unity 日志管理
以前实习的时候写的日志系统是在Debug的事件中加一个监听,把收到的日志保存到文件,这个很多博客都有写,因为大佬要求有行信息,就是 xxxxx cs.168显示一个Log的行号。然而在ReleaseBuild里面是没有行号的,别想了。。只有Development Build日志才有行号。后来发现行号不是必要的,只要知道哪个函数发出的就好,而且在Debug添加监听有很多局限性,不能修改控制台的Log...原创 2018-03-01 14:20:59 · 2181 阅读 · 1 评论 -
贪吃小怪兽介绍之客户端帧同步框架
如图所示VKey是虚拟按键,用户每一帧的输入通过事件发送到PVPGame,FixedUpdate是Unity的不是自己写的,由Unity来驱动PVPGame,每一次驱动包括发送一次数据包和从帧同步管理器获取播放的帧数:1、如果是0,说明没有多余的数据了,就是网络卡了,没收到数据。。Unity的框架还是正常运行,但是我不驱动任何物体运动,看起来跟游戏卡了一样。2、如果是大于0的数,说...原创 2018-09-13 17:33:23 · 492 阅读 · 0 评论 -
贪吃小怪兽介绍之通讯协议
写之前定义了这些,后来又加一点,还没有完成这些协议,而且没有写心跳包,因为完成了帧同步很激动,然后就把不想写心跳包了。。buff也没有实现 所有ID、指令都是int除了客户端上传的帧同步数据,其他都是发什么上去服务器就转发什么给客户端 帧同步协议(FrameKey)上行:FClientKey(会话ID + 操作 + buffID) 是否能释放技能由本地计算数据,发送...原创 2018-09-13 17:33:18 · 299 阅读 · 0 评论 -
贪吃小怪兽介绍之动画同步
自己写一个Animation叫GAnimation,用组件的方式添加到Player类中,这不是一个框架,而是一个类似于状态机的东西,我使用的是Animation动画,然后给每个动画定义优先级,比如攻击的优先级小于被攻击,即是说一个人的攻击可以被打断,类似这样的。辅助类有Trigger和GAnimationClip(带动画帧事件)。如何做到同步,如果数据是同步的,那么我只要根据数据来一帧一帧播放,来...原创 2018-09-13 17:32:31 · 287 阅读 · 0 评论 -
贪吃小怪兽介绍之位置同步
类似GAnimation,来一套GTransform,传入的数据全为整数,GTranform也是全整数计算,速度快,没误差,计算攻击范围更爽。在计算旋转角度的时候使用Atan2来计算,Atan2(y,x)可以获得点(x,y)与x轴的夹角,返回的是一个(-pi,pi)的单精度浮点数,转化为整数的角度值然后自己写插值,GTransform一直保留一个整数的当前Y轴的旋转角度,计算出目标角度后再计算De...原创 2018-09-13 17:32:16 · 370 阅读 · 0 评论 -
Unity MVC模式
网上有各种MVC,我只说我用到的MVC。如图所示,管理器持有数据实体,也就是数据模型了,他可以修改数据实体的数据,比如游戏管理器收到用户的输入,比如点击了Attack按钮,那就修改对应实体的IsAttack = true(Trigger),ViewObject是视图对象,他通过Unity的Update轮询自己对应的数据实体获取数据变化,继续上面例子,发现IsAttack = true;那就呈现对应...原创 2018-03-01 16:50:44 · 452 阅读 · 0 评论 -
介绍一下我大二开发的游戏:地下城冒险
前言:写来参加学校比赛的,当时写了一个月左右就期末考试了,后来就没写过了,单机游戏,也是一个烂尾工程。介绍:这是一款3D的RPG游戏,那时候也是看到龙之谷手游是Unity做的,就想自己能不能来一发。这游戏就5关,就是刷刷怪而且任务系统也不完善,各种参数也没认真调,关键是那时候我还不知道框架这种东西,但是还是稍微留意了一下,比如我所有数据都是从一个类中取出来的,现在应该叫做配置管理器。唯一学到的东西...原创 2018-03-01 20:30:51 · 1008 阅读 · 2 评论 -
Unity性能优化
一、资源优化1、贴图贴图优化是大头,因为一个游戏内存最多的基本都是贴图了,所以贴图优化很重要。(1)是用PackingTag打包贴图,因为一张贴图大小如果不是2的n次幂,unity会补全,这时候有很多地方是空的,利用这个工具可以把多个小的贴图挤进那些空白的地方。为了节省内存,已经不只是补全空白位置,把多张贴图打包成一张大的贴图,也可以大大减少小贴图浪费的那些空白内存。同时对内存也有...原创 2018-09-13 17:32:38 · 592 阅读 · 2 评论 -
贪吃小怪兽介绍之功能模块框架
如图所示,这个东西主要是从一个山寨贪吃蛇大作战的项目中学来的,SendMessage的签名是SendMessage(string target,string msg,param object[] args),target是模块名,msg是对应的方法名,args是对应的参数,通过反射发送到指定模块,如果模块不存在就缓存起来,等创建后再把事件和消息发给模块。举个实际的例子,Module1是LoginM...原创 2018-09-13 17:33:32 · 341 阅读 · 0 评论 -
贪吃小怪兽介绍之UI框架
如图所示:调用UIManager的Open、Close、GoBackAfterClose.....等接口可以按照类型或者名字打开面板,注意继承UIBase的脚本名和资源名一定是一样的,这样才可以按照类型加载面板,UIPage继承于UIBase,之前考虑到这种情况,如果打开一个面板,上面又打开很多个窗口(比如进入现在的qq飞车,上来一堆窗口),这时候用户按下手机的返回键那应该返回到那个页面呢,是返回...原创 2018-09-13 17:33:37 · 376 阅读 · 0 评论 -
C# event和delegate的区别
简单的说,event是特殊的delegate,远古版本(不知道是C#几点零之前)只有delegate,后来发现delegate的使用不够好,比如在应该使用+=的时候误用=,就把订阅的事件都清了,后来封装了一手event,同时仍然保留delegate(兼容老版本?)。具体区别,event和delegate的功能一样,event多了一些限制封装订阅:有的地方应该用+=却误用=,even原创 2017-12-27 23:58:48 · 545 阅读 · 0 评论 -
C# 带后备字段的属性和不带后备字段的属性
public class Test{ public Test() { Date = "1"; } private string dt { get; } = "1"; public string Date { get; }}这是一种带后备字段的属性,他是自动完成的属性,比如这个Data,他是一个自动完成的只读属原创 2018-01-06 18:46:34 · 860 阅读 · 0 评论 -
C# 扩展方法
C#的扩展方法一定是静态方法而且是共有的(也可以私有,只是访问不到而已。。),可以放在任何类中,他的第一个参数一定是"this 添加方法的类型 任意名字",比如对object扩张一个方法可以这样写。 public static class ExtensionHelper { public static void Debug(this object obj, string msg)原创 2018-01-06 19:03:31 · 1229 阅读 · 0 评论 -
C# GC何时被调用
首先要指导GC的机制,这部分转载自:http://blog.csdn.net/qq_20949153/article/details/52188882CLR:公共运行时环境,管理托管堆。CTR:设置引用类型,值类型。GC:只负责回收托管对象,不负责回收非托管对象。垃圾回收器的基本假定: 1.被分配内存空间的对象最有可能被释放。在方法执行时,就需要原创 2018-01-07 22:56:47 · 4920 阅读 · 1 评论 -
unity中的单例模式
单例模式最重要的是不要被new来使用,在C++中可以把构造函数设置为私有或者虚继承等方法来防止被new来使用,在C#中也可以通过下面代码来实现。如果被new了,那么_instance一定是null的,在使用单例的之前,我们可以先用Init()来初始化,其他情况也可以先用CheckSingleton来检查是否被正确调用。注意这不是一个线程安全的单例。 public abstract cla原创 2018-02-05 15:14:26 · 436 阅读 · 0 评论 -
TargetParameterCountException: parameters do not match signature
在使用C#的反射的时候出现的这行东西,我是这样写的。MethodInfo mi = this.GetType() .GetMethod(msg, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);if (mi != null){ mi.Invoke(thi原创 2018-02-06 12:36:54 · 2912 阅读 · 1 评论 -
C# internal
先看下面两张图,第一张是代码,第二种是前面代码打包的.dll文件,区别很明显,private,protected(忘了加进去)和internal的东西都不会在.dll文件中出现,也就是说引用这个dll的程序不会访问到上面这些字段,private和protected就很明显不需要解释。internal字段为什么不会被引用的程序访问呢?因为internal的意思是只能在本程序集内访问,他在本程序集相当...原创 2018-03-01 11:41:20 · 215 阅读 · 0 评论 -
介绍一下我开发了差不多一个月的小游戏,贪吃小怪兽~
前言:其实还有很多没开发完,因为要准备实习,所以就先搁这儿了。而且只是个原型,很多东西都没调整,通讯协议也没完善,所以很脆弱的。介绍:做这个游戏是因为寒假开始的时候我玩了一款叫贪吃小怪兽的游戏,因为暑假实习后到寒假几个月都没有做项目了,于是决定山寨一波。这个游戏是局域网的多人在线互撕游戏,我山寨的就很菜了。。服务端是TCP,因为UDP在处理比较麻烦而且在公司有人实现,所以我就简单用TCP实现一下帧...原创 2018-03-01 12:28:18 · 987 阅读 · 0 评论 -
贪吃小怪兽介绍之整体框架
整体框架如下所示,分为三层,上层只能依赖下层。UI层:处理每个面板的UI,比如登录界面就有UILoginPage来管理,(继承于UIBase,UIBase继承于MonoBehavior)功能模块:这一层和Unity完全隔开,对应UI面板有对应的模块提供相应的功能,比如UILoginPage就有LoginModule,用他来处理登录注册信息,UI层直接调用功能模块的功能,功能模块主要是通过事...原创 2018-09-13 17:33:42 · 313 阅读 · 0 评论 -
C# GC内存泄漏
暂时写下我现在知道的,以后有更深的理解再补充,写的不对的欢迎留言指出。查了一些资料,GC内存泄漏我觉得可以分为狭义的内存泄漏和广义的内存泄漏吧,狭义的泄漏是因为某些认为原因,GC未能履行其职责清除内存,比如编码的时候不小心忘记清除没用的静态共有对象,使得他一直占有没用内存。广义的泄漏就是真的就泄漏了,主要是非托管类型。对于第一种情况我知道的几种泄漏的方式:1、静态对象没有及时释放。静态...原创 2018-09-13 17:33:13 · 1087 阅读 · 2 评论