win10代码长路径操作
之前有说过在win10下启用长路径的问题问题 win10下长路径异常,但是在unity的项目里,还是有些代码在堆长路径有异常的!
路径的问题
在默认的情况下,使用的通常是相对目录或者是类似c:/some/some1/name.txt这样的路径,但是当路径超过260的时候,基本所有操作结果返回的都是Could not find a part of the path!
https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd
官方给了这样的解决方案\\?\!
但是有几个注意事项:
所有的/都必须转换成 \
必须是完整的路径,eg:E:\a\b\...
光栅化算法
直线绘制
逐点比较法
正负法
数值微分算法 DDA
bresenham算法
改bresenham
起始点\(P_0(x_0, y_0)\)
终点\(P_1(x_1, y_1)\)
逐点比较法
https://blog.csdn.net/ABC13222880223/article/details/83176512
正负法
https://blog.csdn.net/qq_26982531/article/details/69946738
数值微分算法 DDA
计算其斜率
\[k=\frac{\Delta y}{\Delta x}=\frac{y_1-y_0}{x_1-x_0}\]
步进的形式,已知 $P_i$ 那么其下一个点就可以算出...
Unity中Lua热更ab的方案
背景
目前使用的lua代码文件都是进过了Luajit生成的bytes文件,而且因为是动态生成,而且是难以直接修改,所以项目工程一般都不会对其进行版本管理,这样就导致每次生成的bytes文件的guid都会不一样!
guid不一致
-g和不带-g的bytes文件不一致
由于以上两个原因,使得每次对AssetBundle进行hash值比较的时候,都有差异,使得每次热更包里都带有lua ab;
过程
过程有点多,这里还是一步一步说吧!
-g的信息
项目刚开始发现问题的时候,因为调试需要异常的堆栈,所以在平时develop的时候,通常使用的都是-b -g的参数去Encode,而需要对外的时候仅仅使用了-g的参数去Encode。
-g去encode lua的时候,使得生...
apk替换静态库
背景
因为项目工程在手机平台上有bug,但是却只有部分apk容易复现,大部分都比较难复现或者干脆不出现了!
而且因为早期并没有预想到那些地方或许有问题,没有做好日志埋点,所有我第一个想到的就是直接替换apk中的.so文件,在新的.so中添加我想加的log
该apk工程是unity的项目
解包
这里使用的是apktool
java -jar ./apktool.jar d ./test.apk -o ./test
以上指令就直接把apk中的内容解压了(这里是我自己的apk,因为是测试包,并没有加固之类的);
替换静态库
我们把新编译好的静态库替换掉原本静态库,直接在./test/lib/arm64-v8a下替换就可以了(我只打包一个cpu类型的!)
重打包
jav...
Internal的跨dll访问
背景
在Unity的项目中,经常遇到各种internal的方法或者是类,但是我又需要继承或者使用它,目前我的解决方案有一下几个:
Reflection
InternalsVisibleToAttribute
IgnoresAccessChecksToAttribute
修改dll
Reflection
反射,通过type获取其fileInfo、MethodInfo等
Field
private T GetReflectionField<T>(Type superType, string fieldName)
{
var reflectFileInfo =superType.GetField(fieldName,
BindingF...
UE使用cpp代码打开EditorUtilityWidget
平时写ue小工具的基本都是使用EditorUtilityWidgetBlueprint;
如果工具稍微一多,直接通过ContentBrowser的话,不是很方便!
所以我比较喜欢在Menu中
void FMyEditorModule::OpenFrameworkConfig()
{
// 因为我是放置在plugin中的,所以我这里不是/Game
FString assetPath = TEXT("EditorUtilityWidgetBlueprint'/MyPlugin/Editor/BP_FrameworkConfig.BP_FrameworkConfig'");
auto asset = UEditorAssetLibrary::LoadAsset(asset...
UE Slate样式
先说明一下,这个是因为写插件的时候需要用到的,项目中如果有需要的话,也可以参考!
前提
在Module要使用Style之前,我们就已经需要对style进行注册了!
void FMyEditorModule::StartupModule()
{
// 创建style
FMyEditorStyle::Initialize();
...
}
还有在Module销毁的时候记得清理一下
void FMyEditorModule::ShutdownModule()
{
FMyEditorStyle::Shutdown();
}
注册style
为了防止多次生成一些对象,我这里使用了静态
TSharedPtr< FSlateStyleSet > FM...
159 post articles, 20 pages.