image-20201203141501722

image-20201203141518954

image-20201203141549721

需要打开源码版引擎,找到目录Engine\Extras\VisualStudioSnippets,里面有很多后缀是snippet的文件. 或者点击这里下载

如果是非源码版需要使用代码片段可以把这个文件夹复制对应的目录

  • VS导入UE代码片段

在VS中打开Tools(工具)-Code Snippets Manager(代码片段管理器)

image-20201203141902771

点击上图中的导入,找到之前所有snippet文件选择导入

然后在VS中按下组合键Ctrl+K然后Ctrl+X就可以选择所有代码片段了

Pure MVC是在基于模型、视图和控制器的MVC模式建立的一个轻量级的应用框架.

目前已经广泛应用于各类平台,常见用的语言如C#,Java等

本文尝试根据标准的C++PureMVC框架魔改成UE4版本方便使用的UnrealPureMVC(UPM)框架插件

github:UnrealPureMVC

阅读全文 »

有的时候我们需要对当前工程下的特定资源进行一些操作,比如找到所有图片资源或者所有静态模型资源,然后把这些资源信息发到某个UI上进行操作等等

本文对UE4资源注册模块AssetRegistry进行简单的分析

目前蓝图已经封装了相应的库,可以非常方便的调用

Asset Registry模块负责处理引擎下的资源信息(收集/检索*.uasset),从这个模块中可以读取到所有资源信息(FAssetData)

FAssetData

主要参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*Obj的具体路径,比如 /Game/ThirdPersonCPP/Blueprints/ThirdPersonCharacter.ThirdPersonCharacter*/
FName ObjectPath;
//比如/Game/ThirdPersonCPP/Blueprints/ThirdPersonCharacter
FName PackageName;
//比如: /Game/ThirdPersonCPP/Blueprints/
FName PackagePath;
//资源名称
FName AssetName;
//资源class的名称,如果是蓝图则是Blueprint
FName AssetClass;
/*
UProperty的名称和值的键值对
可以从此获取一些描述信息,比如蓝图资源的BlueprintType等
*/
FAssetDataTagMapSharedView TagsAndValues;
//ChunkID
TArray<int32> ChunkIDs;

在获取Asset的时候需要填充一个结构体参数FARFilter,里面的参数部分类似上述参数,之后再看

FARFilter

对资源进行检索的时候的过滤参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//参考FAssetData
TArray<FName> PackageNames;
//参考FAssetData
TArray<FName> PackagePaths;
//参考FAssetData
TArray<FName> ObjectPaths;
//参考FAssetData
TArray<FName> ClassNames;
//白名单,蓝图不可见
TMultiMap<FName, TOptional<FString>> TagsAndValues;
//黑名单
RecursiveClassesExclusionSet;
//是否递归查找路径
bool bRecursivePaths;
//是否递归查找类继承
bool bRecursiveClasses;
//是否只查询磁盘上的资源
bool bIncludeOnlyOnDiskAssets;

比较需要注意的是ClassNames这个参数,这个类型并不是我们场景中对象的类型,打个比方,我们场景里的玩家一般是ACharacter,但是我们的资源其实就是Blueprint,所以在填充这个结构体的时候并不能用*.::StaticClass()来给与Class类型

一般情况资源的创建类型就是用右键创建出来的名称或类似的名称,并且都是继承自Object

FAssetRegistryState

储存了读取asset后的相关信息,用作磁盘内容的cache数据,用于描述asset registry当前的状态,可以由IAssetRegistry进行使用和维护。把这些数据单独组成一个FAssetRegistryState类,是为了减少耦合性,因为引擎中除asset registry外的其他模块 也需要用到这些数据。

主要方法

我们可以通过static TScriptInterface<IAssetRegistry> GetAssetRegistry();获取单例

蓝图亦可以

image-20201127165818065

1
static UObject* GetAsset(const FAssetData& InAssetData);

通过上述方法可以自定义的根据FARFliter参数来获取所需的资源数据

如果不清楚每个参数的含义,可以反向的通过下面方法来查看

1
static FAssetData CreateAssetData(const UObject* InAsset, bool bAllowBlueprintClass = false);

1
2
3
bool GetAssetsByPackageName(FName PackageName, TArray<FAssetData>& OutAssetData, bool bIncludeOnlyOnDiskAssets = false) const;
bool GetAssetsByPath(FName PackagePath, TArray<FAssetData>& OutAssetData, bool bRecursive = false, bool bIncludeOnlyOnDiskAssets = false) const;
bool GetAssetsByClass(FName ClassName, TArray<FAssetData>& OutAssetData, bool bSearchSubClasses = false) const;

上面三个方法根据不同方式来获取对应的资源

1
void GetSubPaths(const FString& InBasePath, TArray<FString>& OutPathList, bool bInRecurse) const;

基于一个基础路径获取子路径,比较有用


1
2
bool GetReferencers(FName PackageName, TArray<FName>& OutReferencers, EAssetRegistryDependencyType::Type InReferenceType = EAssetRegistryDependencyType::Packages) const;
bool GetDependencies(FName PackageName, TArray<FName>& OutDependencies, EAssetRegistryDependencyType::Type InDependencyType = EAssetRegistryDependencyType::Packages) const;

获取引用和依赖关系,也很有用


1
2
3
4
	void SearchAllAssets(bool bSynchronousSearch);
void ScanFilesSynchronous(const TArray<FString>& InFilePaths, bool bForceRescan = false);
void ScanPathsSynchronous(const TArray<FString>& InPaths, bool bForceRescan = false);
//等等

扫描/搜索文件,不需要返回值,因为扫描以后文件就保存在FAssetRegistryState内了

录制_2020_10_31_14_52_47_579~2

上一篇留下了一个镜头抖动问题,实际上ALS项目是通过自定义CameraManager实现的,本篇就此来展开一下

AdvancedLocomotionSysemV4分析(一):移动和脚步IK

AdvancedLocomotionSystem分析(二):攀爬系统

AdvancedLocomotionSystemV4分析(三):动作叠加

AdvancedLocomotionSystemV4分析(四):布娃娃和起身

阅读全文 »

接下来就是布娃娃系统,对应的就有从布娃娃恢复成正常状态的起身动作。

这里还同时分析了一下站立和下蹲姿势的切换,因为起身动作会涉及到这一块

AdvancedLocomotionSysemV4分析(一):移动和脚步IK

AdvancedLocomotionSystem分析(二):攀爬系统

AdvancedLocomotionSystemV4分析(三):动作叠加

阅读全文 »

AdvancedLocomotionSysemV4分析(一):移动和脚步IK

AdvancedLocomotionSystem分析(二):攀爬系统

AdvancedLocomotionSystemV4分析(四):布娃娃和起身

AdvancedLocomotionSystemV4分析(五):镜头


本片主要分析一下ALS项目的动作叠加部分,主要用到各类姿势的切换,如受伤状态、持枪、持弓状态等,另外一种一般项目会用到的AnimOffset在这里没有用到,头部转向用了另外一种方式制作

录制_2020_10_29_16_42_10_43

阅读全文 »

ALS系统的攀爬系统思路比较简单,播放蒙太奇配合位置的刷新。缺点是没有中间状态,意味着无法打断或者做平移等

后面我打算尝试改成加入中间过程的攀爬系统

AdvancedLocomotionSysemV4分析(一):移动和脚步IK

AdvancedLocomotionSystemV4分析(三):动作叠加

AdvancedLocomotionSystemV4分析(四):布娃娃和起身

AdvancedLocomotionSystemV4分析(五):镜头

阅读全文 »

最近对UE4商城AdvancedLocomotionSysemV4进行了一波初步分析,感觉这个项目已经包含了大多数情况能用得到的动画表现,从移动表现中比较容易出问题的脚步问题到IK、攀爬、翻滚、布娃娃以及动作叠加等模块都有讲到

打算参考这个项目的思路重新实现一边动画逻辑,顺便对其中重要的模块和知识点记录一下

这一篇先从基础的移动逻辑,包括转身、起跳等,再顺带看一下脚步IK的实现

AdvancedLocomotionSystem分析(二):攀爬系统

AdvancedLocomotionSystemV4分析(三):动作叠加

AdvancedLocomotionSystemV4分析(四):布娃娃和起身

AdvancedLocomotionSystemV4分析(五):镜头

阅读全文 »

此文讲解如何使用Git版本的小乌龟插件

由于git默认的黑窗口对于部分开发人员特别是美术人员比较不太友好,所以很多人会选择使用可视化的TortoiseGit(小乌龟)插件来协作开发

安装

首先必须先安装git,

Git链接

无脑下一步安装完毕,如需了解git如何使用,可以参考本人另外一篇文章

Git使用指北

然后下载小乌龟插件,可以随意搜索下载,或者使用如下地址下载

TortoiseGit

无脑下一步安装,成功以后右键菜单会添加小乌龟按钮

image-20200921102026347

使用方法

先来一张最简化的流程图,上下两部分分别用文字或者命令来解释流程

协作开发流程 (1)

如果有使用过SVN的同学,在这里要说明gitSVN在使用上会多一步操作,也就是git分布式特点的体现,

git会有本地仓库一个概念,SVNCommit意味着已经把本地修改推送到了远程服务器端,但是gitcommit只是提交到本地仓库,在本地仓库存储着几乎与远程服务器同步的信息,包括所有文件信息、提交日志、分支信息等,也就意味着git可以在没有网络的时候也同样可以维护着一个仓库内容,在需要的时候在同步到远程服务器,这一点对于人数比较多的团队协作开发是优于svn

环境

在正常使用小乌龟之前,需要先配置一下环境

如果使用GitHub仓库,需要到GitHub去注册一个账号,比较简单此步忽略

如果是本地仓库的协作开发的,用已经搭建好的本地仓库ip去注册(例如192.168.1.111),然后需要管理员授权以后就可以参与开发

关于如何搭建本地Git仓库

然后在开发之前,需要生成本地密钥,作为开发权限的一种判定

打开小乌龟安装目录,打开PuTTYgen

界面如下

image-20200921110129186

Generate来生成密钥,或者如果你已经用git生成过密钥,就可以使用Load选项来加载之前生成的私钥,记得勾选AllFile选项

然后进入如下界面

image-20200921110352117

SavePublicKeySavePrivateKey按钮来保存一份本地的密钥文件,我这里把私钥保存为了toPrivate.ppk文件

接下来进入下一步

打开软件Pageant,双击以后如果没有出现窗口记得在右下角找到一个图标,打开以后如下窗口

image-20200921110554461

点击AddKey添加刚才保存的密钥(toPrivate.ppk)

如果到这里之前的步骤提示你需要输入账户/密码的,这是git初始化的时候需要初始化账户,请参考我的git文档完成这一步

目前掌握的信息每次电脑启动时都需要手动添加key,此坑先留着,以后研究

至此,小乌龟的环境已经配置完毕

拉取测试

我在github上有一个测试仓库,我们直接用此仓库来进行测试

地址为git@github.com:VJien/Test.git

右键GitClone,输入URL,保持其他默认,点击OK

拉取成功

image-20200921111331388

修改/提交

我们来对test.txt文件做个修改,然后在新建要给文件 1.txt

test文件里面我们加入一些字符串,保存以后该文件变为红色感叹号

在该目录下右键小乌龟选择Dif,我们在同时用GitBase窗口来对比一下

看到如下提示,表示该文件被修改了

image-20200921112548067

可以右键单击一个文件来选择回退(Revert)或者提交(Commit),似乎不需要Add操作,对于新创建的文件1.txt会不一样,一般需要先AddCommit,对于用惯了黑窗口的我来说,这里还是有区别的

image-20200921113125132

image-20200921113134620

这里我们直接点击大窗口下面的Commit提交测试一番

image-20200921113351447

Message里输入本次提交的名称,记得输入容易查找的名称,万一以后翻看日志如果发现都是 一对0102之类的会很崩溃

点击Commit显示成功

image-20200921113532839

在该窗口上有Push按钮,不过一般我们需要先Pull合并远程仓库的内容(除非是单人开发)

image-20200921113633715

image-20200921113647229

无论是Pull还是Push都需要选择正确的分支,即上图的RemoteBranch,因为不同的分支是用于不同功能或者人员使用的,同时也需要比对本地的分支信息

拉取成功以后可以在窗口按钮里找到拉取信息差异对比等,这个自行测试

然后是提交,一般选好分支,其他保持默认选项

image-20200921113927421

image-20200921114022126

常用功能

先来一个所有功能的图

image-20200921114112053

add

标记需要提交的文件,在GitBase内是所有修改和新创建的都需要add的,在小乌龟里需要对新创建的进行add操作

Switch/Checkout/CreateBranch

image-20200921114312815

创建新的分支和切换分支,类似GitBasegit checkout -b 分支/git checkout 分支操作

  • Revert

回退操作,test文件修改以后即红色感叹号的形况下,点击Revert后见下图

image-20200921114553268

选中点击OK以后就将此文件回退到之前版本

Resolve

解决冲突,这个是新手非常头大的一个问题,也是经常会出现的问题

我在其他文件拉取了这个工程,然后对test文件做了修改,然后回到此文件下同时对test文件修改,这一操作就模拟了协作开发时的冲突问题

然后拉取以后就发生冲突了

image-20200921115129773

然后点击resolve选项进行处理

image-20200921135405643

第一个选项可以看冲突信息,当然不是所有文件都可以看到;同时也可以在下图所示的地方选择使用哪个版本的内容

image-20200921135028147

第3,4选项分别选择使用远程还是本地

解决完成后就再commit->pull->push操作,中间如果有警告出现可以忽略直接进行下一步

merge

在合并分支之前,首先要确保本地有需要合并的分支信息,比如master分支需要合并test分支,但是test分支是在远程电脑上创建的,本地还没有这个分支,那就先需要进行fetch操作

然后就可以找到所有分支了

使用merge操作就可以把test分支合并到本地

前言

我们在项目开发的过程中,经常需要在项目设置里面添加一些参数,本文介绍如何添加这些参数

另外介绍一些特殊的资源类参数的添加和使用

先上图

image-20200831114210083

添加自定义项目设置

一般情况下,我们需要创建一个插件来添加这类属性,我们创建一个蓝图函数库模板的插件

然后创建一个UObject类来添加属性

阅读全文 »