[{"data":1,"prerenderedAt":203},["ShallowReactive",2],{"\u002F2018-02-26-ue4-note-2018-01":3},{"id":4,"title":5,"body":6,"date":179,"description":12,"extension":180,"meta":181,"navigation":184,"path":196,"seo":197,"stem":198,"tags":199,"__hash__":202},"blogs\u002F_legacy\u002F2018\u002F2018-02-26-ue4-note-2018-01.md","UE4年初笔记汇总",{"type":7,"value":8,"toc":169},"minimark",[9,13,16,19,24,27,30,33,36,39,50,53,59,62,69,73,76,79,82,85,91,94,97,100,104,107,111,114,117,123,126,132,135,138,141,144,149,152,155,166],[10,11,12],"p",{},"18年转眼马上过去两个月了，却有种还什么都没有做的感觉呢。",[10,14,15],{},"这里是最近的一些记录内容，由于比较零碎细小，干脆就合在一起了。",[10,17,18],{},"使用的UE4版本为UE4.15。",[20,21,23],"h2",{"id":22},"widgetbind","WidgetBind",[10,25,26],{},"这个是一个Meta，在UMG的数据绑定时很有用。",[10,28,29],{},"虽然UMG的逻辑大部分可以在蓝图中完成，而且控件也有自己的UPROPERTY和UFUNCTION绑定机制。",[10,31,32],{},"但是在需要进行复杂的UI逻辑编写时还是会需要在代码中进行控制。",[10,34,35],{},"这个时候就会遇到需要对应的UMG控件的指针的问题，虽然可以通过事先定义的UPROPERTY指针然后再在蓝图中进行赋值等一些方法进行。但在使用上多少会有不便之处。",[10,37,38],{},"其实，UE4内部是有提供方便这种情况的Meta方便使用的：",[40,41,46],"pre",{"className":42,"code":44,"language":45},[43],"language-text","UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (BindWidget))\nUImage* ImgBinded;\n","text",[47,48,44],"code",{"__ignoreMap":49},"",[10,51,52],{},"只要这样定义了之后，再做继承了的蓝图中拉出目标控件然后命名为ImgBinded就可以了。同时也可以将控件指定为可选的，例如：",[40,54,57],{"className":55,"code":56,"language":45},[43],"UPROPERTY(meta=(BindWidget, OptionalWidget=true))\n",[47,58,56],{"__ignoreMap":49},[10,60,61],{},"如果不指定为可选又没有在蓝图中添加对应名称的控件的话，就会报错",[10,63,64],{},[65,66],"img",{"alt":67,"src":68},"image","\u002Fwp-content\u002Fuploads\u002F2018\u002F02\u002Fimage_thumb.png",[20,70,72],{"id":71},"console","Console",[10,74,75],{},"这个也是最近遇到的麻烦，当程序的业务逻辑越来越复杂，往往会多出很多功能上的限制，导致在测试时遇到麻烦。",[10,77,78],{},"每次都要额外的添加测试UI，将一些C++函数暴露到蓝图，最后测试功能就一片混乱了。此时就可以添加一些Console来方便在编辑器中调试，由于Shipping模式默认是没有Console的，也不用担心一不小心测试代码被放到终端用户手中的尴尬情况。",[10,80,81],{},"同时，将Console代码进行一定程度的管理，也可以方便将调试功能整合在一起，避免不必要的混乱。",[10,83,84],{},"UE4的Console系统非常的易于扩展，使用起来也没有什么副作用：",[40,86,89],{"className":87,"code":88,"language":45},[43],"void HandleDbNextMap()\n{\n    \u002F** \u003C一些调试功能 *\u002F;\n}\n\nstatic FAutoConsoleCommand CVarDbGoNext(\n    TEXT(\"db.map.jmp\"),\u002F** \u003CConsole的指令 *\u002F\n    TEXT(\"Jump to nextmap\\n\"),\u002F** \u003C显示的帮助信息 *\u002F\n    FConsoleCommandDelegate::CreateStatic(&HandleDbNextMap)\n);\n",[47,90,88],{"__ignoreMap":49},[10,92,93],{},"使用UE4提供的帮助类，能够非常快速的定义Console指令。ConsoleCommand的使用和通常的Delegate是一样的，添加上面的代码后。",[10,95,96],{},"就可以在Console中输入db.map.jmp来使用了。",[10,98,99],{},"对于需要输入参数的情况，其实FAutoConsoleCommand还有其他的变体是可以携带参数的，详情可以参考其定义。",[20,101,103],{"id":102},"media-frame-work","Media Frame Work",[10,105,106],{},"UE4默认使用WMF在Windows上进行视频播放的操作，但是在使用上还是会有些细节的部分。",[108,109,110],"h3",{"id":110},"二次播放杂音",[10,112,113],{},"这个Bug一般是自己使用C++进行播放控制时容易出现，使用蓝图进行播放时没有遇到这个问题。",[10,115,116],{},"问题在于，MediaPlayer的声音播放并不会自动的跟随MediaPlayer的停止、播放、重新开启操作被控制，虽然表面上声音的播放确实停止了，但是重新开始播放声音的话就会出现状态重置不明确的问题，因此需要自己对事件进行绑定会进行控制。",[40,118,121],{"className":119,"code":120,"language":45},[43],"void UStreamPlayer::HandleMediaPlayerMediaEvent(EMediaEvent Event)\n{\n    if ((AudioComponent == nullptr) \u002F*|| !CurrentSoundWave.IsValid()*\u002F)\n    {\n        return;\n    }\n\n    switch (Event)\n    {\n    case EMediaEvent::PlaybackEndReached:\n    case EMediaEvent::PlaybackSuspended:\n        AudioComponent->Stop();\n        break;\n    case EMediaEvent::PlaybackResumed:\n        AudioComponent->Play();\n        break;\n    }\n}\n",[47,122,120],{"__ignoreMap":49},[10,124,125],{},"然后找一个时机绑定到MediaPlayer上去就可以了",[40,127,130],{"className":128,"code":129,"language":45},[43],"m_pMediaPlayer->OnMediaEvent().AddUObject(this, &UStreamPlayer::HandleMediaPlayerMediaEvent);\n",[47,131,129],{"__ignoreMap":49},[10,133,134],{},"这个是在4.15上遇到的，记得之后的版本更新中MediaPlayer有过改动，不知是不是就没有这样的问题了。",[108,136,137],{"id":137},"打包后无法播放",[10,139,140],{},"首先要检查的是打包时对应的视频文件有没有被拷贝到发布目录中，由于UE4打包的时候只会对进行了链接注册的资源进行打包，所以如果视频文件没有被蓝图或者C++显式的引用的话，并不会被自动拷贝到发布目录中去。",[10,142,143],{},"所以需要在打包设置中进行设置，保证视频目录中的视频都被拷贝到了发行版中。",[10,145,146],{},[65,147],{"alt":67,"src":148},"\u002Fwp-content\u002Fuploads\u002F2018\u002F02\u002Fadditional-pack.jpg",[10,150,151],{},"当然，也可以手动将资源拷贝到对应的目录中去，不过这样不方便管理，容易忘记……",[10,153,154],{},"另外就是要检查系统本身的Wmf相关的设定了，最主要就是检查下WindowsMediaPlayer能否正常的播放视频，因为wmp和ue4一样都依赖wmf进行视频播放，所以容易排查问题。主要是有的Ghost的系统会有不必要的精简，导致wmf功能不正常。",[10,156,157,158,165],{},"如果你使用的是最新版本的引擎的话，也可以考虑社区提供的[",[159,160,164],"a",{"href":161,"rel":162},"https:\u002F\u002Fgithub.com\u002Fue4plugins\u002FVlcMedia",[163],"nofollow","VlcMedia","]的插件，经过测试4.18版本下工作很正常，不过由于这边使用的是4.15版本，就没有办法了呢。",[10,167,168],{},"同时Vlc还支持更多的播放格式和方式，例如Vlc是支持m3u8的，而wmf并不支持很多流播放的功能。",{"title":49,"searchDepth":170,"depth":171,"links":172},2,3,[173,174,175],{"id":22,"depth":170,"text":23},{"id":71,"depth":170,"text":72},{"id":102,"depth":170,"text":103,"children":176},[177,178],{"id":110,"depth":171,"text":110},{"id":137,"depth":171,"text":137},"2018-02-26","md",{"layout":182,"status":183,"published":184,"author":185,"author_login":187,"author_email":188,"wordpress_id":189,"wordpress_url":190,"date_gmt":191,"excerpt":192},"post","publish",true,{"display_name":186,"login":187,"email":188,"url":49},"风铃","flinkor","flinkor@foxmail.com",2264,"\u002F?p=2264","2018-02-25 16:00:00 +0000",{"type":7,"value":193},[194],[10,195,12],{},"\u002F2018-02-26-ue4-note-2018-01",{"title":5,"description":12},"_legacy\u002F2018\u002F2018-02-26-ue4-note-2018-01",[200,201],"UE4","UMG","MMR8srEpeInDZHJaVZNbZRX20WDch0GtTv8IohtGnOo",1788763179326]