C#
文章平均质量分 50
Unique_849997563
我不太愿意麻烦别人,但我又想不懂就问,所以很矛盾!
展开
-
【排序算法】冒泡、选择、插入排序算法比较
思路:1. 有序比较两个元素,将较大的元素放到数组末尾。2. 循环比较到最后一个元素,此时,这一轮比较出来最大的数就在数组末尾。3. 重复上述步骤,直到没有需要比较的元素。代码:性能分析:时间复杂度是 O(N²),假设数据是随机的,平均交换次数为 N²/4。如果初始数据是逆序的,那么每次比较都要交换位置,交换次数为 N²。思路:1. 从所有元素中选出最小的元素,将最小的元素放在数组第一位。2. 从余下的元素中找出最小元素,放在数组第二位。3. 循环选择到排序结束。代码:性能分析原创 2022-07-06 11:43:37 · 399 阅读 · 0 评论 -
【寻路】超级简单的A星寻路算法实现
A星寻路算法是一种计算最短路径的算法,通过遍历周围所有可以前进的点,计算出最优路径。它吸取了Dijkstra 算法中的优点,为每个边长设置权值,不停的计算每个顶点到起始顶点的距离(G),以获得最短路线,同时也汲取贪婪最佳优先搜索算法中不断向目标前进优势,并持续计算每个顶点到目标顶点的距离(Heuristic distance),以引导搜索队列不断想目标逼近,从而搜索更少的顶点,保持寻路的高效。......原创 2022-06-30 10:18:15 · 648 阅读 · 0 评论 -
【对象池】未判断两个对象是否相同引起的问题
最近处理了一个几个版本之前遗留的问题,代码是一个离职的同事写的,测试发现了这个问题,但是不能稳定重现,所以一直没有修改。最近有玩家反馈过来,重现几率比较大,于是用玩家的号重现这个问题。现象:战斗时会偶发性的缺少一些数据。具体表现是进战斗时有六个武将,但是显示出来会缺少一些武将。经过多次调试,发现进战斗数据没有问题,只是显示出现了问题,显示的地方是取View代码里面的数据,并未修改。代码逻辑:1、先从对象池查看是否有空闲View,有就取出来使用,没有就新创建,将使用的对象放到队列里面保存下来,原创 2022-05-23 17:58:57 · 219 阅读 · 0 评论 -
Unity打字机效果扩展使支持富文本
前段时间策划在打字机的文本中配置了富文本,修改某些文字的颜色,但是公司原有的代码只有基础的打字机效果,不支持富文本,代码逻辑就是将文本转换位字符数组,然后再Update中根据间隔拼接字符串显示文本。基本打字机主要代码逻辑:if (_isPlaying) { _timer += Time.deltaTime; if (_timer >= Interval) {原创 2022-03-23 20:44:00 · 3881 阅读 · 0 评论 -
【Unity编辑器扩展实践】、扩展Hierarchy菜单
原创 2022-03-08 21:08:09 · 4540 阅读 · 0 评论 -
Unity中运行的模型突然从场景中消失
现象:Unity运行中的模型突然从Game场景消失,Hierarchy双击选中这个模型,Game场景中又会显示出该模型。项目中新增了两个模型,开场动画时,模型是从高处跳下。模型循环播放到第二次是,莫名其妙的突然凭空消失。想看看模型在什么位置,结果选中又会显示出来,而且不会消失。查看了摄像机渲染都没有问题,百思不得其解。在网上搜了一下,发现也有人遇到这个问题。Unity3d奇怪的坑——有动画的模型在场景中突然不显示于是修改模型上Animation的CullingType试了一下,果然是这个问题原创 2022-01-26 17:42:31 · 10831 阅读 · 3 评论 -
关于Animation参数missing的坑
前段时间游戏遇到一个真机闪退问题,没有打印,没有加载报错,找问题来真是头大。渠道:PPTV问题:模型预制体上一个Animation组件中 clip丢失。现象:加载资源闪退。猜想:我们项目是依赖打包,该预制体单独打包为A,它依赖的所有clip打成一个包B。加载预制体A时,发现它有依赖关系的动画片段未加载,会去加载B包,但B包里面没有该动画片段。没有报错是因为A包和依赖包B确实加载成功。疑问:只有一个渠道才会闪退,其他平台都能正常运行,会不会是PPTV的SDK处理加载导致崩溃。今天在加载原创 2022-01-24 17:52:33 · 3523 阅读 · 0 评论 -
XLua笔记(二)
XLua笔记https://blog.csdn.net/qq_33461689/article/details/113738755?spm=1001.2014.3001.5501一、XLua的枚举转换:之前的项目用过XLua的cast强转,枚举可以使用cast强制转换吗?今天试了一下, 发现转换不了。翻了一些博客,加上自己实践,整理了一下五种枚举使用和转换的方式:C#新建一个测试枚举:public enum TestEnum{ Null = 0,}Lua代码测试调用C#..原创 2021-12-14 12:18:16 · 1066 阅读 · 0 评论 -
创建随机的测试文档
因为我想测试比较文件的方法,所以随机了一些数字存到文本里面进行测试。C#比较两个文件内容是否相同https://blog.csdn.net/qq_33461689/article/details/121499130?spm=1001.2014.3001.5501 int _writeLength = 1024; string _testPath = @"F:\测试文档.txt"; private void WriteText() { StringBu.原创 2021-11-24 16:33:39 · 130 阅读 · 0 评论 -
C#比较两个文件内容是否相同
今天看到项目的比较文件是先将所有字节读出来,然后逐一进行比较,想找找有没有可以优化的地方。在网上看了一下,有比较哈希码的,验证了一下,发现不管是文件开始就不相同,还是文件末尾才不相同,都比较耗时。C#比较两个文本文件的内容是否相等 - 五点 - 博客园 (cnblogs.com)测试文件大小:10000KB一、比较哈希码先将文件内容转成哈希码,然后进行比较。 public static bool CompareFile(string sourceFilePath, string原创 2021-11-24 16:23:03 · 4018 阅读 · 0 评论 -
C#中的值类型和引用类型
C#中的类型分为:值类型和引用类型。值类型:int,char,bool或自己定义的struct称为值类型,数据存储在栈中。引用类型:array、string或自定义的class称为引用类型,数据存储在堆中,栈中只存储了变量的引用地址。C#中可以通过 属性 Type.IsValueType 获取该类型是否为值类型。示例: //值类型 public struct TestStruct { public int X; } //值类型 .原创 2021-07-07 20:58:32 · 641 阅读 · 0 评论 -
【实战案例】Unity从零开始开发初级案例 - 找你妹
一、前言前段时间和对象完《找你妹》这个小游戏,难分高低,顺便想了一下实现原理,按照自己的思路仿一个游戏出来,熟悉整个开发流程,整理基本的知识点,总结一下经验。二、实现思路初始化到界面里的每个图片(Item)都是一个数据(Data),有着对应的一个或者多个类型。界面上方提示的是当前需要选择的类型,玩家点击Item时,如果Data里面有对应的类型,则满足条件。三、实现细节1、初始化数据读取配置表里面的配置,content size fitter原创 2021-03-27 16:46:57 · 801 阅读 · 0 评论 -
【Unity编辑器扩展实践】、使用CopyTo迁移Unity中的资源
一般情况下,项目开发中都会有多个版本,我们项目是一个Int开发版本,一个Patch补丁版本,一个Release开放版本。刚完成开发阶段,将资源对比到Patch后,又在Int上修改的东西,也需要及时对比到Patch上,如果东西多,一般使用Beyond Compare进行比较,而如果修改东西较少,通常是在文件夹中打开当前资源路径,复制当前资源,修改当前文件夹路径,复制到对应路径。使用CopyTo迁移Unity中的资源。 private static Object[] objs; [Men原创 2021-03-25 17:38:01 · 996 阅读 · 0 评论 -
XLua笔记
1、XLua强制类型转换cast(data,type)第一个参数是需要强转的对象,第二个参数是目标类型例如:有一个对象_resData需要强转为C#类型ResourceData。local _resdata=_datacast(_resdata, typeof(CS.MapTileResourceData))2、XLua调用带泛型函数创建一个带泛型的GetTest函数。public class Test{ public Test GetTest<Test&g原创 2021-03-23 12:07:33 · 2274 阅读 · 0 评论 -
【框架系统】单机游戏数据的存储
序列化,是指把一个对象转换为二进制内容,本质上就是一个byte[]数组的过程。反序列化,即把一个二进制内容(也就是byte[]数组)恢复回对象的过程。为什么要把对象序列化呢?因为序列化后可以把byte[]保存到文件中,或者把byte[]通过网络传输到远程,这样,就相当于把对象存储到文件或者通过网络传输出去了。原创 2021-03-23 11:17:00 · 2350 阅读 · 2 评论 -
C#通过反射给对象赋值
在做配置表新建测试脚本:public class TestData{ public string Test ; public int Test1; public TestData() { Test = "默认值"; Test1 = 0; } public void Log() { Debug.LogError(Test+":"+ Test1); }}根据类型创建对象,设置.原创 2021-01-29 10:55:11 · 3328 阅读 · 0 评论 -
【框架系统】事件系统
事件回调委托public delegate void EventCallBack(params object[] args);添加事件 /// <summary> /// 添加事件 /// </summary> /// <param name="type">枚举类型</param> /// <param name="callBack">事件处理回调</param> public v原创 2021-01-27 14:37:04 · 612 阅读 · 0 评论 -
【框架系统】Unity读取Json文件做游戏配置表
框架系统:看一个小游戏源码的时候,发现他是使用Json作为游戏的配置表,但是在读取配置时,使用的是string作为配置表的key,index作为配置表的id,个人认为这样极为不方便。一是没有遵循面向对象编程的开闭原则,不利于配置的扩展;二是用string做key,比较麻烦并且可能出错。所以想重构一个配置表框架实现原创 2021-01-26 10:48:52 · 1791 阅读 · 0 评论 -
【Unity】反射:编辑器中通过类名获取Type
做配置表工具的时候,用到通过类名获取类的Type:Type type = Type.GetType(_className)发现一个问题,在Unity运行代码中创建一个类:通过GetType能正常获取该类的Type,但是在编辑器代码中,Get出来的却是null。猜想在当前的Assembly中没有该类。Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();在两个代码中获取当前的程序集,发现是两个不同的.原创 2021-01-25 17:08:12 · 3868 阅读 · 0 评论 -
Unity通过代码修改Scripting Define Symbols(宏定义)
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEditor;using System;public class XLuaExample : EditorWindow{ private static string def = "HOTFIX_ENABLE"; [MenuItem("XLua/添加宏定义")] static void AddXlu.原创 2020-08-26 19:56:28 · 3698 阅读 · 0 评论 -
如何判断线段是否经过一个矩形?(线段与矩形是否相交)
//将直线写成y=kx+b的形式,将图形的所有顶点坐标带入y-kx-b, //如果得到的结果同时大于零或者同时小于零,说明图形的所有顶点都在直线的同侧,即直线不过图形。否则说明图形的顶点分布在直线两侧,直线过图形 public static bool IsPassThroughRect(List<Vector2> VectList, Vector2 begin, Vector2 end) { //求直线公式 double k, b; ..原创 2020-08-24 16:31:21 · 10017 阅读 · 5 评论 -
C#中两个数 快速范围判断
逛知乎的时候看到这个答案,觉得他的代码写得挺有意思。如果我们要判断一个值在不在范围内,通常都是: if (x >= min && x < max) { return true; } return false;想了一下,在实际情况中,好像确实没有用到已知函数直接判断,都是写的If判断。1、如果 int 检测是 大于等于0, 小于等于max 的话,可以直接使用uint来判断: if ((u原创 2020-05-30 11:29:41 · 8488 阅读 · 0 评论 -
【Unity编辑器扩展实践】、查找所有引用该图片的预制体
上一篇Unity编辑器扩展实践二、通过代码查找所有预制中已经查到到所有的预制体了。然后我们就可以用这些预制体做一些其他的操作了,比如查找该预制的资源引用。可以直接遍历预制,找到预制里面的所有Image组件,然后比较Sprite属性的值,看是否和检测的资源相同。Prefabs.Clear(); if (m_sprite == null) return; E...原创 2019-12-30 21:32:50 · 1607 阅读 · 0 评论 -
【Unity编辑器扩展实践】、通过代码查找所有预制
在Unity中对编辑器的扩展,通常都会操作文件的增删改查,这里介绍两种Unity中查找预制的方法,其他文件同理。1、利用AssetDatabase查找预制:通过AssetDatabase的FindAssets方法可以查找到所有文件的guid,参数filter是过滤字符。就是Unity中Project窗口下搜索栏右边两个按钮弹出来的东西,t标识是Type,l标识是lable。(如"Prefa...原创 2019-12-30 21:30:04 · 3511 阅读 · 0 评论 -
【Unity编辑器扩展基础】、GUI
一、静态属性1、颜色改变背景颜色:GUI.backgroundColor改变内容颜色:GUI.contentColor改变内容改变内容和背景颜色:GUI.color //改变背景颜色 GUI.backgroundColor = Color.yellow; GUI.Button(new Rect(0, 0, 200, 30),...原创 2019-12-12 16:51:31 · 1919 阅读 · 0 评论 -
【Unity编辑器扩展基础】、GUILayout
小结:1、TextArea、TextField等文本输入框不能复制,TextArea可以换行,可以自适应宽。2、参数可以传GUIContent的都可以显示图片或文字。3、GUILayout.Window需要调用BeginWindows、EndWindows才能显示窗口。using System.Collections;using System.Collections.Gen...原创 2019-11-22 16:30:56 · 3602 阅读 · 0 评论 -
【Unity编辑器扩展基础】、EditorGUILayout (三)
小结:1、画下拉框的方法有DropdownButton、EnumMaskField、EnumPopup、IntPopup、Popup、EnumMaskPopup、MaskField,DropdownButton比较麻烦,EnumMaskField、EnumMaskPopup、MaskField可以多选。2、画Slider的都没什么区别,只是MinMaxSlider是取值范围。usin...原创 2019-11-22 00:11:25 · 4072 阅读 · 1 评论 -
【Unity编辑器扩展基础】、EditorGUILayout(二)
小结:1、类似BeginFadeGroup、BeginHorizontal布局函数都有与之对应的EndFadeGroup、EndHorizontal,他们是一一对应的;2、创建ToggleGroup,关闭之后该ToggleGroup下的内容都不能在该组下面修改。3、BeginScrollView返回值是该滑动区域的位置,需要将它存下来,才能改变BeginScrollView的位置。...原创 2019-11-21 00:12:36 · 4848 阅读 · 0 评论 -
【Unity编辑器扩展基础】、EditorGUILayout (一)
小结:1、EditorGUILayout的各种Field和GUILayout的类似,但是EditorGUILayout可以复制粘贴;2、因为OnGUI是每帧执行的,EditorGUILayout中类似TextField、IntSlider、ColorField需要传一个值,返回修改值的,需要将返回值赋值给临时变量;3、params GUILayoutOption[] options可以...原创 2019-11-21 00:03:58 · 4821 阅读 · 0 评论 -
Unity利用CustomEditor扩展Inspector
在Unity中,当我们在Hierarchy或者Project面板中选择一个对象是,Inspector面板中会显示此对象的属性。很多时候,编写Unity工具的时候都需要扩展一下脚本在Inspector上的显示属性,添加一些按钮或者显示信息。这时候就需要用到CustomEditor属性了。1、创建一个ExampleEditor脚本,在类上添加[CustomEditor(typeof(T))]属...原创 2019-04-30 16:37:41 · 11539 阅读 · 0 评论 -
【Unity编辑器扩展实践】、利用txt模板动态生成UI代码
在使用Unity3D开发过程中,随着工作时间的推移,你肯定会发现写的代码,就只有那几个模板。比如控制UI的View代码,你会发现格式都是一样的,添加引用、UI变量声明、Awake中给UI变量赋值、添加Button事件、Destroy中注销事件。可以说都可以通过一个模板写出来。这里就介绍一个我用C#写的一个利用txt模板来生成代码的工具,如果有不太好的地方,还请谅解。之前我写了一个模板生成的代码...原创 2019-11-14 21:32:17 · 820 阅读 · 0 评论 -
关于字符串转换的一些小技巧
开发中一般都会遇到需要切割字符串的时候,你可以用一些特殊符号作为字符串的分割符,比如+、&、|等,然后用这些符号切割字符串,得到字符串数组,例如: //string str= "5+30";public string[] Str2StrArray(string str, char symbol) { if (string.IsNullOrEm...原创 2019-10-24 00:04:48 · 179 阅读 · 0 评论 -
Unity中的 GUILayout.TextField实现复制粘贴功能
前一段时间,在项目中使用他们写的窗口工具的时候,发现有的TextField虽然可以选择,但是不能复制粘贴,然后有同事就去找了解决方案,用一个方法把选择的内容复制粘贴到剪切板上,代码如下: public static string HandleCopyPaste(int controlID) { if (controlID == GUIUtility.keybo...原创 2019-10-16 20:33:21 · 2247 阅读 · 2 评论 -
使用C#代码读写XML文件
使用C#代码读写XML文件一、创建XML文件 private void CreateXml() { //创建XML文档实例 XmlDocument xmlDoc = new XmlDocument(); //创建根节点 XmlElement root = xmlDoc.CreateElement("config"...原创 2019-10-16 16:42:54 · 280 阅读 · 0 评论 -
UGUI使用小技巧(五) Scroll Rect组件的使用
在功能开发中,由于可能需要显示很多数据,但是一个界面显示不下,经常都会遇到需要滑动的列表,如背包,排行榜等,这些地方基本都会用到Unity3D的Scroll Rect组件来实现滑动功能。除此之外,Scroll Rect还有一些小技巧,可以用来滑动文字,图片,达到一些别的功能。一、基本用法经常使用到的组件:Scroll Rect、Mask、GridLayoutGroup首先Unity的H...原创 2019-10-28 20:47:56 · 4760 阅读 · 0 评论 -
获取枚举里的所有枚举
using UnityEngine;using System;/// <summary>/// 获取枚举里的所有枚举/// </summary>public class 枚举测试 : MonoBehaviour { private void 测试() { var arr = Enum.GetValues(typeof(测试枚举)...原创 2019-10-12 11:56:58 · 2418 阅读 · 0 评论 -
Unity中C#和Java的相互调用
1、通过C#调用Java的方法: 在C#中添加调用的一些代码,利用Unity提供的一些接口实现调用Java! private const string JAVA_CLASS_Name = "com.unity3d.player.UnityPlayer"; private void CallJavaFunc(string javaFuncName, params object原创 2018-01-30 22:18:54 · 5970 阅读 · 1 评论 -
Unity编辑器的扩展,MenuItem的使用整理
本来是想学习一下ScriptableObject的,看到例子上边有CreateAssetMenu,就想到自己经常搞忘MenuItem的用法,所以整理一下!CreateAssetMenu主要是应用在类上。添加CreateAssetMenu后,在Project面板中右键,默认就会在Create菜单下,测试了一下,这个属性是创建.asset文件用的,如果类继承MonoBehaviour或者不继承...原创 2018-01-19 15:32:06 · 3140 阅读 · 0 评论 -
lua和C#中函数string.format对字符串常用的格式化整理
在lua中,函数string.format是用来对字符串进行格式化,第一个参数为格式化串:由指示符和控制格式的字符组成。指示符后的控制格式的字符可以为:十进制'd';十六进制'x';八进制'o';浮点数'f';字符串's'。在指示符'%'和控制格式字符之间还可以有其他的选项:用来控制更详细的格式。常用的控制格式如下:print(string.format("十进制:(%d)",10)) --常规...原创 2018-02-06 10:33:54 · 1629 阅读 · 0 评论 -
C#使用String.Format常见报错
C#中使用String.Format(string format,object arg)连接字符串,format中添加带索引的占位符如:{0},然后就可以得到相应的字符串。其中会遇到几个常见的异常。异常一、FormatException: Index (zero based) must be greater than or equal to zero and less than t...原创 2018-04-25 19:31:44 · 5565 阅读 · 0 评论