- 博客(31)
- 收藏
- 关注
原创 Unity网络开发记录(五):二进制传输消息类
前篇所写的CS模型只能传输字符串,在本篇文章中,尝试在服务端一次传输多种类型的数据,并在客户端接收到信息之后进行解析显示为了实现对不同类型的数据传输,需要将不同类型的数据都转换成二进制的形式在网络中进行传输。所以要实现一个消息基类,提供各种类型数据的序列化与反序列化方法,再让需要发送的数据类继承该基类,实现其中信息的序列化等操作创建一个数据类,继承自消息基类,实现一下写入和读取的方法为了区别不同的消息类型,需要添加一个消息头,其中有标识类型的ID。
2024-10-01 16:10:38 770
原创 Unity网络开发记录(四):在unity中进一步封装客户端类
在上一篇文章中,简单的封装了一下服务端中相关的socket对象,为了可以更方便的使用。接收消息时,子线程负责对发送过来的字节流进行处理,将处理完毕后的信息存储接收队列里,主线程只需要不断的读取队列里的信息就行。新建一个ui画布,添加一个输入框,一个按钮,按钮绑定一下send方法就可以进行简单输入信息并发送了。使用就很简单了,在unity中新建一个脚本,调用一下Connect方法就可以进行连接了。发送消息时,主线程只用把信息存进发送队列里就行,子线程负责从队列中取出信息进行发送。
2024-09-29 20:07:15 602
原创 Unity网络开发记录(三):封装服务端的相关socket
封装此类,是为了方便维护客户端和服务端建立连接后返回的socket包含了所需要的基础的socket 以及 该socket所对应的id号,方便进行管理。
2024-09-29 19:53:03 465
原创 Unity网络开发记录(二):采用多线程处理服务端对客户端的连接和信息处理
在主线程处理对所有客户端的连接以及消息处理,是非常消耗时间的,所以对于监听客户端的连接,以及信息的接收,都额外开线程去处理,减轻主线程的压力。启动服务端,在unity中启动客户端,客户端最基本的代码在上一节,发现依旧可以正常连接,本节处理完毕。
2024-09-26 17:23:57 331
原创 Unity网络开发记录(一):实现最简单的unity客户端和服务器通信
案例通过Socket网络套接字实现Tcp网络通讯打开VS,新建一个项目C#服务端整体流程依旧遵从socket开发的基本步骤,和其它语言下的socket开发一样,例如c++补充一下前置知识,在Tcp传输下,会经历三报文握手建立连接,四报文挥手释放连接。三报文握手防止以失效的连接请求重新传到服务端,四报文挥手之后要等待2MSL,确保此过程中的报文全部失效,并防止释放请求确实报文丢失,及时重传。Tcp传输具有无差错,不丢失,不重复,不乱序的特点,适合长连接的游戏。
2024-09-26 17:15:06 544
原创 Unity中使用四元数限制旋转
在处理旋转相关的内容的时候,如果使用unity提供的欧拉角描述旋转,会出现一下两种问题绕轴90°旋转与绕轴90°+360°旋转的表现是一致的当某个特定轴达到某个特殊值时,绕一个轴旋转可能会覆盖另一个轴的旋转从而失去一维自由度Unity中x轴达到90度时,会产生万向节死锁。x轴为90度,此时调节y或z轴都是绕z轴转在inspector面板上的旋转就是以欧拉角来表示的。
2024-09-05 20:48:27 588
原创 Unity跨平台的基本原理(Mono)
Mono利用.Net平台制定的CLI公共语言基础结构规则,使得可以将多种语言编译成通用规范的CIL公共中间语言,通过CLR将这些CIL转换为对应操作系统的原生代码。缺点:维护耗时,当Unity版本更新时,Mono 虚拟机也需要维护和更新,那对于多个平台来说,工作量很大。在Unity中使用的各种语言进行逻辑实现,这些语言在发布时会被编译成IL中间代码,最终在对应操作系统上通过Mono 虚拟机翻译为机器码运行。Unity的底层是通过C/C++来完成,Mono同时具备了跨平台的和跨语言两个特性。
2024-06-25 21:12:59 412
原创 c#知识补充——了解何为.Net?
Net 不是编程语言也不是框架,而是一套技术体系的统称,又或者说是技术平台的代号包含使用.Net平台,可以实现以下两点。
2024-06-25 20:54:30 825
原创 在xLua的基础上做一个小巧的lua管理器,在unity中方便使用
默认在asset文件下创建了一个Lua文件,专门用来存放lua脚本。默认有luaAB包,并且AB包中lua脚本的名称为 XXX.lua。
2024-04-27 21:05:27 144 1
原创 控制ui元素跟随布局组下物体的位置变化(跨父物体访问)
旁边的橙色小方块(暂叫它arrow)是用来标记当前选择的选项,他的父物体不是这些选项的父物体,也就是说arrow 和 选项的局部坐标系不同。由于子物体是挂载在一个布局组下(这里我用的垂直布局组),所以子物体Rect Transform中的某些属性会交由父物体布局组去控制,这时候在编辑窗口下就无法去手动来拖动了。访问其它父物体下子物体的位置信息,并做出对应变化的 类似 功能,都可以这样来做,本文举出的 对话选项 只是举例。这里主要的代码其实就是关于坐标系转换的两个api,其它的可以忽略是关于一些设置的。
2024-04-16 13:23:21 419
原创 Unity基础小框架(四):公共mono模块
MonoManager继承自一个单例模板,并且没有继承Mono,通过向MonoController中添加相关事件,来实现不继承mono但可以使用相关函数的功能。相当于是进一步的封装 ,提供了Update相关的接口 和 协程相关的接口。其它可以按照MonoBehaviour中的相关方法实现,写法一样。MonoController作为实际调用Mono中相关方法的脚本,提供一系列可以添加监听事件的方法。比如向Update中添加或移除事件。
2024-03-26 20:58:20 308
原创 Unity基础小框架(三):解决事件中心里的装箱拆箱问题
虽然此模块已经可以实现基本的功能,但是由于参数类型为object类型,在使用过程中还是会进行装箱拆箱相关的转换,还会耗费一定的性能。所以考虑使用泛型来代替使用obejct做参数传递。因为希望该模块不用挂载到实际物体身上就能使用,所以让EventType 继承 IEventType接口。利用里氏转换原则,即可正常向字典里添加泛型版本的类对象。首先写一个最基本的事件中心模块,可以接受参数。
2024-03-26 17:33:03 282
原创 Unity基础小框架(二):对象池(缓存池)模块
是否设置构造函数为私有取决于继承的单例模板的实现方式,使用单例模式是为了确保该类具有唯一的实例,并能够通过获取实例的方法直接调用对象池模块里的内容。使用对象池能够重复利用创建的资源,避免重复的创建和销毁,减少内存分配和垃圾回收带来的开销。当某个物品需要重复的创建和销毁时,就可以考虑用到对象池。在存取对象时,是否激活或者隐藏物体取决于具体的设计,还可以采用将物体移动到某个位置等方法。
2024-02-09 16:55:31 284 1
原创 c#中使用反射来保证单例模板的唯一性
在原有的单例模板中,由于使用的new来构建对象,并且因为是泛型模板,所以必须要带有泛型约束new()。确保子类有公有的无参构造函数,才能正常的进行new。但是这样做会带来一个问题,在外界可以通过new的方式来构建子类的对象,或者直接通过基类来new出对象。这样在子类中就能设置私有类型的构造函数。使用new构建对象的单例模板。
2024-02-07 20:26:37 311 1
原创 Unity 基础小框架(一):基于观察者模式的事件中心模块
通知者具有基础的订阅、发布、取消的方法,并带有一个字典,字典用来记录以及储存不同类型的观察者事件。根据事件类型的不同,通过委托链的方式来调用一系列同类型的事件。使用委托的方式进行驱动,跟原先的观察者模式相比,使得观察者对象不用再去实现消息更新接口,并且需要更新的方法也不用使用相同的名称,但是必须拥有相同的参数列表和返回类型。观察者模式其实就是在解除耦合,让耦合的双方都依赖抽象,而不是依赖于具体的实现,使得各自的变化都不会影响另一边的变化。在事件的订阅和取消方面需要及时的去操作,否则可能带来一些影响。
2024-02-05 17:19:13 208
原创 在Unity,C#中使用不同种类的单例和单例模板,并分析缺点
列举了在c#开发以及unity脚本中使用的单例和单例模板,针对使用环境,分析了存在的问题
2024-02-05 16:03:18 2310 2
原创 对于摩尔投票法的理解
有一个记录商品的管理表,记录商品的id。arr[i]就表示商品的id。商品id可能会重复返回管理表中数量大于商品总数一半的id。例如:arr = {0, 1, 2, 3, 4, 5};
2023-10-31 20:40:10 59 1
原创 Unity Scroll View自动滚动
(默认值)时,当用户在滚动内容后释放鼠标或手指时,内容会继续根据之前的速度滚动一段时间,并逐渐减速直到停止。因为鼠标不操作的情况下,会设置滚动视图的速度一直为0,这样就没办法进行自动滚动。正常情况下,鼠标点击或者拖动会使其开始滚动,也就是等于调节了ScrollView上ScrollRect组件的速度值。Inertia一定要勾选上,并且DecelerationRate必须是一个大于0的值,在这里默认值就行。如果想禁止鼠标拖拽,可以简单的关闭画布上的图形射线投射组件,这样鼠标不会对ui进行检测。
2023-10-02 15:32:43 1267 1
原创 Unity ui水平布局组 (Horizontal Layout Group)
然后,在控制子项的大小时,布局组不会让子项的大小超过偏好大小。但是,如果布局组启用了 Child Force Expand 选项,则始终会使所有子项的灵活大小至少为 1。向需要扩展的子项添加布局元素组件并在这些布局元素上启用 Flexible Width 或 Flexible Height 属性,即可轻松控制此行为。向需要扩展的子项添加布局元素组件并在这些布局元素上启用 Flexible Width 或 Flexible Height 属性,即可轻松控制此行为。分别对应左,右,上,下。
2023-10-02 00:06:47 1322 1
原创 Unity ui内容大小控制器(Content Size Fitter)
添加该组件后,inspector面板矩形变换里的宽度和高度,会受Content Size Fitter里高度和宽度的选择可能会变为只读。例如,现在有一个滚动视图,通过程序控制会增加content里子物体的个数。想要让content的宽度自动适应子物体个数的变化。通过附加Content Size Fitter组件,设置Horizontal Fit 为偏好尺寸。常用比如让附带有文本组件的矩形去自动适应文本的变化。运行之后,Content发生了相应变化去适应。可以用来使矩形自动适应ui元素内容。
2023-10-02 00:05:30 264 1
原创 Unity ui布局元素组件 (Layout Element)
最小大小(Min Size):指定布局元素的最小尺寸,确保布局元素不会变得比最小尺寸更小。如果布局元素的实际大小小于最小大小,则布局系统会自动扩展它们以满足最小要求。Layout Priority 为布局优先级,如果一个游戏对象有一个以上的布局元素,将优先使用优先级高的组件中的属性。灵活大小(Flexible Size):指定布局元素的可伸缩性,表示布局元素可以根据剩余空间进行拉伸或收缩的程度。偏好大小(Preferred Size):指定布局元素的首选尺寸,表示布局元素希望具有的理想尺寸。
2023-10-02 00:04:16 145 1
原创 Unity ui布局元素和布局控制器
布局系统基于和的概念。一个布局元素是具有矩形变换以及其他可选组件的游戏对象。布局元素对自身应具有的大小有一定的了解。布局元素不直接设置自身的大小,而是可由用作布局控制器的其他组件使用布局元素提供的信息来计算布局元素要使用的大小。使用布局元素提供的信息的布局控制器组件示例为以及各种组件。默认情况下,布局元素的最小大小、偏好大小和灵活大小均为 0。某些组件添加时会更改这些布局属性,例如图像和文本组件。这些组件会更改偏好宽度和高度来匹配精灵或文本内容。
2023-10-02 00:01:53 103 1
原创 c++写一个简单的权限控制开关
利用简单的代码就可以实现一个控制开关:#include<iostream>using namespace std;static int k;void test1()//{ cout << "1开启2关闭" << endl; cin >> k; if (k == 1) { cout << "成功开启玩家权限" << endl; } else if (k == 2)...
2021-12-16 20:47:02 1068
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人