自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(120)
  • 收藏
  • 关注

原创 为2022年立下的Flag

首先复盘下2021立下的Flag 每周看一部英语电影 没时间和没动力。总之就是失败了,明年采用另一个形式来切入英语学习。 每周从之前的工作笔记中提炼至少三篇技术博客。 写了116篇。不算完全失败吧。不过当前绝大多数都是基于他人的博客来编写的。而其实我自己的沉淀中远远不止116不过由于有些涉及项目的代码所以不是很方便拿出来,改造又嫌麻烦。所以这个还可以吧。 体重下降10斤。 失败到离谱,各种东西准备可是却都没啥用。。减肥还是要的但是换一种思路吧。 还完外债。 嗯,只剩下

2021-12-31 11:14:14 373

原创 快速解析Png格式图片获得其宽高

快速解析Png格式图片获得其宽高前言在Unity中我们常常需要将图片加载为Texture2D才能知道其宽和高。但是这样意味着要写这样的代码获取图片Byte[]数据。Texture2D tex = new Texture2D(16,16);string pngPath = "D:\\1\\Long.png";Byte[] aa = System.IO.File.ReadAllBytes(pngPath);tex.LoadImage(aa);这样无疑开销较大且没有必要。Pn

2021-12-01 10:18:42 1137

原创 C#委托(Delegate)

C#委托(Delegate)什么是委托?委托是一种引用类型,它是函数指针的托管班。在C#中,委托是一种可以把引用存储为函数的类型。委托可以引用实例和静态方法,而函数指针只能引用静态方法。委托的声明非常类似于函数,和函数不同的是委托不带函数体,并且需要Delegate关键字。委托的声明指定了一个函数签名,其中包含函数列表和一个返回类型。在定义了委托后,就可以声明该委托类型的变量,然后可以将这个变量初始化为与该委托有相同签名的函数进行引用。随后就能通过使用委托变量来调用函数。代码范例声明委托类型

2021-11-03 09:55:57 168

原创 xLua在Unity3D上的热更新应用

前言xLua在热更新上的优势1、可以开发只用C#;2、出Bug时采用Lua来进行热更新,下次整体更新时换回正确的C#。可能忽略的热更新配置 在Unity3D的File->Build Setting->Scripting Define Symbols下添加HOTFIX_ENABLE宏菜单栏中,执行xLua/Generat Code, 会在新建Gen文件夹,下面生成一些wrap文件。 注意: 各个发布平台这个宏需要分别设置。 在代码里头用API设置的宏是不.

2021-10-11 10:12:55 790

原创 定位Unity3D编辑器崩溃的原因

包发布前产生的崩溃 Windows上,C:\Users\username\AppData\Local\Unity\Editor\Editor.log Mac上,log在~/Library/Logs/Unity/Editor.log 包发布后产生的崩溃 Windows上,应用的appname_Data目录下,有一个output_log.txt,记录了详细的log信息。 Mac上,log还在~/Library/Logs/Unity/Player.log。 i...

2021-10-11 09:10:10 1092

原创 Unity3D async和await

前言对比协程async-await是更加更理想的异步方案。介绍首先,理解一下这两个关键字:async:可以把方法标识为异步await:异步方法在碰到await表达式之前都是使用同步的方式执行实现原理Unity提供了一个名为 UnitySynchronizationContext 的默认 SynchronizationContext它会自动收集每个帧排队的任何异步代码,并在主要的Unity线程上继续运行它们。主要有两个方法:1.Send():是简单的在当前线程上去调用委

2021-09-29 10:25:10 413

原创 xLua介绍文档

前言xLua是Unity3D下Lua编程解决方案。全平台支持用Lua修复C#代码bug。XLua顶替Lua的优势  xLua热补丁技术支持在运行时把一个C#实现(函数,操作符,属性,事件,或者整个类)替换成Lua实现,意味着你可以:1、平时的逻辑使用C#脚本即可。2、运行也是C#,性能秒杀Lua。3、有bug的地方下发个Lua脚本fix了,下次整体更新时可以把Lua的实现换回正确的C#实现,更新时甚至可以做到不重启游戏。最最简单的初步应用C#使用Lua脚本的方法 下载x

2021-09-27 15:00:49 154

原创 静态库和动态库详解

静态库和动态库详解静态链接静态库(*.lib)在编译期间由编译器和链接器将它集成到可执行文件中。创建方法 创建项目的时候就要选择创建静态库 和普通代码一样需要增加h和cpp 点击生成解决方案 (Tip:静态库不可独立运行)使用方法CPP文件中包含对应静态库的头文件在项目中附加库目录,有两种方法我一般使用第一种 项目属性设置 (1)项目右键-》属性-》链接器-》附加库目录,在里面加入静态库所在的路径(2)链接器-》输入-》附加依赖项-》输入对

2021-09-24 11:13:36 64

原创 Unity3D纹理介绍及优化

Unity3D纹理介绍及优化Unity3D对于图片的支持 jpg : 有损压缩 文件小 不支持透明 png: 无损压缩 文件小 支持透明 tag:无所压缩 文件大 支持透明 dds : 无损压缩 文件最小 支持透明 不支持iOS 无论任何格式的图片放入Unity后会被转换为Unity自身的Texture2D格式 ,Unity3D只识别2的N次方的图片,因此图片导入后悔自动转为符合标准大小的图片。因此不等价于贴图资源本身的大小。如果原图不是2的幂次方,可以在ad

2021-09-23 18:44:27 370

原创 C++函数指针

定义函数指针就是函数的首地址,而函数名也可以代表指向这个函数的指针。静态成员函数指针声明typedef void (*STATICFUNC) (int a, int b);定义STATICFUNC = 函数名非静态成员函数指针声明typedef bool(ClassName::*TestFunc)(int a);定义TestFunc = &ClassName:函数名。多重继承时函数指针占用包含了this指针的调整值。因为对于多重继承来说,如果类成员

2021-09-17 09:58:24 64

原创 异步和多线程关系

异步编程允许同一时间发生(处理)多个事件。程序调用一个耗时较长的功能(方法)时,它并不会阻塞程序的执行流程,程序会继续往下执行。当功能执行完毕时,程序能够获得执行完毕的消息或能够访问到执行的结果(如果有返回值或需要返回值时)。多线程编程多线程是指同时并发或并行执行多个指令。异步与多线程的区别多线程只是异步编程的一种实现形式。单线程同样也可以实现异步编程。 多线程是程序设计的逻辑层概念,它是进程中并发运行的一段代码,可以实现线程间的切换执行。 异步和同步是相对的,异步就是彼

2021-09-17 09:23:33 181

原创 meta文件介绍

前言meta本质上是一个使用YAML格式来编写的文本文档,它在unity中的作用非常关键,它有2个作用: 保存GUID 保存着非meta文件的GUID。而对于unity的序列化文件来说,引用的对象就是用这个GUID,具有唯一性。所以一旦meta中的GUID变更了。就要注意了这里引用就可能丢失了。 保存ImportSetting 存储资源文件的ImportSetting数据。ImportSetting中专门有存储Assetbundle相关的数据。这些数据帮助编辑器去搜集所有需要打包的文

2021-09-07 15:23:14 3471

原创 C/C++ extern关键字详解

功能说明使用extern 修饰符的目的在于声明:此变量/函数是在别处定义的,要在此处引用。extern声明不是定义,即不可分配存储空间。当在定义这个函数或变量外的地方需要使用它们也可以使用extern关键字其功能相当于:使用头文件,然后声明它们,然后其他文件去包含头文件注:这里疑惑我这边实际项目开发的时候比较少用到这种方式,不懂这个出发点是啥???。extern "C"的作用背景C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称。而C语言

2021-09-06 11:32:13 82

原创 C++ typedef用法

前言typedef可以为现有的类型、数组、指针、函数进行别名的设置。使用的出发点有两个 给变量一个易记且意义明确的新名字。 简化一些比较复杂的类型声明。 类型声明typefef int size;//给int定义了一个size的的别名。typefef unsigned int WORD //给unsigned int 定义了一个WORD的别名数组声明typedef char ccc10[10]定义别名后char[10]等价于 ccc指针

2021-09-06 11:05:44 129

原创 纹理渲染相关概念

基础概念纹理渲染:纹理是一个用来保存图像颜色的元素值的缓存,渲染是指将数据生成图像的过程。纹理渲染就是将保存在在内存中的颜色值等参数生成图像的过程。像素:一个图像初始化后纹理坐标的区间是0~1.在这个单位长度内。图片内的像素也能称为纹素。光栅化(Rasterizing):将几何形状数据转换为片段的渲染步骤片段(Fragment):视口坐标中的颜色像素(相同颜色的像素整合在一起作为片段的存在大于等于像素的存在)。没有使用纹理时,会使用对象顶点来计算片段的颜色,使用纹理的时候会根据纹素来计算。

2021-08-23 19:38:42 325

原创 UE4碰撞体项目设置

路径:Edit=>ProjectSettings=>Engine=>CollisionObjectChannelsYou can have up to 18 custom channels including object and trace channels.你可以有多达18个自定义通道,包括对象和跟踪通道。If you delete an object type that is being used by the game,any uses of that type w

2021-08-23 17:43:57 921

原创 正则表达式

正则表达式入门基础入门正则在线测试工具:https://regexr-cn.com/正则练习:https://codejiaonang.com/字符组[],匹配中括号中出现的元素任意一次匹配数字,[0-9]匹配英文字母[a-z]匹配数字、小写字母和大写字母[0-9a-zA-Z]-:在正则表达式中代表区间,但是如果要单独匹配"-"就需要加上“\”转义字符。匹配非数字:[^0-9]快捷方式\d:匹配所有字符相当于[0-9],取反的方式为:\D\w:匹配数字、小

2021-08-18 11:11:57 65

原创 UMG可见性

Widget 可视性有 5 种:Visible(可视): 可见、可点击HitTestInvisible(非可命中测试(自身和所有子项)): 可见、当前 Widget 不可点击、所有 Child Widget 不可点击SelfHitTestInvisible(非可命中测试(仅自身)): 可见、当前 Widget 不可点击、不影响 Child WidgetHidden(隐藏): 不可见、占用布局空间Collapsed(已折叠): 不可见、不占用布局空间(性能优于 Hidd...

2021-08-18 11:11:21 442

原创 UE4中的类型引用

前言UE4中存在4种引用关系 Object Reference Class Reference Soft Object Reference Soft Class Reference 下面分别介绍各自作用及优缺点Object Reference直接引用资源,也就是“硬引用”。其引用的类会自动被实例化加载到内存中。Class Reference对一个UObject的class的引用,C++中用TSubclassOf来表示。例如以下代码可指定该类只能是派

2021-08-11 14:11:41 1470

原创 UE4 CDO基础

介绍UCLASS宏为UObject提供了一个描述其基于虚幻的类型的UCLASS的引用。每个UCLASS都维护一个名为“类默认对象”的对象,简称CDO。 CDO本质上是一个默认的“模板”对象,由类构造函数生成。CDO是在引擎初始化时创建的,当引擎为每个类生成UClass对象时。每个UClass的实例都是在引擎初始化期间创建的,并被分配为该UClass的CDO。并且包含在反射系统中,如在编辑器可以操作类蓝图。Obj.cpp可以看到引擎CDO初始化创建。功能描述当在编辑器修改时如果是非默认值可以点

2021-08-11 14:11:14 2372

原创 UE4 富文本C++扩展应用

代码路径Runtime\UMG\Public\Components\RichTextBlockDecorator.h该文件有两个类URichTextBlockDecoratorUCLASS(Abstract, Blueprintable)class UMG_API URichTextBlockDecorator : public UObject{ GENERATED_BODY()public: URichTextBlockDecorator(const FObjec

2021-07-29 15:03:24 455

原创 C++ mutable关键字

mutable的中文意思是“可变的,易变的”,跟constant(即C++中的const)是反义词。mutable的存在主要目的是,能够突破const的显示,让mutable修饰的变量永远处于可变状态。

2021-07-26 11:06:34 52

原创 UE4 UCLASS有效关键字和Meta

UCLASS 宏的有效关键字 classGroup 此关键字用于在编辑器中设置显示该类的actor组。 Within 声明此类的实例应始终具有指定类的外部。除非被覆盖,否则它由子类继承。 BlueprintType 将此类公开为可用于蓝图中变量的类型。 NotBlueprintType

2021-07-21 13:59:09 1037

原创 C++位运算

运算符 位逻辑运算符 &(位 “与”) and一个原则,a&b = 1的情况只有a和b都是1.。&通常用于二进制取位操作,例如&1就是取二进制的最末位,取&10就是取倒数第二位。^(位 “异或”)一个原则,不同则为1,相则为0。(1)可以用于简单的加密。。(a^b)^b=a,那么假设a为原始值,b为加密数,则只要通过加密后的数字^b就能获到原有的。值。(2)可以进行不用临时变量的变量值交换。a = a^b...

2021-07-20 10:28:55 52

原创 C++宏相关的基础介绍

定义常量#define ConstNum 1防止魔术数字的书香,用以给常量值表明变量含义。宏定义函数#define MAX(a, b) ( (a) > (b) ? (a) : (b) )这种宏定义函数的方法可以使代码变得更简洁,而且可以提高代码的执行效率,我们知道程序在调用宏定义时,是在代码执行时宏定义的地方直接进行替换,所以不会像调用函数那样进行压栈,让PC指针跳转另一块内存区域,从而使执行效率提高。在编译器的头文件中也有很多类似于这种方式的宏定义,...

2021-07-19 15:18:30 70

原创 32位和64位操作系统区别

寻址能力不同64位系统支持128G的内存,而32位系统最大只可以支持4G内存。要求配置不同64位操作系统只能安装在64位CPU的电脑上,而32位操作系统既能安装在32位CPU电脑也能安装在64位CPU电脑上。内存管理不同相同类型变量在不同的操作系统对应字节数不同。64位系统在内存管理方面遵循8字节对齐,原则:在8字节对齐的情况下,按8个字节为单位分配存储空间,如果不足,会自动补充,本次分配不足以存放下面的变量时,会重新分配空间。  类型     ...

2021-07-14 11:44:07 87

原创 UE4的Android打包指南

环境搭建 安装OpenJDK 安装Android Studio 安装NDK 安装Android SDK 打包操作步骤 选择需要编译的:Configuration:File=>Package Progect =>Build Configuration 选择目标生成项目:File=>Package Progect =>Build Target 选择支持的平台:File=>Package Progect =>Su

2021-07-14 10:08:21 184

原创 UE4烘焙

前言UE4引擎通过editor来创建和管理uasset,但是当游戏发布到不同的平台时需要根据平台转换为不同的格式。而这样的转换过程就叫作烘焙。分为三个步骤 加载包至内存; 为包中的每个对象生成目标平台特定数据 (Derived Data); 把含有平台特定数据的包另存到cooked目录 Loading Package类似于DLL中的导入、导出符号表,Unreal的Package也有一个导入(import)、导出(export)表。Import表示其依赖的在其他包

2021-07-13 15:36:01 816

原创 UE4-Redirects重定向

Redirect类型 ClassRedirects StructRedirects EnumRedirects FunctionRedirects PropertyRedirects PackageRedirects 重定向使用流程1.配置DefaultEngine.ini文件[CoreRedirects]+类型名=(OldName="OldName", NewName="NewName")2.重新打开引擎,打开对应引用的文件重新保

2021-07-06 14:50:09 736

原创 UE4读取ini文件代码示例

FString ConfigFilePath = FPaths::Combine(FPaths::Combine(FPaths::ProjectPluginsDir(), TEXT("Plugin/Config")), "DefaultConfig.ini");FString strTest;GConfig->GetString(TEXT("Test"), TEXT("strTest"), strTest, ConfigFilePath);配置文件内容[Test]strTest = "...

2021-07-06 14:27:25 756

原创 UE4模块设计

Public和Private目录存在的意义核心目的在于满足到处条件支持其他模块调用。因为模块内的代码默认是不导出给其他模块的,所以UE4约定:将需要到处的给其他模块使用的代码文件的头文件放在模块的Public目录。IncludePathModuleNames和DependencyModuleNames比较相同点:二者都能使本模块可以包含其他模块Public目录下的头文件,从而调用函数。不同点:IncludePathModule只能调用定义全部在头文件里的函数.Tip:*In

2021-07-01 10:11:10 320

原创 UE4插件开发

定义UE4引擎、UE4项目都是由各个模块组成的,而插件就是耦合性极低且独立性强的模块。插件目录结构 Binaries:编译后的dll Content:游戏资源Asset Intermediate:编译的中间文件 Source:代码存放位置 .uplugin文件:插件项目配置文件,JSON格式 .Build.cs:每个.build.cs中定义派生自ModuleRules的子类,设置属性控制器从构造函数进行编译的方式。有虚幻编译工具编译,并被构造出

2021-06-28 14:54:02 405

原创 无法解析的外部符号原因

  类的成员函数没有实现就调用   调用没有编译生成cpp 的函数   没有加载lib   有声明无定义   在包含windows头文件冲突的库没有编译成lib或者dll   已经编译了一个cpp,在新加的cpp与已经编译的cpp同名,造成.obj被替换,无法链接,出现无法解析的外部符号(重新生成.obj)   平台下 没有加 __declspec(dllexport) 就编译为动态库 ...

2021-06-28 10:48:26 98

原创 UE4 Interface原理与使用

为什么要使用接口?在游戏开发过程中会出现某些游戏功能被各种不同的类共享使用的情况。所有这些类都需要共享功能但是它们却没有除UObject之外的共同上级。UE4中接口的编写方式UINTERFACE(Blueprintable) class UTestInterface : public UInterface { GENERATED_BODY() }; class ITestInterface { GENERATED_IINTERFACE_BODY()

2021-06-25 18:15:41 528

原创 UE4定时器简单使用

获得定时器FTimerManager timerManager = pWorld->GetTimerManager();定时器句柄FTimerHandle timerHandle;定时执行委托FTimerDelegate timerDelegate销毁定时器timerManager.ClearTimer(timerHandle);开启定时器//间隔时间单位为stimerManager.SetTimer(timerHandle,timerDelegate,intervalTim...

2021-06-24 17:06:58 265

原创 UE4多语言设置

前言以前开发多语言游戏的时候都是自己写文件然后去用多语言的关键字Key去根据当前语言来读取对应的Value。现在UE4可以直接使用多语言。开启本地化功能Edit=>Editor Preference打开本地化配置面板Localization Dashboard设置本地化支持文件的文件路径Tip非C++项目,不需要勾选Gather from Text Files,因为你没有这些文件,如果勾选的话,可能会导致失败。添加语言并激活Gather Text搜索

2021-06-18 11:51:36 359

原创 UE4 ReplicationGraph系统介绍

系统框架图ReplicationGraph是基于TCP和UDP混合的方式实现的。 TCP用于建立Instance间的握手或者连接 UDP用于Replication同步对象 Actor Replication基础介绍 基于UE4的Actor/UProperty/UFunction为单位进行同步 大部分相关的设置可以直接在Editor中直接设置 UE4本身已经提供了一些优化的选项,另外也保留了一些可以自定义优化行为的方式 对于Character

2021-06-09 10:52:53 770 1

原创 UE4 遍历UserWidget下所有UI对象

pUserWidget->WidgetTree->ForEachWidget([&](UWidget* pWidget){ FString widgetClassName = pWidget->GetClass()->GetName(); }});通过上述代码我们能够编译UserWidget下所有子对象。

2021-06-09 10:10:31 1574

原创 UE4获取指定目录下所有文件

UE4获取指定目录下所有文件FString strBasePath = FPaths::Combine(*FPaths::ProjectDir(), TEXT("Content/")); FString allUIFilePath = FPaths::Combine(*strBasePath, TEXT("UI/Wnd/")); TArray<FString> allWndFilePath;IFileManager::Get().FindFilesRecursive(allWn.

2021-06-09 09:44:35 2150

原创 UE5 2021年5月抢先体验版内容

使用快捷键像拉抽屉一样访问资源。 Nanite 虚拟化微多边形几何体系统。虚拟化几何体能够在不牺牲速度的前提下 支持比以前多出几个数量级的三角形。取代了传统的网格体LOD系统,无需任何设置能够处理所有无缝切换。 切换到这个Nanite可视化视图我们就能看到每个三角形在视口中都被渲染为不同的颜色。因为几何体是虚拟化的。 这里的每个实例说是可以包含一、两百万个三角体。。(显卡会爆吧???) 全新的抗锯齿解决方案,时序超分辨率。以1080P的成本实现直追真正原生4K的画质...

2021-05-27 16:13:16 303 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除