[{"data":1,"prerenderedAt":711},["ShallowReactive",2],{"blog-page-26":3,"blog-count":710},[4,321,409,520,637],{"id":5,"title":6,"body":7,"date":297,"description":13,"extension":298,"meta":299,"navigation":302,"path":314,"seo":315,"stem":316,"tags":317,"__hash__":320},"blogs\u002F_legacy\u002F2014\u002F2014-12-23-ue4-event-overview.md","UE4事件相关总结",{"type":8,"value":9,"toc":289},"minimark",[10,14,21,26,35,38,41,48,51,54,57,60,67,70,73,76,79,82,85,88,95,98,101,104,111,114,117,120,123,126,129,132,135,138,142,145,148,151,154,157,160,163,166,169,172,175,178,181,184,195,199,204,207,214,217,222,225,231,234,239,242,247,250,253,262,265,268,271,274,277,280,283,286],[11,12,13],"p",{},"事件机制是实现游戏内逻辑的重要部分，在开始进行游戏逻辑的设计和实现之前，对UE4的事件机制进行理解是非常必要的。于是在这里对UE4的事件相关内容全部整理一下。",[11,15,16,17],{},"当前使用的UE版本是",[18,19,20],"strong",{},"4.6.0。",[22,23,25],"h3",{"id":24},"ue4的内置事件","① UE4的内置事件",[27,28,29],"ul",{},[30,31,32],"li",{},[18,33,34],{},"Event Level Reset",[11,36,37],{},"这个事件如其名称，只存在于Level Blueprint。只能在服务端运行。",[11,39,40],{},"事件发出在关卡被重置时，例如玩家死亡后地图没有重新载入而是重置的情况。",[27,42,43],{},[30,44,45],{},[18,46,47],{},"碰撞检测系列",[11,49,50],{},"Event Actor Begin Overlap",[11,52,53],{},"Event Actor End Overlap",[11,55,56],{},"Event Hit",[11,58,59],{},"Overlap事件仅在两个物体的碰撞属性为Overlap且勾选了Generate Overlap Events时才会发生。而Hit事件则必须有Simulation Generates Hit Events的设置才会发出。碰撞检测事件是游戏逻辑的一个重要的触发点。",[27,61,62],{},[30,63,64],{},[18,65,66],{},"伤害事件",[11,68,69],{},"Event Any Damage",[11,71,72],{},"由环境等因素造成的附加伤害，例如持续性伤害的沼泽地。",[11,74,75],{},"Event Point Damage",[11,77,78],{},"点伤害，是由抛物体引起的伤害。通常用于子弹的伤害以及某些近战武器。",[11,80,81],{},"Event Radial Damage",[11,83,84],{},"辐射状伤害，通常应用于爆炸伤害或其他的间接伤害类型。",[11,86,87],{},"伤害事件只在服务器端发起。",[27,89,90],{},[30,91,92],{},[18,93,94],{},"交互事件",[11,96,97],{},"Event Actor Begin Cursor Over",[11,99,100],{},"Event Actor End Cursor Over",[11,102,103],{},"如其名字所描述的鼠标和物体的交互事件。",[27,105,106],{},[30,107,108],{},[18,109,110],{},"逻辑事件",[11,112,113],{},"Event Begin Play",[11,115,116],{},"Event End Play",[11,118,119],{},"比较经常用到的两个事件，在Actor于世界中初始化和被消去时触发。",[11,121,122],{},"Event Destroyed",[11,124,125],{},"当Actor被销毁时触发，这个事件已经被官方标记了，功能合并到了End Play中。",[11,127,128],{},"Event Tick",[11,130,131],{},"时钟事件，每一帧都会触发。",[11,133,134],{},"Event Receive Draw HUD",[11,136,137],{},"只有在Hud类中才有的事件，可以用于Hud的逻辑和显示设计。",[22,139,141],{"id":140},"碰撞检测相关","② 碰撞检测相关",[11,143,144],{},"碰撞的逻辑和射线追踪使用的逻辑是大体相同的。唯一不同的是追踪扫描线本身也可以拥有响应属性，使得物体可以选择是否阻挡或者忽略这条扫描线。",[11,146,147],{},"一些比较重要的属性包括：",[11,149,150],{},"CCD",[11,152,153],{},"连续碰撞检测。提高碰撞检测的精度，用于防止穿墙和防止二次碰撞。通常在高速移动物体例如子弹的模拟中会用到。",[11,155,156],{},"Always Create Physics State",[11,158,159],{},"在世界载入时而不是碰撞发生时创建物理属性，可以防止游戏运行中突发的大量物理属性初始化引起的卡顿，代价是载入时间的变长。",[11,161,162],{},"Check Async Scene on Move",[11,164,165],{},"同时检查同步物理空间和异步物理空间，异步物理空间主要被用于可破坏物体被破坏后的模拟。",[11,167,168],{},"Trace Complex on Move",[11,170,171],{},"如果使用复杂追踪，则将采用多边形级的模拟。通常采用简单模拟，碰撞图形可以在编辑器中定义。",[11,173,174],{},"碰撞属性的优先如下：",[11,176,177],{},"Ignore>Overlap>Block",[11,179,180],{},"只有在两个参与模拟的物体具有相同的属性时才会触发相应的逻辑，否则采用优先级高的碰撞逻辑。例如两个物体相互的碰撞设置为overlap和block，则会被判定为overlap。",[11,182,183],{},"对于场景中的高速移动物体，即时设定了Block有时也会触发Overlap事件，所以并不建议同时使用这两种类型的事件。",[11,185,186,187,194],{},"更多的实例可以参考",[188,189,193],"a",{"href":190,"rel":191},"https:\u002F\u002Fdocs.unrealengine.com\u002Flatest\u002FCHN\u002FEngine\u002FPhysics\u002FCollision\u002Findex.html",[192],"nofollow","官方文档","。",[22,196,198],{"id":197},"蓝图通信相关","③ 蓝图通信相关",[11,200,201],{},[18,202,203],{},"自定义事件",[11,205,206],{},"UE4允许在蓝图中自定义事件。事件的定义只在该蓝图内部有效。",[11,208,209],{},[210,211],"img",{"alt":212,"src":213},"add_custom_event.png","http:\u002F\u002Fdocs.unrealengine.com\u002Flatest\u002Fimages\u002FEngine\u002FBlueprints\u002FUserGuide\u002FEvents\u002FCustom\u002Fadd_custom_event.jpg",[11,215,216],{},"自定义事件的使用方法基本和自定义函数相同。",[11,218,219],{},[18,220,221],{},"事件调度器",[11,223,224],{},"事件调度器会在被调用后触发所有绑定在其上的事件。",[11,226,227],{},[210,228],{"alt":229,"src":230},"image","\u002Fwp-content\u002Fuploads\u002F2014\u002F12\u002Fimage_thumb.png",[11,232,233],{},"可以绑定、解绑、解绑所有事件，同时如果定义的事件不绑定的话那么就不会被调度器调用。",[11,235,236],{},[18,237,238],{},"蓝图接口",[11,240,241],{},"蓝图接口可以使得不同的物体类型提供相同的功能但是拥有各自的实现，和C++的接口功能类似。在蓝图中定义时没什么太大的问题，唯一需要留意的是对于没有输出的函数会被自动在转化为事件。如下图：",[11,243,244],{},[210,245],{"alt":229,"src":246},"\u002Fwp-content\u002Fuploads\u002F2014\u002F12\u002Fimage_thumb1.png",[11,248,249],{},"如果要在C++中使用，则需要参考文档进行。",[11,251,252],{},"MinimalAPI",[11,254,255,256,261],{},"尽量的不向外暴露内部的函数。在这个情况下，可以通过为函数指定RequiredAPI来将其暴露出去。虽然官方是这么说明的，但是RequiredAPI的使用方式不明，直接使用会提示错误，有可能是包含问题。",[188,257,260],{"href":258,"rel":259},"https:\u002F\u002Fdocs.unrealengine.com\u002Flatest\u002FINT\u002FProgramming\u002FUnrealArchitecture\u002FReference\u002FFunctions\u002FSpecifiers\u002Findex.html",[192],"Function Specifiers","中亦没有说明，手上也没UE4的源码，由于不太可能用到这个设定所以不再研究。",[11,263,264],{},"DependsOn",[11,266,267],{},"声明依赖关系。当接口要使用到别的类中的定义时需要用到。",[11,269,270],{},"DependsOn=(ClassName, Classname, ...)",[11,272,273],{},"CannotImplementInterfaceInBlueprint",[11,275,276],{},"蓝图不能实现的接口，该接口只能在C++中实现。使用了这个指定之后，不能在接口中将函数指定为BlueprintImplementableEvent。相对的，在没有指定亦即可以被蓝图实现的接口中不能使用BlueprintCallable。",[11,278,279],{},"UINTERFACE(…, meta = (CannotImplementInterfaceInBlueprint))",[11,281,282],{},"需要注意的是，定义的接口不能暴露属性同时如果不使用CannotImplementInterfaceInBlueprint的话也无法将函数暴露给蓝图。功能上真的就只是一个单纯的接口。",[284,285],"hr",{},[11,287,288],{},"以上就是对事件相关部分的整理。",{"title":290,"searchDepth":291,"depth":292,"links":293},"",2,3,[294,295,296],{"id":24,"depth":292,"text":25},{"id":140,"depth":292,"text":141},{"id":197,"depth":292,"text":198},"2014-12-23","md",{"layout":300,"status":301,"published":302,"author":303,"author_login":304,"author_email":305,"author_url":306,"wordpress_id":307,"wordpress_url":308,"date_gmt":309,"excerpt":310},"post","publish",true,{"display_name":304,"login":304,"email":305,"url":306},"chaoshikari","chaoshikari@gmail.com","\u002F",1090,"\u002F\u002F?p=1090","2014-12-23 03:55:19 +0000",{"type":8,"value":311},[312],[11,313,13],{},"\u002F2014-12-23-ue4-event-overview",{"title":6,"description":13},"_legacy\u002F2014\u002F2014-12-23-ue4-event-overview",[318,319],"UE4","事件","QNqf2up7GIKwITeZx0gkYQrdMv-h2rVnfImH6eP3hsY",{"id":322,"title":323,"body":324,"date":393,"description":328,"extension":298,"meta":394,"navigation":302,"path":403,"seo":404,"stem":405,"tags":406,"__hash__":408},"blogs\u002F_legacy\u002F2014\u002F2014-11-30-umg%e5%9c%a84-6-0%e7%89%88%e6%9c%ac%e4%b8%ad%e7%9a%84%e5%8d%87%e7%ba%a7%e5%8f%98%e5%8a%a8.md","UMG在4.6.0版本中的升级变动",{"type":8,"value":325,"toc":391},[326,329,332,338,341,346,349,354,359,362,367,372,375,380,383,388],[11,327,328],{},"UE4目前处在一个非常活跃的开发阶段，在升级到4.6.0版本之后。UMG功能已经离开了实验性功能模块，同时这个版本已经支持中文语言了。",[11,330,331],{},"才过了1个多月就有这么大的变动，就只能从断掉的地方从新开始了。好在UMG本身从上一次到现在这个版本并没有什么大的变动。对原有的代码进行检查，目前能找到的变动有下面这些。",[333,334,335],"ol",{},[30,336,337],{},"按钮的绑定函数改为了事件绑定",[11,339,340],{},"原有的绑定函数的形式不再有效，所以要在蓝图中作出相应的修改。",[11,342,343],{},[210,344],{"alt":229,"src":345},"\u002Fwp-content\u002Fuploads\u002F2014\u002F11\u002Fimage_thumb.png",[11,347,348],{},"修改为了事件模式之后，按钮和响应函数之间的关系变得更加直观了。",[11,350,351],{},[210,352],{"alt":229,"src":353},"\u002Fwp-content\u002Fuploads\u002F2014\u002F11\u002Fimage_thumb1.png",[333,355,356],{"start":291},[30,357,358],{},"Border的颜色属性变动",[11,360,361],{},"Border现在默认是白色不透明了，如果原来有使用Border进行布局的话升级之后就会看到界面一片白了。要使用透明效果就必须对颜色修改：",[11,363,364],{},[210,365],{"alt":229,"src":366},"\u002Fwp-content\u002Fuploads\u002F2014\u002F11\u002Fimage_thumb2.png",[333,368,369],{"start":292},[30,370,371],{},"Add to Viewport 函数变更",[11,373,374],{},"AddtoViewPort函数中原本的Modal和Show Cursor参数已经没有了。要实现这两个功能，就必须通过PlayerController进行控制。模态的控制如下：",[11,376,377],{},[210,378],{"alt":229,"src":379},"\u002Fwp-content\u002Fuploads\u002F2014\u002F11\u002Fimage_thumb3.png",[11,381,382],{},"模态相关的话是一个Game和UI的控制权分配问题，通过下面的这组函数进行控制：",[11,384,385],{},[210,386],{"alt":229,"src":387},"\u002Fwp-content\u002Fuploads\u002F2014\u002F11\u002Fimage_thumb4.png",[11,389,390],{},"对上面的改动进行相应的修正之后，原本的代码就可以在新的版本中正常的工作 了。",{"title":290,"searchDepth":291,"depth":292,"links":392},[],"2014-11-30",{"layout":300,"status":301,"published":302,"author":395,"author_login":304,"author_email":305,"author_url":306,"wordpress_id":396,"wordpress_url":397,"date_gmt":398,"excerpt":399},{"display_name":304,"login":304,"email":305,"url":306},1079,"\u002F\u002F?p=1079","2014-11-30 05:08:11 +0000",{"type":8,"value":400},[401],[11,402,328],{},"\u002F2014-11-30-umg在4-6-0版本中的升级变动",{"title":323,"description":328},"_legacy\u002F2014\u002F2014-11-30-umg%e5%9c%a84-6-0%e7%89%88%e6%9c%ac%e4%b8%ad%e7%9a%84%e5%8d%87%e7%ba%a7%e5%8f%98%e5%8a%a8",[318,407],"UMG","211uQ_hHtqukg9a475OoGFpORkJgoSXNDZZUDjoLQh0",{"id":410,"title":411,"body":412,"date":505,"description":416,"extension":298,"meta":506,"navigation":302,"path":515,"seo":516,"stem":517,"tags":518,"__hash__":519},"blogs\u002F_legacy\u002F2014\u002F2014-10-05-ue4%e5%bc%82%e6%ad%a5%e8%bd%bd%e5%85%a5%e8%b5%84%e6%ba%90.md","UE4异步载入资源",{"type":8,"value":413,"toc":503},[414,417,420,428,431,434,437,447,450,455,458,463,466,472,475,481,484,487,493,500],[11,415,416],{},"所有的“硬”指针指向的资源都会被UE4在启动时进行载入，为了防止某些情况下引发的巨大延迟，必要的时候我们需要使用异步资源载入系统。",[11,418,419],{},"当前UE4版本为4.7。",[11,421,422,423,427],{},"本文参考：",[188,424,425],{"href":425,"rel":426,"title":425},"https:\u002F\u002Fdocs.unrealengine.com\u002Flatest\u002FINT\u002FProgramming\u002FAssets\u002FAsyncLoading\u002Findex.html",[192],"进行整理。同时也是研究引擎的记录。",[11,429,430],{},"对于异步载入有两个类很重要:FStringAssetReferences和TAssetPtr。",[11,432,433],{},"FStringAssetReferences是对资源(Asset)的“软”引用，这个结构在BP中使用起来就像是UObject指针一样。而TAssetPtr是对FStringAssetReferences的一个弱引用封装，同时规范所指向的类型，可以在需要的时候调用Get()来解析到具体的资源。",[11,435,436],{},"为了避免理解上的偏差，来实际测试一次是最快的。在代码中添加如下属性：",[438,439,444],"pre",{"className":440,"code":442,"language":443},[441],"language-text","UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = Test) \n    FStringAssetReference tf;\n\nUPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = Test) \n    TAssetPtr\u003CUTexture2D> ttp;\n","text",[445,446,442],"code",{"__ignoreMap":290},[11,448,449],{},"FstringAssetReference在可视化编辑器中显示如下，确实是可以当作UObject指针来使用：",[11,451,452],{},[210,453],{"alt":229,"src":454},"\u002Fwp-content\u002Fuploads\u002F2014\u002F10\u002Fimage_thumb.png",[11,456,457],{},"TAssetPtr则显示如下：",[11,459,460],{},[210,461],{"alt":229,"src":462},"\u002Fwp-content\u002Fuploads\u002F2014\u002F10\u002Fimage_thumb1.png",[11,464,465],{},"大多数时候，异步载入一个单独的资源基本没什么意义，除非他真的很大。如果要批量异步载入资源的话，就需要用到Object Libraries。这个是Content brower用来进行资源筛选和显示的类，在游戏逻辑中使用也是可以的。",[438,467,470],{"className":468,"code":469,"language":443},[441],"if (!ObjectLibrary)\n{\n       ObjectLibrary = UObjectLibrary::CreateLibrary(BaseClass, false, GIsEditor);\n       ObjectLibrary->AddToRoot();\n}\nObjectLibrary->LoadAssetDataFromPath(TEXT(\"\u002FGame\u002FPathWithAllObjectsOfSameType\");\nif (bFullyLoad)\n{\n       ObjectLibrary->LoadAssetsFromAssetData();\n}\n",[445,471,469],{"__ignoreMap":290},[11,473,474],{},"上面的代码对指定的目录创建了一个Library，并且资源进行了载入操作。第二个步骤并不是必须的：",[438,476,479],{"className":477,"code":478,"language":443},[441],"TArray\u003CFAssetData> AssetDatas;\nObjectLibrary->GetAssetDataList(AssetDatas);\n\nfor (int32 i = 0; i \u003C AssetDatas.Num(); ++i)\n{\n       FAssetData& AssetData = AssetDatas[i];\n\n       const FString* FoundTypeNameString = AssetData.TagsAndValues.Find(GET_MEMBER_NAME_CHECKED(UAssetObject,TypeName));\n\n       if (FoundTypeNameString && FoundTypeNameString->Contains(TEXT(\"FooType\")))\n       {\n              return AssetData;\n       }\n}\n",[445,480,478],{"__ignoreMap":290},[11,482,483],{},"上面的代码在ObjectLibrary中进行筛选并将找到的第一个资源返回。",[11,485,486],{},"得到AssetData之后可以将其转换为FStringAssetReference，然后使用StreamableManager进行异步载入。",[438,488,491],{"className":489,"code":490,"language":443},[441],"void UGameCheatManager::GrantItems()\n{\n       TArray\u003CFStringAssetReference> ItemsToStream;\n       FStreamableManager& Streamable = UGameGlobals::Get().StreamableManager;\n       for(int32 i = 0; i \u003C ItemList.Num(); ++i)\n       {\n              ItemsToStream.AddUnique(ItemList[i].ToStringReference());\n       }\n       Streamable.RequestAsyncLoad(ItemsToStream, FStreamableDelegate::CreateUObject(this, &UGameCheatManager::GrantItemsDeferred));\n}\n\nvoid UGameCheatManager::GrantItemsDeferred()\n{\n       for(int32 i = 0; i \u003C ItemList.Num(); ++i)\n       {\n              UGameItemData* ItemData = ItemList[i].Get();\n              if(ItemData)\n              {\n                     MyPC->GrantItem(ItemData);\n              }\n       }\n}\n",[445,492,490],{"__ignoreMap":290},[11,494,495,496,499],{},"StreamableManager可以对传递给他的StringReference所引用的资源全部进行载入操作。上面的例子中ItemList的定义为",[445,497,498],{},"TArray\u003C TAssetPtr\u003CUGameItem> >","。也就说针对一个弱引用的列表，获得所有的StringReference之后传递给StreamableManager进行一次性的异步载入。载入之后会调用回调函数以便及时进行处理。在回调函数之前，所有的引用都会被StreamableManager保留，防止其被垃圾回收。",[11,501,502],{},"如上，将StreamableManager和Object Libaries进行组合使用，即可实现异步的资源载入了。",{"title":290,"searchDepth":291,"depth":292,"links":504},[],"2014-10-05",{"layout":300,"status":301,"published":302,"author":507,"author_login":304,"author_email":305,"author_url":306,"wordpress_id":508,"wordpress_url":509,"date_gmt":510,"excerpt":511},{"display_name":304,"login":304,"email":305,"url":306},1052,"\u002F\u002F?p=1052","2014-10-05 09:27:08 +0000",{"type":8,"value":512},[513],[11,514,416],{},"\u002F2014-10-05-ue4异步载入资源",{"title":411,"description":416},"_legacy\u002F2014\u002F2014-10-05-ue4%e5%bc%82%e6%ad%a5%e8%bd%bd%e5%85%a5%e8%b5%84%e6%ba%90",[318],"bqp6nM7vv0ExVK_MBRUW0P-TNF0F9dbp-0DmCdQN_QE",{"id":521,"title":522,"body":523,"date":622,"description":527,"extension":298,"meta":623,"navigation":302,"path":632,"seo":633,"stem":634,"tags":635,"__hash__":636},"blogs\u002F_legacy\u002F2014\u002F2014-09-28-ue4%e5%ae%98%e6%96%b9ui%e5%ba%93umg%e7%ae%80%e5%8d%95%e8%8f%9c%e5%8d%95%e6%90%ad%e5%bb%ba.md","UE4官方UI库UMG简单菜单搭建",{"type":8,"value":524,"toc":620},[525,528,531,536,539,544,547,550,555,558,563,566,571,574,579,582,587,590,595,598,603,606,609,614,617],[11,526,527],{},"UMG在当前UE4版本中仍然是实验功能，不过已经能基本满足日常UI的制作需求了。于是参考官方教程对UMG的UI的制作进行了熟悉。",[11,529,530],{},"首先要做的是在引擎中打开UMG功能：",[11,532,533],{},[210,534],{"alt":229,"src":535},"\u002Fwp-content\u002Fuploads\u002F2014\u002F09\u002Fimage_thumb2.png",[11,537,538],{},"打开之后就能在新建菜单中看到UMG相关的项目了，如果看不到的话重启一下引擎就可以了",[11,540,541],{},[210,542],{"alt":229,"src":543},"\u002Fwp-content\u002Fuploads\u002F2014\u002F09\u002Fimage_thumb3.png",[11,545,546],{},"选择Wdiget  BluePrint就可以新建一个UMG的UI了。",[11,548,549],{},"在这里我们先新建一个Slate Blush以作背景用",[11,551,552],{},[210,553],{"alt":229,"src":554},"\u002Fwp-content\u002Fuploads\u002F2014\u002F09\u002Fimage_thumb4.png",[11,556,557],{},"Slate Brush内部很单纯，选择一张已经导入的图片即可。",[11,559,560],{},[210,561],{"alt":229,"src":562},"\u002Fwp-content\u002Fuploads\u002F2014\u002F09\u002Fimage_thumb5.png",[11,564,565],{},"创建完Brush之后到刚刚新建的Wdiget里面，删掉默认添加的元件。按照下面的元件顺序添加即可",[11,567,568],{},[210,569],{"alt":229,"src":570},"\u002Fwp-content\u002Fuploads\u002F2014\u002F09\u002Fimage_thumb6.png",[11,572,573],{},"背景图片的配置在Border的属性中",[11,575,576],{},[210,577],{"alt":229,"src":578},"\u002Fwp-content\u002Fuploads\u002F2014\u002F09\u002Fimage_thumb7.png",[11,580,581],{},"基本上使用起来和普通的UI编辑器没什么大的区别，也就是拖拖调调就可以了。事件的绑定在右边的属性栏里面都能够找到。",[11,583,584],{},[210,585],{"alt":229,"src":586},"\u002Fwp-content\u002Fuploads\u002F2014\u002F09\u002Fimage_thumb8.png",[11,588,589],{},"新建的事件处理函数名称是可以修改的。给Quit按钮绑定退出功能：",[11,591,592],{},[210,593],{"alt":229,"src":594},"\u002Fwp-content\u002Fuploads\u002F2014\u002F09\u002Fimage_thumb9.png",[11,596,597],{},"这样的话UMG菜单部分就完成了。接下来只要找一个合适的时机将菜单弹出即可，可以选择在level blueprint的beginplay弹出。这里选择在Hud里面弹出：",[11,599,600],{},[210,601],{"alt":229,"src":602},"\u002Fwp-content\u002Fuploads\u002F2014\u002F09\u002Fimage_thumb10.png",[11,604,605],{},"这里面有两个需要注意的地方。选中modal可以防止菜单后面的3d界面得到控制权，就是普通ui中的模态。show cursor可以让UI界面中显示鼠标指针，而不用到controller里面去关闭全局的鼠标隐藏。",[11,607,608],{},"完成之后的界面如下，为了直观将背景图片去掉了：",[11,610,611],{},[210,612],{"alt":229,"src":613},"\u002Fwp-content\u002Fuploads\u002F2014\u002F09\u002Fimage_thumb11.png",[11,615,616],{},"以上就是全部的步骤了，最后吐槽下UE的暂停游戏功能。在当前版本下，不使用C++进行处理的情况下，暂停游戏的那行文字提示是去不掉的。不过使用模态来处理的话，基本的应用情境中是不需要暂停游戏的。但是暂停菜单的话……",[11,618,619],{},"总体而言UMG的功能很容易上手，没有想象中的那么复杂。",{"title":290,"searchDepth":291,"depth":292,"links":621},[],"2014-09-28",{"layout":300,"status":301,"published":302,"author":624,"author_login":304,"author_email":305,"author_url":306,"wordpress_id":625,"wordpress_url":626,"date_gmt":627,"excerpt":628},{"display_name":304,"login":304,"email":305,"url":306},1043,"\u002F\u002F?p=1043","2014-09-28 12:55:58 +0000",{"type":8,"value":629},[630],[11,631,527],{},"\u002F2014-09-28-ue4官方ui库umg简单菜单搭建",{"title":522,"description":527},"_legacy\u002F2014\u002F2014-09-28-ue4%e5%ae%98%e6%96%b9ui%e5%ba%93umg%e7%ae%80%e5%8d%95%e8%8f%9c%e5%8d%95%e6%90%ad%e5%bb%ba",[318,407],"BQd5f503SbSHEZMn43WMjG44sJksfuBw9wt09EXA-ow",{"id":638,"title":639,"body":640,"date":622,"description":644,"extension":298,"meta":695,"navigation":302,"path":704,"seo":705,"stem":706,"tags":707,"__hash__":709},"blogs\u002F_legacy\u002F2014\u002F2014-09-28-ue4%e5%af%bc%e5%85%a5mmd%e7%9a%84%e5%8f%a6%e4%b8%80%e6%9d%a1%e8%b7%af%e5%be%84.md","UE4导入MMD的另一条路径",{"type":8,"value":641,"toc":693},[642,645,652,655,663,668,671,674,679,682],[11,643,644],{},"虽然上次最后搞定了MMD导入到UE4的问题，但是中途要使用到的工具实在是太多了。最后经过寻找，终于找到了一条更便捷的导入路径。",[11,646,647,648,194],{},"要使用到的工具只有一个：MMD4Mecanim。工具的官方网站在这里：",[188,649,650],{"href":650,"rel":651,"title":650},"http:\u002F\u002Fstereoarts.jp\u002F",[192],[11,653,654],{},"这个工具包本身是给Unity使用的，但是它在打包过程中的fbx文件可以正常的导入到UE4。",[11,656,657,658,662],{},"这篇文章中的部分内容已经过期，详情请参考",[188,659,661],{"href":660},"\u002F?p=1250","这篇文章","。\n下载工具并解压之后，其内部的pmx2fbx.exe可以拿来单独使用。",[11,664,665],{},[210,666],{"alt":229,"src":667},"\u002Fwp-content\u002Fuploads\u002F2014\u002F09\u002Fimage_thumb.png",[11,669,670],{},"使用过程相当简单，按照上面的参数说明。第一个参数是pmx文件路径，后面紧跟vmd动作的路径。转换成功后的fbx直接导入到UE4中即可。",[11,672,673],{},"导入之后可以直接使用，唯一的问题是贴图和材质会出现问题。可以选择在UE中对材质进行重新编辑或者在3dsmax之类的软件中进行修复之后再导入。",[11,675,676],{},[210,677],{"alt":229,"src":678},"\u002Fwp-content\u002Fuploads\u002F2014\u002F09\u002Fimage_thumb1.png",[11,680,681],{},"错误大体上就像上面显示的一样，只是单纯的材质问题。骨骼和动画的使用一切正常。",[683,684,685],"blockquote",{},[11,686,687,688,692],{},"工具的网盘备份：链接: ",[188,689,690],{"href":690,"rel":691},"http:\u002F\u002Fpan.baidu.com\u002Fs\u002F1sjsdkPf",[192]," 密码: vbd1",{"title":290,"searchDepth":291,"depth":292,"links":694},[],{"layout":300,"status":301,"published":302,"author":696,"author_login":304,"author_email":305,"author_url":306,"wordpress_id":697,"wordpress_url":698,"date_gmt":699,"excerpt":700},{"display_name":304,"login":304,"email":305,"url":306},1018,"\u002F\u002F?p=1018","2014-09-28 12:50:12 +0000",{"type":8,"value":701},[702],[11,703,644],{},"\u002F2014-09-28-ue4导入mmd的另一条路径",{"title":639,"description":644},"_legacy\u002F2014\u002F2014-09-28-ue4%e5%af%bc%e5%85%a5mmd%e7%9a%84%e5%8f%a6%e4%b8%80%e6%9d%a1%e8%b7%af%e5%be%84",[318,708],"MMD","mhmDKxLuvXIdq4Bn_cPnhmnineFpPwq_QJ5Yt3qs-io",222,1788763183977]