[{"data":1,"prerenderedAt":3455},["ShallowReactive",2],{"blog-page-22":3,"blog-count":3454},[4,1569,1696,1912,2120],{"id":5,"title":6,"body":7,"date":1546,"description":13,"extension":1547,"meta":1548,"navigation":120,"path":1562,"seo":1563,"stem":1564,"tags":1565,"__hash__":1568},"blogs\u002F_legacy\u002F2015\u002F2015-08-01-ue4-package-logs-android.md","UE4游戏Package记录（Android）",{"type":8,"value":9,"toc":1540},"minimark",[10,14,17,21,32,35,45,53,56,59,62,65,68,71,74,77,80,83,1451,1454,1460,1463,1466,1469,1477,1480,1486,1489,1492,1503,1506,1509,1512,1515,1523,1530,1533,1536],[11,12,13],"p",{},"Android的打包比Windows下要稍微麻烦一些，因为使用的编译器不同导致的问题也就多了起来。",[11,15,16],{},"当前使用的UE4版本为4.10.1。",[18,19,20],"h2",{"id":20},"基本步骤",[11,22,23,24,31],{},"UE4打包Android的教程官方是有提供的，可以看",[25,26,30],"a",{"href":27,"rel":28},"https:\u002F\u002Fdocs.unrealengine.com\u002Flatest\u002FINT\u002FPlatforms\u002FAndroid\u002FGettingStarted\u002F",[29],"nofollow","这里","。",[11,33,34],{},"下面只是简单的做一下总结的感觉，首先需要进行的是相关环境的安装。android sdk、ndk以及很多其他的东西，直接使用引擎自带的安装器就可以一次性搞定了。安装器在引擎如下的目录中可以找到",[36,37,38],"blockquote",{},[11,39,40,44],{},[41,42,43],"span",{},"ENGINE INSTALL LOCATION","\\Engine\\Extras\\Android\\CodeWorksforAndroid-1R6u1-windows.exe",[11,46,47,48,52],{},"开发必备环境的设定可以看[",[25,49,30],{"href":50,"rel":51},"https:\u002F\u002Fdocs.unrealengine.com\u002Fen-us\u002FPlatforms\u002FAndroid\u002FReference",[29],"]。",[11,54,55],{},"根据网络情况的不同，安装时间可能会比较长。",[11,57,58],{},"安装好之后其实就可以进行Android打包了，如果之前进行过Windows打包的话，基本不需要额外的设置。",[18,60,61],{"id":61},"插件问题",[11,63,64],{},"Android打包过程中很容易遇到的问题是插件上的，例如，如果在项目中有使用FMod的话，就需要进行一些额外的工作。",[11,66,67],{},"首先我们需要的是排查工具，在Android的SDK中有提供可以用于错误排查的工具。路径位于sdk的tools目录中，使用monitor.bat即可。",[11,69,70],{},"为了使用方便，在LogCat中添加新的过滤器就可以方便的对UE4的输出记录进行排查了。",[11,72,73],{},"如果在项目中有使用FMod的话，游戏在Android上是无法直接打开的，查看输出记录可以看到。",[11,75,76],{},"FMod的库文件没有被正确的找到，其实这是由于没有正确的按照FMod官方的配置说明进行配置导致的。在FMod的文档中其实是有说明的，不过没有到打包这一步的时候也并不需要进行配置。",[11,78,79],{},"当前FMod的Android打包需要对UE4的打包设置进行修改才行，首先，我们需要去GitHub上下载源码版的引擎。",[11,81,82],{},"并对UEDeployAndroid.cs进行修改，在CopyPluginLibs函数的末尾，添加如下的代码：",[84,85,90],"pre",{"className":86,"code":87,"language":88,"meta":89,"style":89},"language-java shiki shiki-themes github-light-high-contrast github-dark monokai","Console.WriteLine(\"Plugin Deployment\");\n\nList\u003Cstring> PluginLibraryReferences = new List\u003Cstring>();\n\nforeach (PluginInfo Plugin in Plugins.ReadAvailablePlugins(UnrealBuildTool.GetUProjectFile()))\n\n{\n\n    string AndroidDirectory = Path.Combine(Plugin.Directory, \"Binaries\u002FAndroid\");\n\n    string DeployFile = Path.Combine(AndroidDirectory, \"deploy.txt\");\n\n    if (File.Exists(DeployFile))\n\n    {\n\n        Console.WriteLine(\"Using Plugin Deployment file '{0}'\", DeployFile);\n\n        string DestLibraryDirectory = Path.Combine(UE4BuildPath, \"libs\u002Farmeabi-v7a\");\n\n        string DestJarDirectory = Path.Combine(UE4BuildPath, \"libs\");\n\n        foreach (string Name in File.ReadAllLines(DeployFile))\n\n        {\n\n            Console.WriteLine(\"Have file entry '{0}'\", Name);\n\n            string PluginFileExt = Path.GetExtension(Name);\n\n            if (PluginFileExt == \".so\")\n\n            {\n\n                string SourceFile = Path.Combine(AndroidDirectory, Name);\n\n                string DestFile = Path.Combine(DestLibraryDirectory, Name);\n\n                Console.WriteLine(\"Copying plugin .so file '{0}' to '{1}'\", SourceFile, DestFile);\n\n                if (File.Exists(DestFile))\n\n                {\n\n                    File.Delete(DestFile);\n\n                }\n\n                File.Copy(SourceFile, DestFile);\n\n                \u002F\u002F Also remember it for GameActivity\n\n                PluginLibraryReferences.Add(Name);\n\n            }\n\n            else if (PluginFileExt == \".jar\")\n\n            {\n\n                string SourceFile = Path.Combine(AndroidDirectory, Name);\n\n                string DestFile = Path.Combine(DestJarDirectory, Name);\n\n                Console.WriteLine(\"Copying plugin .jar file '{0}' to '{1}'\", SourceFile, DestFile);\n\n                if (File.Exists(DestFile))\n\n                {\n\n                    File.Delete(DestFile);\n\n                }\n\n                File.Copy(SourceFile, DestFile);\n\n            }\n\n        }\n\n    }\n\n}\n\n\u002F\u002F Enter all .so references into GameActivity java file\n\nif (PluginLibraryReferences.Count != 0)\n\n{\n\n    Console.WriteLine(\"Adding Plugin Deployment library references\");\n\n    String GameActivityFileName = Path.Combine(UE4BuildPath, \"src\u002Fcom\u002Fepicgames\u002Fue4\u002FGameActivity.java\");\n\n    List\u003Cstring> ActivityContents = new List\u003Cstring>(File.ReadAllLines(GameActivityFileName));\n\n    int LoadLibraryIndex = -1;\n\n    for (int i = 1; i \u003C ActivityContents.Count; ++i)\n\n    {\n\n        if (ActivityContents\u003Ci>.Contains(\"System.loadLibrary\"))\n\n        {\n\n            LoadLibraryIndex = i;\n\n            break;\n\n        }\n\n    }\n\n    if (LoadLibraryIndex != -1)\n\n    {\n\n        \u002F\u002F Insert in reverse order\n\n        PluginLibraryReferences.Reverse();\n\n        foreach (string Reference in PluginLibraryReferences)\n\n        {\n\n            Console.WriteLine(\"Adding library reference {0} at line {1}\", Reference, LoadLibraryIndex);\n\n            string ShortName = Path.GetFileNameWithoutExtension(Reference);\n\n            if (ShortName.StartsWith(\"lib\")) \u002F\u002F Without the lib prefix\n\n            {\n\n                ShortName = ShortName.Substring(3);\n\n            }\n\n            ActivityContents.Insert(LoadLibraryIndex, String.Format(\"\\t\\tSystem.loadLibrary(\\\"{0}\\\");\", ShortName));\n\n        }\n\n    }\n\n    File.WriteAllLines(GameActivityFileName, ActivityContents.ToArray());\n\n}\n\n\u002F\u002F PLUGIN DEPLOYMENT END\n","java","",[91,92,93,115,122,160,165,195,200,206,211,234,239,259,264,279,284,290,295,311,316,336,341,360,365,385,390,396,401,417,422,438,443,461,466,472,477,492,497,512,517,533,538,551,556,562,567,579,584,590,595,607,612,619,624,635,640,646,651,669,674,679,684,697,702,716,721,735,740,751,756,761,766,775,780,785,790,799,804,809,814,820,825,831,836,842,847,853,858,876,881,886,891,906,911,933,938,971,976,996,1001,1034,1039,1044,1049,1081,1086,1091,1096,1107,1112,1120,1125,1130,1135,1140,1145,1161,1166,1171,1176,1182,1187,1199,1204,1217,1222,1227,1232,1247,1252,1268,1273,1295,1300,1305,1310,1331,1336,1341,1346,1387,1392,1397,1402,1407,1412,1430,1435,1440,1445],"code",{"__ignoreMap":89},[41,94,97,101,105,108,112],{"class":95,"line":96},"line",1,[41,98,100],{"class":99},"s0idv","Console.",[41,102,104],{"class":103},"scAT4","WriteLine",[41,106,107],{"class":99},"(",[41,109,111],{"class":110},"sZnmU","\"Plugin Deployment\"",[41,113,114],{"class":99},");\n",[41,116,118],{"class":95,"line":117},2,[41,119,121],{"emptyLinePlaceholder":120},true,"\n",[41,123,125,129,133,137,140,143,147,150,153,155,157],{"class":95,"line":124},3,[41,126,128],{"class":127},"ss1GH","List",[41,130,132],{"class":131},"suI3T","\u003C",[41,134,136],{"class":135},"sGZGq","string",[41,138,139],{"class":131},"> ",[41,141,142],{"class":99},"PluginLibraryReferences",[41,144,146],{"class":145},"sLXdl"," =",[41,148,149],{"class":145}," new",[41,151,152],{"class":127}," List",[41,154,132],{"class":99},[41,156,136],{"class":135},[41,158,159],{"class":99},">();\n",[41,161,163],{"class":95,"line":162},4,[41,164,121],{"emptyLinePlaceholder":120},[41,166,168,171,174,177,180,183,186,189,192],{"class":95,"line":167},5,[41,169,170],{"class":103},"foreach",[41,172,173],{"class":99}," (",[41,175,176],{"class":127},"PluginInfo",[41,178,179],{"class":127}," Plugin",[41,181,182],{"class":99}," in Plugins.",[41,184,185],{"class":103},"ReadAvailablePlugins",[41,187,188],{"class":99},"(UnrealBuildTool.",[41,190,191],{"class":103},"GetUProjectFile",[41,193,194],{"class":99},"()))\n",[41,196,198],{"class":95,"line":197},6,[41,199,121],{"emptyLinePlaceholder":120},[41,201,203],{"class":95,"line":202},7,[41,204,205],{"class":99},"{\n",[41,207,209],{"class":95,"line":208},8,[41,210,121],{"emptyLinePlaceholder":120},[41,212,214,217,220,223,226,229,232],{"class":95,"line":213},9,[41,215,216],{"class":99},"    string AndroidDirectory ",[41,218,219],{"class":145},"=",[41,221,222],{"class":99}," Path.",[41,224,225],{"class":103},"Combine",[41,227,228],{"class":99},"(Plugin.Directory, ",[41,230,231],{"class":110},"\"Binaries\u002FAndroid\"",[41,233,114],{"class":99},[41,235,237],{"class":95,"line":236},10,[41,238,121],{"emptyLinePlaceholder":120},[41,240,242,245,247,249,251,254,257],{"class":95,"line":241},11,[41,243,244],{"class":99},"    string DeployFile ",[41,246,219],{"class":145},[41,248,222],{"class":99},[41,250,225],{"class":103},[41,252,253],{"class":99},"(AndroidDirectory, ",[41,255,256],{"class":110},"\"deploy.txt\"",[41,258,114],{"class":99},[41,260,262],{"class":95,"line":261},12,[41,263,121],{"emptyLinePlaceholder":120},[41,265,267,270,273,276],{"class":95,"line":266},13,[41,268,269],{"class":145},"    if",[41,271,272],{"class":99}," (File.",[41,274,275],{"class":103},"Exists",[41,277,278],{"class":99},"(DeployFile))\n",[41,280,282],{"class":95,"line":281},14,[41,283,121],{"emptyLinePlaceholder":120},[41,285,287],{"class":95,"line":286},15,[41,288,289],{"class":99},"    {\n",[41,291,293],{"class":95,"line":292},16,[41,294,121],{"emptyLinePlaceholder":120},[41,296,298,301,303,305,308],{"class":95,"line":297},17,[41,299,300],{"class":99},"        Console.",[41,302,104],{"class":103},[41,304,107],{"class":99},[41,306,307],{"class":110},"\"Using Plugin Deployment file '{0}'\"",[41,309,310],{"class":99},", DeployFile);\n",[41,312,314],{"class":95,"line":313},18,[41,315,121],{"emptyLinePlaceholder":120},[41,317,319,322,324,326,328,331,334],{"class":95,"line":318},19,[41,320,321],{"class":99},"        string DestLibraryDirectory ",[41,323,219],{"class":145},[41,325,222],{"class":99},[41,327,225],{"class":103},[41,329,330],{"class":99},"(UE4BuildPath, ",[41,332,333],{"class":110},"\"libs\u002Farmeabi-v7a\"",[41,335,114],{"class":99},[41,337,339],{"class":95,"line":338},20,[41,340,121],{"emptyLinePlaceholder":120},[41,342,344,347,349,351,353,355,358],{"class":95,"line":343},21,[41,345,346],{"class":99},"        string DestJarDirectory ",[41,348,219],{"class":145},[41,350,222],{"class":99},[41,352,225],{"class":103},[41,354,330],{"class":99},[41,356,357],{"class":110},"\"libs\"",[41,359,114],{"class":99},[41,361,363],{"class":95,"line":362},22,[41,364,121],{"emptyLinePlaceholder":120},[41,366,368,371,374,377,380,383],{"class":95,"line":367},23,[41,369,370],{"class":103},"        foreach",[41,372,373],{"class":99}," (string ",[41,375,376],{"class":127},"Name",[41,378,379],{"class":99}," in File.",[41,381,382],{"class":103},"ReadAllLines",[41,384,278],{"class":99},[41,386,388],{"class":95,"line":387},24,[41,389,121],{"emptyLinePlaceholder":120},[41,391,393],{"class":95,"line":392},25,[41,394,395],{"class":99},"        {\n",[41,397,399],{"class":95,"line":398},26,[41,400,121],{"emptyLinePlaceholder":120},[41,402,404,407,409,411,414],{"class":95,"line":403},27,[41,405,406],{"class":99},"            Console.",[41,408,104],{"class":103},[41,410,107],{"class":99},[41,412,413],{"class":110},"\"Have file entry '{0}'\"",[41,415,416],{"class":99},", Name);\n",[41,418,420],{"class":95,"line":419},28,[41,421,121],{"emptyLinePlaceholder":120},[41,423,425,428,430,432,435],{"class":95,"line":424},29,[41,426,427],{"class":99},"            string PluginFileExt ",[41,429,219],{"class":145},[41,431,222],{"class":99},[41,433,434],{"class":103},"GetExtension",[41,436,437],{"class":99},"(Name);\n",[41,439,441],{"class":95,"line":440},30,[41,442,121],{"emptyLinePlaceholder":120},[41,444,446,449,452,455,458],{"class":95,"line":445},31,[41,447,448],{"class":145},"            if",[41,450,451],{"class":99}," (PluginFileExt ",[41,453,454],{"class":145},"==",[41,456,457],{"class":110}," \".so\"",[41,459,460],{"class":99},")\n",[41,462,464],{"class":95,"line":463},32,[41,465,121],{"emptyLinePlaceholder":120},[41,467,469],{"class":95,"line":468},33,[41,470,471],{"class":99},"            {\n",[41,473,475],{"class":95,"line":474},34,[41,476,121],{"emptyLinePlaceholder":120},[41,478,480,483,485,487,489],{"class":95,"line":479},35,[41,481,482],{"class":99},"                string SourceFile ",[41,484,219],{"class":145},[41,486,222],{"class":99},[41,488,225],{"class":103},[41,490,491],{"class":99},"(AndroidDirectory, Name);\n",[41,493,495],{"class":95,"line":494},36,[41,496,121],{"emptyLinePlaceholder":120},[41,498,500,503,505,507,509],{"class":95,"line":499},37,[41,501,502],{"class":99},"                string DestFile ",[41,504,219],{"class":145},[41,506,222],{"class":99},[41,508,225],{"class":103},[41,510,511],{"class":99},"(DestLibraryDirectory, Name);\n",[41,513,515],{"class":95,"line":514},38,[41,516,121],{"emptyLinePlaceholder":120},[41,518,520,523,525,527,530],{"class":95,"line":519},39,[41,521,522],{"class":99},"                Console.",[41,524,104],{"class":103},[41,526,107],{"class":99},[41,528,529],{"class":110},"\"Copying plugin .so file '{0}' to '{1}'\"",[41,531,532],{"class":99},", SourceFile, DestFile);\n",[41,534,536],{"class":95,"line":535},40,[41,537,121],{"emptyLinePlaceholder":120},[41,539,541,544,546,548],{"class":95,"line":540},41,[41,542,543],{"class":145},"                if",[41,545,272],{"class":99},[41,547,275],{"class":103},[41,549,550],{"class":99},"(DestFile))\n",[41,552,554],{"class":95,"line":553},42,[41,555,121],{"emptyLinePlaceholder":120},[41,557,559],{"class":95,"line":558},43,[41,560,561],{"class":99},"                {\n",[41,563,565],{"class":95,"line":564},44,[41,566,121],{"emptyLinePlaceholder":120},[41,568,570,573,576],{"class":95,"line":569},45,[41,571,572],{"class":99},"                    File.",[41,574,575],{"class":103},"Delete",[41,577,578],{"class":99},"(DestFile);\n",[41,580,582],{"class":95,"line":581},46,[41,583,121],{"emptyLinePlaceholder":120},[41,585,587],{"class":95,"line":586},47,[41,588,589],{"class":99},"                }\n",[41,591,593],{"class":95,"line":592},48,[41,594,121],{"emptyLinePlaceholder":120},[41,596,598,601,604],{"class":95,"line":597},49,[41,599,600],{"class":99},"                File.",[41,602,603],{"class":103},"Copy",[41,605,606],{"class":99},"(SourceFile, DestFile);\n",[41,608,610],{"class":95,"line":609},50,[41,611,121],{"emptyLinePlaceholder":120},[41,613,615],{"class":95,"line":614},51,[41,616,618],{"class":617},"sZdD5","                \u002F\u002F Also remember it for GameActivity\n",[41,620,622],{"class":95,"line":621},52,[41,623,121],{"emptyLinePlaceholder":120},[41,625,627,630,633],{"class":95,"line":626},53,[41,628,629],{"class":99},"                PluginLibraryReferences.",[41,631,632],{"class":103},"Add",[41,634,437],{"class":99},[41,636,638],{"class":95,"line":637},54,[41,639,121],{"emptyLinePlaceholder":120},[41,641,643],{"class":95,"line":642},55,[41,644,645],{"class":99},"            }\n",[41,647,649],{"class":95,"line":648},56,[41,650,121],{"emptyLinePlaceholder":120},[41,652,654,657,660,662,664,667],{"class":95,"line":653},57,[41,655,656],{"class":145},"            else",[41,658,659],{"class":145}," if",[41,661,451],{"class":99},[41,663,454],{"class":145},[41,665,666],{"class":110}," \".jar\"",[41,668,460],{"class":99},[41,670,672],{"class":95,"line":671},58,[41,673,121],{"emptyLinePlaceholder":120},[41,675,677],{"class":95,"line":676},59,[41,678,471],{"class":99},[41,680,682],{"class":95,"line":681},60,[41,683,121],{"emptyLinePlaceholder":120},[41,685,687,689,691,693,695],{"class":95,"line":686},61,[41,688,482],{"class":99},[41,690,219],{"class":145},[41,692,222],{"class":99},[41,694,225],{"class":103},[41,696,491],{"class":99},[41,698,700],{"class":95,"line":699},62,[41,701,121],{"emptyLinePlaceholder":120},[41,703,705,707,709,711,713],{"class":95,"line":704},63,[41,706,502],{"class":99},[41,708,219],{"class":145},[41,710,222],{"class":99},[41,712,225],{"class":103},[41,714,715],{"class":99},"(DestJarDirectory, Name);\n",[41,717,719],{"class":95,"line":718},64,[41,720,121],{"emptyLinePlaceholder":120},[41,722,724,726,728,730,733],{"class":95,"line":723},65,[41,725,522],{"class":99},[41,727,104],{"class":103},[41,729,107],{"class":99},[41,731,732],{"class":110},"\"Copying plugin .jar file '{0}' to '{1}'\"",[41,734,532],{"class":99},[41,736,738],{"class":95,"line":737},66,[41,739,121],{"emptyLinePlaceholder":120},[41,741,743,745,747,749],{"class":95,"line":742},67,[41,744,543],{"class":145},[41,746,272],{"class":99},[41,748,275],{"class":103},[41,750,550],{"class":99},[41,752,754],{"class":95,"line":753},68,[41,755,121],{"emptyLinePlaceholder":120},[41,757,759],{"class":95,"line":758},69,[41,760,561],{"class":99},[41,762,764],{"class":95,"line":763},70,[41,765,121],{"emptyLinePlaceholder":120},[41,767,769,771,773],{"class":95,"line":768},71,[41,770,572],{"class":99},[41,772,575],{"class":103},[41,774,578],{"class":99},[41,776,778],{"class":95,"line":777},72,[41,779,121],{"emptyLinePlaceholder":120},[41,781,783],{"class":95,"line":782},73,[41,784,589],{"class":99},[41,786,788],{"class":95,"line":787},74,[41,789,121],{"emptyLinePlaceholder":120},[41,791,793,795,797],{"class":95,"line":792},75,[41,794,600],{"class":99},[41,796,603],{"class":103},[41,798,606],{"class":99},[41,800,802],{"class":95,"line":801},76,[41,803,121],{"emptyLinePlaceholder":120},[41,805,807],{"class":95,"line":806},77,[41,808,645],{"class":99},[41,810,812],{"class":95,"line":811},78,[41,813,121],{"emptyLinePlaceholder":120},[41,815,817],{"class":95,"line":816},79,[41,818,819],{"class":99},"        }\n",[41,821,823],{"class":95,"line":822},80,[41,824,121],{"emptyLinePlaceholder":120},[41,826,828],{"class":95,"line":827},81,[41,829,830],{"class":99},"    }\n",[41,832,834],{"class":95,"line":833},82,[41,835,121],{"emptyLinePlaceholder":120},[41,837,839],{"class":95,"line":838},83,[41,840,841],{"class":99},"}\n",[41,843,845],{"class":95,"line":844},84,[41,846,121],{"emptyLinePlaceholder":120},[41,848,850],{"class":95,"line":849},85,[41,851,852],{"class":617},"\u002F\u002F Enter all .so references into GameActivity java file\n",[41,854,856],{"class":95,"line":855},86,[41,857,121],{"emptyLinePlaceholder":120},[41,859,861,864,867,870,874],{"class":95,"line":860},87,[41,862,863],{"class":145},"if",[41,865,866],{"class":99}," (PluginLibraryReferences.Count ",[41,868,869],{"class":145},"!=",[41,871,873],{"class":872},"stP0Q"," 0",[41,875,460],{"class":99},[41,877,879],{"class":95,"line":878},88,[41,880,121],{"emptyLinePlaceholder":120},[41,882,884],{"class":95,"line":883},89,[41,885,205],{"class":99},[41,887,889],{"class":95,"line":888},90,[41,890,121],{"emptyLinePlaceholder":120},[41,892,894,897,899,901,904],{"class":95,"line":893},91,[41,895,896],{"class":99},"    Console.",[41,898,104],{"class":103},[41,900,107],{"class":99},[41,902,903],{"class":110},"\"Adding Plugin Deployment library references\"",[41,905,114],{"class":99},[41,907,909],{"class":95,"line":908},92,[41,910,121],{"emptyLinePlaceholder":120},[41,912,914,917,920,922,924,926,928,931],{"class":95,"line":913},93,[41,915,916],{"class":127},"    String",[41,918,919],{"class":99}," GameActivityFileName",[41,921,146],{"class":145},[41,923,222],{"class":99},[41,925,225],{"class":103},[41,927,330],{"class":99},[41,929,930],{"class":110},"\"src\u002Fcom\u002Fepicgames\u002Fue4\u002FGameActivity.java\"",[41,932,114],{"class":99},[41,934,936],{"class":95,"line":935},94,[41,937,121],{"emptyLinePlaceholder":120},[41,939,941,944,946,948,950,953,955,957,959,961,963,966,968],{"class":95,"line":940},95,[41,942,943],{"class":127},"    List",[41,945,132],{"class":131},[41,947,136],{"class":135},[41,949,139],{"class":131},[41,951,952],{"class":99},"ActivityContents",[41,954,146],{"class":145},[41,956,149],{"class":145},[41,958,152],{"class":127},[41,960,132],{"class":99},[41,962,136],{"class":135},[41,964,965],{"class":99},">(File.",[41,967,382],{"class":103},[41,969,970],{"class":99},"(GameActivityFileName));\n",[41,972,974],{"class":95,"line":973},96,[41,975,121],{"emptyLinePlaceholder":120},[41,977,979,982,985,987,990,993],{"class":95,"line":978},97,[41,980,981],{"class":135},"    int",[41,983,984],{"class":99}," LoadLibraryIndex",[41,986,146],{"class":145},[41,988,989],{"class":145}," -",[41,991,992],{"class":872},"1",[41,994,995],{"class":99},";\n",[41,997,999],{"class":95,"line":998},98,[41,1000,121],{"emptyLinePlaceholder":120},[41,1002,1004,1007,1009,1012,1015,1017,1020,1023,1025,1028,1031],{"class":95,"line":1003},99,[41,1005,1006],{"class":145},"    for",[41,1008,173],{"class":99},[41,1010,1011],{"class":135},"int",[41,1013,1014],{"class":99}," i",[41,1016,146],{"class":145},[41,1018,1019],{"class":872}," 1",[41,1021,1022],{"class":99},"; i ",[41,1024,132],{"class":145},[41,1026,1027],{"class":99}," ActivityContents.Count; ",[41,1029,1030],{"class":145},"++",[41,1032,1033],{"class":99},"i)\n",[41,1035,1037],{"class":95,"line":1036},100,[41,1038,121],{"emptyLinePlaceholder":120},[41,1040,1042],{"class":95,"line":1041},101,[41,1043,289],{"class":99},[41,1045,1047],{"class":95,"line":1046},102,[41,1048,121],{"emptyLinePlaceholder":120},[41,1050,1052,1055,1057,1059,1061,1064,1067,1070,1073,1075,1078],{"class":95,"line":1051},103,[41,1053,1054],{"class":145},"        if",[41,1056,173],{"class":99},[41,1058,952],{"class":127},[41,1060,132],{"class":145},[41,1062,1063],{"class":99},"i",[41,1065,1066],{"class":145},">",[41,1068,1069],{"class":99},".",[41,1071,1072],{"class":103},"Contains",[41,1074,107],{"class":99},[41,1076,1077],{"class":110},"\"System.loadLibrary\"",[41,1079,1080],{"class":99},"))\n",[41,1082,1084],{"class":95,"line":1083},104,[41,1085,121],{"emptyLinePlaceholder":120},[41,1087,1089],{"class":95,"line":1088},105,[41,1090,395],{"class":99},[41,1092,1094],{"class":95,"line":1093},106,[41,1095,121],{"emptyLinePlaceholder":120},[41,1097,1099,1102,1104],{"class":95,"line":1098},107,[41,1100,1101],{"class":99},"            LoadLibraryIndex ",[41,1103,219],{"class":145},[41,1105,1106],{"class":99}," i;\n",[41,1108,1110],{"class":95,"line":1109},108,[41,1111,121],{"emptyLinePlaceholder":120},[41,1113,1115,1118],{"class":95,"line":1114},109,[41,1116,1117],{"class":145},"            break",[41,1119,995],{"class":99},[41,1121,1123],{"class":95,"line":1122},110,[41,1124,121],{"emptyLinePlaceholder":120},[41,1126,1128],{"class":95,"line":1127},111,[41,1129,819],{"class":99},[41,1131,1133],{"class":95,"line":1132},112,[41,1134,121],{"emptyLinePlaceholder":120},[41,1136,1138],{"class":95,"line":1137},113,[41,1139,830],{"class":99},[41,1141,1143],{"class":95,"line":1142},114,[41,1144,121],{"emptyLinePlaceholder":120},[41,1146,1148,1150,1153,1155,1157,1159],{"class":95,"line":1147},115,[41,1149,269],{"class":145},[41,1151,1152],{"class":99}," (LoadLibraryIndex ",[41,1154,869],{"class":145},[41,1156,989],{"class":145},[41,1158,992],{"class":872},[41,1160,460],{"class":99},[41,1162,1164],{"class":95,"line":1163},116,[41,1165,121],{"emptyLinePlaceholder":120},[41,1167,1169],{"class":95,"line":1168},117,[41,1170,289],{"class":99},[41,1172,1174],{"class":95,"line":1173},118,[41,1175,121],{"emptyLinePlaceholder":120},[41,1177,1179],{"class":95,"line":1178},119,[41,1180,1181],{"class":617},"        \u002F\u002F Insert in reverse order\n",[41,1183,1185],{"class":95,"line":1184},120,[41,1186,121],{"emptyLinePlaceholder":120},[41,1188,1190,1193,1196],{"class":95,"line":1189},121,[41,1191,1192],{"class":99},"        PluginLibraryReferences.",[41,1194,1195],{"class":103},"Reverse",[41,1197,1198],{"class":99},"();\n",[41,1200,1202],{"class":95,"line":1201},122,[41,1203,121],{"emptyLinePlaceholder":120},[41,1205,1207,1209,1211,1214],{"class":95,"line":1206},123,[41,1208,370],{"class":103},[41,1210,373],{"class":99},[41,1212,1213],{"class":127},"Reference",[41,1215,1216],{"class":99}," in PluginLibraryReferences)\n",[41,1218,1220],{"class":95,"line":1219},124,[41,1221,121],{"emptyLinePlaceholder":120},[41,1223,1225],{"class":95,"line":1224},125,[41,1226,395],{"class":99},[41,1228,1230],{"class":95,"line":1229},126,[41,1231,121],{"emptyLinePlaceholder":120},[41,1233,1235,1237,1239,1241,1244],{"class":95,"line":1234},127,[41,1236,406],{"class":99},[41,1238,104],{"class":103},[41,1240,107],{"class":99},[41,1242,1243],{"class":110},"\"Adding library reference {0} at line {1}\"",[41,1245,1246],{"class":99},", Reference, LoadLibraryIndex);\n",[41,1248,1250],{"class":95,"line":1249},128,[41,1251,121],{"emptyLinePlaceholder":120},[41,1253,1255,1258,1260,1262,1265],{"class":95,"line":1254},129,[41,1256,1257],{"class":99},"            string ShortName ",[41,1259,219],{"class":145},[41,1261,222],{"class":99},[41,1263,1264],{"class":103},"GetFileNameWithoutExtension",[41,1266,1267],{"class":99},"(Reference);\n",[41,1269,1271],{"class":95,"line":1270},130,[41,1272,121],{"emptyLinePlaceholder":120},[41,1274,1276,1278,1281,1284,1286,1289,1292],{"class":95,"line":1275},131,[41,1277,448],{"class":145},[41,1279,1280],{"class":99}," (ShortName.",[41,1282,1283],{"class":103},"StartsWith",[41,1285,107],{"class":99},[41,1287,1288],{"class":110},"\"lib\"",[41,1290,1291],{"class":99},")) ",[41,1293,1294],{"class":617},"\u002F\u002F Without the lib prefix\n",[41,1296,1298],{"class":95,"line":1297},132,[41,1299,121],{"emptyLinePlaceholder":120},[41,1301,1303],{"class":95,"line":1302},133,[41,1304,471],{"class":99},[41,1306,1308],{"class":95,"line":1307},134,[41,1309,121],{"emptyLinePlaceholder":120},[41,1311,1313,1316,1318,1321,1324,1326,1329],{"class":95,"line":1312},135,[41,1314,1315],{"class":99},"                ShortName ",[41,1317,219],{"class":145},[41,1319,1320],{"class":99}," ShortName.",[41,1322,1323],{"class":103},"Substring",[41,1325,107],{"class":99},[41,1327,1328],{"class":872},"3",[41,1330,114],{"class":99},[41,1332,1334],{"class":95,"line":1333},136,[41,1335,121],{"emptyLinePlaceholder":120},[41,1337,1339],{"class":95,"line":1338},137,[41,1340,645],{"class":99},[41,1342,1344],{"class":95,"line":1343},138,[41,1345,121],{"emptyLinePlaceholder":120},[41,1347,1349,1352,1355,1358,1361,1363,1366,1370,1373,1376,1379,1381,1384],{"class":95,"line":1348},139,[41,1350,1351],{"class":99},"            ActivityContents.",[41,1353,1354],{"class":103},"Insert",[41,1356,1357],{"class":99},"(LoadLibraryIndex, String.",[41,1359,1360],{"class":103},"Format",[41,1362,107],{"class":99},[41,1364,1365],{"class":110},"\"",[41,1367,1369],{"class":1368},"sAO_F","\\t\\t",[41,1371,1372],{"class":110},"System.loadLibrary(",[41,1374,1375],{"class":1368},"\\\"",[41,1377,1378],{"class":110},"{0}",[41,1380,1375],{"class":1368},[41,1382,1383],{"class":110},");\"",[41,1385,1386],{"class":99},", ShortName));\n",[41,1388,1390],{"class":95,"line":1389},140,[41,1391,121],{"emptyLinePlaceholder":120},[41,1393,1395],{"class":95,"line":1394},141,[41,1396,819],{"class":99},[41,1398,1400],{"class":95,"line":1399},142,[41,1401,121],{"emptyLinePlaceholder":120},[41,1403,1405],{"class":95,"line":1404},143,[41,1406,830],{"class":99},[41,1408,1410],{"class":95,"line":1409},144,[41,1411,121],{"emptyLinePlaceholder":120},[41,1413,1415,1418,1421,1424,1427],{"class":95,"line":1414},145,[41,1416,1417],{"class":99},"    File.",[41,1419,1420],{"class":103},"WriteAllLines",[41,1422,1423],{"class":99},"(GameActivityFileName, ActivityContents.",[41,1425,1426],{"class":103},"ToArray",[41,1428,1429],{"class":99},"());\n",[41,1431,1433],{"class":95,"line":1432},146,[41,1434,121],{"emptyLinePlaceholder":120},[41,1436,1438],{"class":95,"line":1437},147,[41,1439,841],{"class":99},[41,1441,1443],{"class":95,"line":1442},148,[41,1444,121],{"emptyLinePlaceholder":120},[41,1446,1448],{"class":95,"line":1447},149,[41,1449,1450],{"class":617},"\u002F\u002F PLUGIN DEPLOYMENT END\n",[11,1452,1453],{},"这样一来就可以正常的进行运行工作了，不过由于使用了源码版，有时候编译时间就会比较长了。所以建议在项目打包的时候再进行设置。",[11,1455,1456,1457,31],{},"FMod还有一些其他需要注意的打包事项，例如Bank文件目录等的设定，由于没有使用到那些功能所以没有进行尝试，详情可参照",[41,1458,1459],{},"FMod官方文档",[18,1461,1462],{"id":1462},"目录访问",[11,1464,1465],{},"当前UE4在Android下默认是没有提供访问整个设备的文件的接口的，但是如果是音乐游戏之类的游戏的话，就会需要用到这样的功能。",[11,1467,1468],{},"在AndroidFile.cpp中，我们可以看到，所有的函数都有提供AllowLocal的参数，但是FAndroidPlatformFile在进行IPhysicalPlatformFile的接口实现时使用的却全部是默认的False。AllowLocal参数最终是传递给PathToAndroidPaths这个函数的，因此，直接在该函数中添加",[84,1470,1475],{"className":1471,"code":1473,"language":1474},[1472],"language-text","AllowLocal = true;\n","text",[91,1476,1473],{"__ignoreMap":89},[11,1478,1479],{},"强制打开本地路径访问即可。同时，这个文件中有开放两个在调试文件访问时比较实用的宏，有需要的时候可以打开",[84,1481,1484],{"className":1482,"code":1483,"language":1474},[1472],"#define LOG_ANDROID_FILE 1\n#define LOG_ANDROID_FILE_MANIFEST 1\n",[91,1485,1483],{"__ignoreMap":89},[11,1487,1488],{},"另外需要注意的是，FPaths提供的一些函数在Android下并不能很好的运行，经常返回不符合预期的结果。",[11,1490,1491],{},"目前观测到的有",[36,1493,1494,1497,1500],{},[11,1495,1496],{},"FPaths::ConvertRelativePathToFull需要使用IAndroidPlatformFile::GetPlatformPhysical().FileRootPath进行代替",[11,1498,1499],{},"FPaths::GetPath会对根目录返回空字符串",[11,1501,1502],{},"FPaths::IsDrive会对所有的一级目录返回True",[11,1504,1505],{},"使用的时候需要千万注意。",[18,1507,1508],{"id":1508},"功能限制",[11,1510,1511],{},"UE4在移动模式下是有很多功能限制的，如果游戏是面向移动平台的话，最好在添加新功能的时候使用移动平台模拟进行测试，否则到最后就可能真的积重难返了。",[11,1513,1514],{},"目前遇到的限制有：",[36,1516,1517,1520],{},[11,1518,1519],{},"APEX的破碎物体无法作用",[11,1521,1522],{},"部分粒子特效无法显示",[11,1524,1525,1526,31],{},"UE4对移动设备的兼容性也是需要在事先进行调查的，官方的说明在",[25,1527,30],{"href":1528,"rel":1529},"https:\u002F\u002Fdocs.unrealengine.com\u002Flatest\u002FINT\u002FPlatforms\u002FAndroid\u002FDeviceCompatibility\u002Findex.html",[29],[11,1531,1532],{},"引擎自带的示例项目在没有安装第三方插件的情况下，是可以直接通过的，用来测试环境的配置是否正确非常方便。",[11,1534,1535],{},"总体而言UE4的移动端表现还是非常不错的。",[1537,1538,1539],"style",{},"html pre.shiki code .s0idv, html code.shiki .s0idv{--shiki-default:#0E1116;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .scAT4, html code.shiki .scAT4{--shiki-default:#622CBC;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sZnmU, html code.shiki .sZnmU{--shiki-default:#032563;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .ss1GH, html code.shiki .ss1GH{--shiki-default:#0E1116;--shiki-default-font-style:inherit;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .suI3T, html code.shiki .suI3T{--shiki-default:#702C00;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sGZGq, html code.shiki .sGZGq{--shiki-default:#A0111F;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sLXdl, html code.shiki .sLXdl{--shiki-default:#A0111F;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sZdD5, html code.shiki .sZdD5{--shiki-default:#66707B;--shiki-dark:#6A737D;--shiki-sepia:#88846F}html pre.shiki code .stP0Q, html code.shiki .stP0Q{--shiki-default:#023B95;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sAO_F, html code.shiki .sAO_F{--shiki-default:#A0111F;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":89,"searchDepth":117,"depth":124,"links":1541},[1542,1543,1544,1545],{"id":20,"depth":117,"text":20},{"id":61,"depth":117,"text":61},{"id":1462,"depth":117,"text":1462},{"id":1508,"depth":117,"text":1508},"2015-08-01","md",{"layout":1549,"status":1550,"published":120,"author":1551,"author_login":1552,"author_email":1553,"author_url":1554,"wordpress_id":1555,"wordpress_url":1556,"date_gmt":1557,"excerpt":1558},"post","publish",{"display_name":1552,"login":1552,"email":1553,"url":1554},"chaoshikari","chaoshikari@gmail.com","\u002F",1463,"\u002F\u002F?p=1463","2015-08-01 11:27:14 +0000",{"type":8,"value":1559},[1560],[11,1561,13],{},"\u002F2015-08-01-ue4-package-logs-android",{"title":6,"description":13},"_legacy\u002F2015\u002F2015-08-01-ue4-package-logs-android",[1566,1567],"UE4","Package","LA841B_nk48EEoA1Vn8rmA1yi-rgmXfVCpbsWXUiUis",{"id":1570,"title":1571,"body":1572,"date":1546,"description":1576,"extension":1547,"meta":1682,"navigation":120,"path":1691,"seo":1692,"stem":1693,"tags":1694,"__hash__":1695},"blogs\u002F_legacy\u002F2015\u002F2015-08-01-ue4-package-logs-windows.md","UE4游戏Package记录（Windows）",{"type":8,"value":1573,"toc":1676},[1574,1577,1579,1582,1585,1588,1594,1597,1600,1603,1606,1609,1612,1615,1642,1645,1648,1651,1654,1657,1662,1665,1668,1673],[11,1575,1576],{},"最近对UE4的Package功能进行了使用，整体而言打包功能比想象中复杂一些，限于设备原因只做了Windows和Android的打包。",[11,1578,16],{},[11,1580,1581],{},"面向Windows的打包相对简单，基本只要直接使用即可。",[18,1583,1584],{"id":1584},"视频设定",[11,1586,1587],{},"主要的问题之一是，当前无法在引擎中对游戏的目标分辨率进行设置，在某些情况下会导致打包的效果和PIE的效果相差很大。不过引擎在C++中有提供接口来进行相关的控制，一般在GameMode的BeginPlay中直接调用就可以设置成功了。",[84,1589,1592],{"className":1590,"code":1591,"language":1474},[1472],"do{\n\n    if(GEngine == nullptr) break;\n\n    UGameUserSettings* Settings = GEngine->GameUserSettings;\n\n    if (Settings == nullptr) break;\n\n    int32 Width = 1920, Height = 1080;\n\n    Settings->RequestResolutionChange(Width, Height, EWindowMode::Type::Windowed, false);\n\n    Settings->ConfirmVideoMode();\n\n    \u002F\u002FSettings->RevertVideoMode(); \u002F\u002F 本操作可以取消分辨率更改\n\n    Settings->SetScreenResolution(Settings->GetLastConfirmedScreenResolution());\n\n    Settings->SetFullscreenMode(Settings->GetLastConfirmedFullscreenMode());\n\n    Settings->SaveSettings();\n\n     Settings->ScalabilityQuality.AntiAliasingQuality = 3;     \u002F\u002F Epic\n\n     Settings->ScalabilityQuality.ResolutionQuality = 3;     \u002F\u002F Epic\n\n    Settings->ApplyNonResolutionSettings();\n\n    Settings->SaveSettings();\n\n}while(false);\n",[91,1593,1591],{"__ignoreMap":89},[11,1595,1596],{},"上面的ScalabilityQuality是可以在编辑器中进行设定的，对应关系如下",[11,1598,1599],{},"另外名为Screen Percentage的属性是在PostProcess的属性中进行设置的。以及，如果要修改抗锯齿的方式，也需要在PostProcess中进行。",[18,1601,1602],{"id":1602},"运行黑屏",[11,1604,1605],{},"打包之后运行直接黑屏的话可能是由很多原因引起的，不过如果是在打包测试的过程中直接使用新项目，或者之前没有进行过设置变更的话，还是可能遇到。原因是没有对默认地图进行设置，主要表现是，完全的黑屏，但是调试输出却可以显示在屏幕上。",[11,1607,1608],{},"在【项目设置>>项目>>地图&模式】中进行修改即可。",[18,1610,1611],{"id":1611},"莫名的链接错误",[11,1613,1614],{},"这个错误的出现几率比较低，而且链接错误有很大的可能性是其他原因引起的，所以排查起来很麻烦。如果之前都是正常的却突然出现类似这样的情况：",[36,1616,1617,1624,1627,1630,1633,1636,1639],{},[11,1618,1619,1620,1623],{},"MainFrameActions: 打包 (Windows (64位)): UnrealBuildTool: ",[41,1621,1622],{},"1\u002F1"," Link Test_mp.exe",[11,1625,1626],{},"MainFrameActions: 打包 (Windows (64位)): UnrealBuildTool:      ڴ      F:\\Unreal\\Test_mp 4.10\\Binaries\\Win64\\Test_mp.lib  Ͷ    F:\\Unreal\\Test_mp 4.10\\Binaries\\Win64\\Test_mp.exp",[11,1628,1629],{},"MainFrameActions: 打包 (Windows (64位)): UnrealBuildTool: UELinkerFixups.cpp.obj : error LNK2019:  ޷        ⲿ     \"void __cdecl EmptyLinkFunctionForGeneratedCodeOnlineSubsystemSteam(void)\" (?EmptyLinkFunctionForGeneratedCodeOnlineSubsystemSteam@@YAXXZ)   ÷    ں    \"void __cdecl UELinkerFixups(void)\" (?UELinkerFixups@@YAXXZ)  б",[11,1631,1632],{},"MainFrameActions: 打包 (Windows (64位)): UnrealBuildTool: UELinkerFixups.cpp.obj : error LNK2019:  ޷        ⲿ     \"void __cdecl EmptyLinkFunctionForStaticInitializationUE4Game(void)\" (?EmptyLinkFunctionForStaticInitializationUE4Game@@YAXXZ)   ÷    ں    \"void __cdecl UELinkerFixups(void)\" (?UELinkerFixups@@YAXXZ)  б",[11,1634,1635],{},"MainFrameActions: 打包 (Windows (64位)): UnrealBuildTool: UELinkerFixups.cpp.obj : error LNK2019:  ޷        ⲿ     \"void __cdecl EmptyLinkFunctionForStaticInitializationOnlineSubsystemNull(void)\" (?EmptyLinkFunctionForStaticInitializationOnlineSubsystemNull@@YAXXZ)   ÷    ں    \"void __cdecl UELinkerFixups(void)\" (?UELinkerFixups@@YAXXZ)  б",[11,1637,1638],{},"MainFrameActions: 打包 (Windows (64位)): UnrealBuildTool: UELinkerFixups.cpp.obj : error LNK2019:  ޷        ⲿ     \"void __cdecl EmptyLinkFunctionForStaticInitializationOnlineSubsystemSteam(void)\" (?EmptyLinkFunctionForStaticInitializationOnlineSubsystemSteam@@YAXXZ)   ÷    ں    \"void __cdecl UELinkerFixups(void)\" (?UELinkerFixups@@YAXXZ)  б",[11,1640,1641],{},"MainFrameActions: 打包 (Windows (64位)): UnrealBuildTool: F:\\Unreal\\Test_mp 4.10\\Binaries\\Win64\\Test_mp.exe : fatal error LNK1120: 4    ޷        ⲿ",[11,1643,1644],{},"可以尝试在打包设定中勾选Full Rebuild",[11,1646,1647],{},"不过需要注意的是，如果使用的是源码版的引擎的话，会消耗大量的时间。",[18,1649,1650],{"id":1650},"杂项记录",[11,1652,1653],{},"打包的过程中还遇到了一些其他的错误，这里姑且记录一下。",[11,1655,1656],{},"在打包完成之后运行游戏始终出现这样的错误：",[36,1658,1659],{},[11,1660,1661],{},"Windows 无法访问指定设备、路径或文件。您可能没有合适的权限访问这个项目。",[11,1663,1664],{},"最后解决办法是把安全软件给关掉，有的安全软件会在没有任何提示的情况下将文件给隔离\u002F删除掉。",[11,1666,1667],{},"还有一个错误是在Ship打包的时候，运行游戏出现错误：",[36,1669,1670],{},[11,1671,1672],{},"Failed to open descriptor file ‘..\u002F..\u002F..\u002FBlank-Win64-Shipping\u002FBlank-Win64-Shipping.uproject’",[11,1674,1675],{},"这个似乎是打包功能的Bug引起的，又或者就是这样的设定。总之将对应的文件名进行修改就可以了，修改运行文件本身的文件名也是可以的。",{"title":89,"searchDepth":117,"depth":124,"links":1677},[1678,1679,1680,1681],{"id":1584,"depth":117,"text":1584},{"id":1602,"depth":117,"text":1602},{"id":1611,"depth":117,"text":1611},{"id":1650,"depth":117,"text":1650},{"layout":1549,"status":1550,"published":120,"author":1683,"author_login":1552,"author_email":1553,"author_url":1554,"wordpress_id":1684,"wordpress_url":1685,"date_gmt":1686,"excerpt":1687},{"display_name":1552,"login":1552,"email":1553,"url":1554},1469,"\u002F\u002F?p=1469","2015-08-01 11:45:05 +0000",{"type":8,"value":1688},[1689],[11,1690,1576],{},"\u002F2015-08-01-ue4-package-logs-windows",{"title":1571,"description":1576},"_legacy\u002F2015\u002F2015-08-01-ue4-package-logs-windows",[1566,1567],"LXryStv443cfAY5PNs0jvzqSL3ss1urTELS9PdUjGKg",{"id":1697,"title":1698,"body":1699,"date":1895,"description":1703,"extension":1547,"meta":1896,"navigation":120,"path":1905,"seo":1906,"stem":1907,"tags":1908,"__hash__":1911},"blogs\u002F_legacy\u002F2015\u002F2015-07-07-ue4-projectile-visual-effects.md","UE4子弹特效",{"type":8,"value":1700,"toc":1885},[1701,1704,1707,1715,1718,1721,1724,1728,1744,1755,1779,1782,1785,1788,1794,1797,1805,1808,1813,1816,1819,1826,1831,1838,1844,1853,1861,1864,1867,1870,1873,1876,1879,1882],[11,1702,1703],{},"子弹使用抛体就可以实现了，但是要让其看起来更加真实，则可能需要加上一些粒子特效。",[11,1705,1706],{},"当前UE4版本4.8.1。",[11,1708,1709,1710,1714],{},"子弹的特效制作主要使用粒子系统进行实现，只有用于着弹效果的地方使用的是Decal Material。官方的这篇教程对于了解如何去制作一个粒子系统很有作用。原始教程地址：",[25,1711,1712],{"href":1712,"rel":1713,"title":1712},"https:\u002F\u002Fwiki.unrealengine.com\u002FProjectile_Visual_Effects",[29],"（教程中有提供相关文件的下载）。",[11,1716,1717],{},"特效的制作基础是UE4自带的第一人称模板，不需要初学者内容。也可以直接下载文档末尾处的工程文件进行观赏，工程文件不到10M，相当的方便。",[18,1719,1720],{"id":1720},"着弹特效",[11,1722,1723],{},"制作特效之前，先实际参考一下现实世界中的效果比较好。为了模拟出好的特效，观察整个过程中能量的变化非常的重要。因此，教程中对子弹的着弹效果进行观察后。将特效分为了闪光、烟雾、破片三个子特效。",[1725,1726,1727],"h3",{"id":1727},"闪光",[11,1729,1730,1731,1735,1736,1739,1740,1743],{},"闪光特效使用T_Hit.tga贴图来制作材质。材质类型修改为",[1732,1733,1734],"strong",{},"Translucency","，同时，为了保证闪光特效始终显示在表层，将",[1732,1737,1738],{},"Disable Depth Test","设置为",[1732,1741,1742],{},"True","。闪光特效中示例工程中额外的添加了Near Camera Fade和Depth Fade，这样的话在子弹有射入角度时就不会依然显示一个光晕了，更加自然一些。",[11,1745,1746,1751,1752],{},[1747,1748],"img",{"alt":1749,"src":1750},"image","\u002Fwp-content\u002Fuploads\u002F2015\u002F07\u002Fimage_thumb14.png"," ",[1747,1753],{"alt":1749,"src":1754},"\u002Fwp-content\u002Fuploads\u002F2015\u002F07\u002Fimage_thumb15.png",[11,1756,1757,1758,1761,1762,1766,1767,1770,1771,1774,1775,1778],{},"新建一个粒子系统，并在",[1732,1759,1760],{},"Required","模块中将默认发射器的材质修改为刚刚建立的材质。为了方便以后辨识，可以将发射器的名称修改为HIT。按照",[25,1763,1765],{"href":1764},"\u002F2015-07-06-ue4-particle-official-tutorial-summary\u002F","之前的教程","中的建议，删除",[1732,1768,1769],{},"Color Over Life","模块，替换为",[1732,1772,1773],{},"Initial Color","与",[1732,1776,1777],{},"Scale Color\u002FLife","模块。在模块的属性上，主要使用粒子生命周期和初始大小进行随机化来增强特效的随机性。",[1725,1780,1781],{"id":1781},"烟雾",[11,1783,1784],{},"第一步依然是构建材质，烟雾的材质相对复杂一些。在示例的截图中，有添加Near Camera Fade特性，但是在示例工程中该材质并没有添加。使用到的贴图分别是T_Smoke与T_S_Normal。",[11,1786,1787],{},"烟雾特效中，额外的使用Initial Rotation和Initial Rotation Rate来作随机化。同时添加Sphere模块对初始位置以及速度应用随机。",[11,1789,1790,1791,1793],{},"烟雾特效中，由于材质中使用了MacroUV，需要对MacroUV进行修改。点击编辑器的空白处，在粒子系统的属性中进行设置。如果不同的发射器使用的是不同的设置，也可以在",[1732,1792,1760],{},"模块对MacroUV属性进行修改。",[1725,1795,1796],{"id":1796},"破片",[11,1798,1799,1800,1804],{},"破片效果主要使用",[25,1801,1803],{"href":1802},"\u002F2015-07-01-ue4-particles-subuv-module\u002F","SubUV模块","进行实现。需要添加Acceleration模块进行重力模拟，Collision模块进行碰撞模拟。",[11,1806,1807],{},"这一部分示例工程中的材质和教程中的截图相差比较大，Near Camera Fade和Depth Fade被取消，同时用一种近似的方法生成了法线。",[11,1809,1810],{},[1747,1811],{"alt":1749,"src":1812},"\u002Fwp-content\u002Fuploads\u002F2015\u002F07\u002Fimage_thumb16.png",[11,1814,1815],{},"由于碎片较小，很难观察出有什么不同……",[18,1817,1818],{"id":1818},"拖曳",[11,1820,1821,1822,1825],{},"拖拽特效同样通过粒子进行实现。使用的是",[1732,1823,1824],{},"Ribbon","类型的发射器。拖拽部分使用的材质教程中没有对Panner的速度进行说明，实际情况如下：",[11,1827,1828],{},[1747,1829],{"alt":1749,"src":1830},"\u002Fwp-content\u002Fuploads\u002F2015\u002F07\u002Fimage_thumb17.png",[11,1832,1833,1834,1837],{},"这一部分在操作是需要注意的是，必须删除",[1732,1835,1836],{},"Initial Velocity","模块。由于教程中没有明言，会导致结果与预期的不同。",[11,1839,1840,1841,1843],{},"还有一个示例工程的不同之处在",[1732,1842,1760],{},"模块中：",[11,1845,1846,1739,1849,1852],{},[1732,1847,1848],{},"Screen AlignMent",[1732,1850,1851],{},"Facing Camera Position","；",[11,1854,1855,1739,1858,31],{},[1732,1856,1857],{},"Sort Mode",[1732,1859,1860],{},"Distance to View",[18,1862,1863],{"id":1863},"弹痕与子弹",[11,1865,1866],{},"弹痕的特效使用Decal Materia进行实现。",[11,1868,1869],{},"材质中使用快速方法生成了测试用的替代法线贴图。",[11,1871,1872],{},"子弹的材质没有什么特别的地方，并不是教程的重点。如果是使用球体而不是子弹的话，可以跳过子弹的材质。",[18,1874,1875],{"id":1875},"蓝图",[11,1877,1878],{},"实际的对上面生成的特效进行使用测试。",[11,1880,1881],{},"在组件中添加Ribbon的粒子系统，修改抛体的速度和重力设置，同时勾选平面移动限制。在碰撞点生成粒子系统和Decal Materia。",[11,1883,1884],{},"开始调试，就能看到相当不错的子弹特效了。",{"title":89,"searchDepth":117,"depth":124,"links":1886},[1887,1892,1893,1894],{"id":1720,"depth":117,"text":1720,"children":1888},[1889,1890,1891],{"id":1727,"depth":124,"text":1727},{"id":1781,"depth":124,"text":1781},{"id":1796,"depth":124,"text":1796},{"id":1818,"depth":117,"text":1818},{"id":1863,"depth":117,"text":1863},{"id":1875,"depth":117,"text":1875},"2015-07-07",{"layout":1549,"status":1550,"published":120,"author":1897,"author_login":1552,"author_email":1553,"author_url":1554,"wordpress_id":1898,"wordpress_url":1899,"date_gmt":1900,"excerpt":1901},{"display_name":1552,"login":1552,"email":1553,"url":1554},1397,"\u002F\u002F?p=1397","2015-07-07 09:54:58 +0000",{"type":8,"value":1902},[1903],[11,1904,1703],{},"\u002F2015-07-07-ue4-projectile-visual-effects",{"title":1698,"description":1703},"_legacy\u002F2015\u002F2015-07-07-ue4-projectile-visual-effects",[1566,1909,1910],"粒子","Decal Materia","FT9OoEznMygJjKnaEZBv9Uujm4xFmKdhSdoDaUoOG5Y",{"id":1913,"title":1914,"body":1915,"date":2104,"description":1919,"extension":1547,"meta":2105,"navigation":120,"path":2114,"seo":2115,"stem":2116,"tags":2117,"__hash__":2119},"blogs\u002F_legacy\u002F2015\u002F2015-07-06-ue4-particle-official-tutorial-summary.md","UE4粒子系统官方教程总结",{"type":8,"value":1916,"toc":2089},[1917,1920,1923,1926,1933,1936,1939,1942,1945,1948,1951,1954,1958,1961,1964,1968,1971,1974,1977,1981,1984,1987,1991,1994,1997,2000,2003,2006,2009,2012,2016,2019,2022,2029,2034,2037,2041,2044,2047,2065,2068,2071,2074,2077,2080,2083,2086],[11,1918,1919],{},"Epic官方提供的粒子特效教程涵盖的范围比较广，操作上也是由浅入深，对于帮助了解粒子系统很有作用。",[11,1921,1922],{},"当前UE4版本：4.8.1。",[11,1924,1925],{},"粒子系统这一块，虽然之前将文档大概读了一遍，但是有些概念依然比较抽象，故而按照官方教程操作了一遍。",[11,1927,1928,1929,31],{},"原始教程地址：",[25,1930,1931],{"href":1931,"rel":1932,"title":1931},"https:\u002F\u002Fwiki.unrealengine.com\u002FVisual_Effects:_Lesson_01:_Material_Particle_Color",[29],[18,1934,1935],{"id":1935},"基础材质",[11,1937,1938],{},"粒子系统除了在Mesh Data Type被指定时使用的是Mesh之外，在一般情况下都会使用材质作为发射器的基本粒子。",[1725,1940,1941],{"id":1941},"材质构建",[11,1943,1944],{},"教程中使用的材质是Blend Mode为Translucent而Lighting Model为Unlit的，通常情况下粒子上的光照效果并不明显，使用Unlit可以有效的降低系统负担。",[11,1946,1947],{},"教程中使用的十字图片一时找不到原图，因而直接使用默认粒子系统的那张贴图作为制作基础。",[11,1949,1950],{},"基础材质的制作较为简单，基本就是将材质的颜色和alpha通道分别连接到自发光颜色和不透明度上。材质制作完成后，在发射器的Required模块将材质替换为刚刚建立的材质即可。",[11,1952,1953],{},"材质中使用的Particle Color参数可以使用Color Over Life进行控制，操作相对简单，没有什么特别需要注意的地方。",[1725,1955,1957],{"id":1956},"depth-fade","Depth Fade",[11,1959,1960],{},"使得粒子在与其他物体交集时边界不是那么的尖锐，而是在有交错时减少粒子的透明度。",[11,1962,1963],{},"功能实现很简单，在材质的不透明读输入之前连接上Depth Fade节点即可。",[1725,1965,1967],{"id":1966},"near-camera-fade","Near Camera Fade",[11,1969,1970],{},"粒子在摄像机靠近时逐渐变得透明进而消失，在游戏中比较经常用到。这一类的效果基本使用这种方法进行实现。",[11,1972,1973],{},"在材质中使用节点PixelDepth配合Sphere Mask。Shpere Mask用于计算距离并生成遮罩，圆心处为1，Distance处为0，根据Hardness生成过渡效果。因而，要连接到不透明度效果上的话要先进行一减操作。",[11,1975,1976],{},"将生成的不透明度与原有的不透明度相乘即可实现Near Camera Fade的效果。教程中Sphere Mask的参数为Radius:75，Hardness:10。",[1725,1978,1980],{"id":1979},"materia-function","Materia Function",[11,1982,1983],{},"材质函数用于将经常用到的材质特效独立出来，便于操作、管理和统一修改，也被用于Layered Materia的制作之中。是材质系统中比较重要的一个功能。",[11,1985,1986],{},"在这里实现的是对Near Camera Fade的材质函数化，因为大部分场景中的粒子都有可能会需要这个功能。可以通过增进Function Input节点来为函数提供参数输入引脚，在函数属性中选中Expose to Library就可以在材质视图的上下文菜单中直接找到这个函数了。如果选择不暴露的话，每次都必须将这个函数拖到材质中去。",[1725,1988,1990],{"id":1989},"dynamic-parameter","Dynamic Parameter",[11,1992,1993],{},"材质中的Dynamic Parameter节点允许粒子对材质进行动态的参数输入，需要注意的是当使用GPU粒子时，这个传入是无效的。",[11,1995,1996],{},"要给材质传入参数，需要使用Parameter->Dynamic模块进行相关操作。在对动态参数的名称进行修改之后，对Dynamic模块进行刷新就可以看到参数名称的更新。",[11,1998,1999],{},"对于一次性设定的参数，要在Dynamic模块中为参数设置Spawn Time Only，这样就只在粒子生成时进行参数生成和设置。",[1725,2001,2002],{"id":2002},"颜色控制",[11,2004,2005],{},"教程中建议删除默认的Color Over Life模块，改为使用Initial Color和Scale Color\u002FLife两个模块进行组合配置。",[11,2007,2008],{},"主要的好处在于，可以解除生成时颜色和生命周期颜色之间的关联。方便进行控制。",[11,2010,2011],{},"总体上操作没有什么太大的不同，其实如果没有对粒子颜色进行控制的话，可以不用进行这个操作。",[18,2013,2015],{"id":2014},"gpu-particle","GPU Particle",[11,2017,2018],{},"GPU粒子的效率比CPU粒子高，虽然有一些地方的功能有所限制，但按照官方建议，在大多数情况下都应该使用GPU粒子。",[11,2020,2021],{},"GPU粒子在生成粒子时依然使用CPU进行，以便对粒子进行更好的控制。因此，在GPU粒子制作时，应该将CPU生成粒子的消耗考虑在内。否则极有可能成为系统的瓶颈。教程建议单次粒子爆发不要超过15k个，在通过爆发生成大量粒子时，其间隔应该在0.05~0.1以上。同时在有大量粒子生成的情况下，最好使用LOD来尽可能的降低整体的系统消耗。",[11,2023,2024,2025,2028],{},"当粒子系统中的粒子数量超过某个点之后，其对整体视觉效果的贡献并不明显。因此在粒子系统制作中应该对参数进行调整，将粒子个数控制在平衡点附近。可以通过将显示模式调整为",[1732,2026,2027],{},"着色器复杂度","来观察粒子个数是否过多。",[11,2030,2031],{},[1747,2032],{"alt":1749,"src":2033},"\u002Fwp-content\u002Fuploads\u002F2015\u002F07\u002Fimage_thumb13.png",[11,2035,2036],{},"在这个模式中，显示为白色的区域代表其成本极高。应该对其进行调整。",[1725,2038,2040],{"id":2039},"vector-field","Vector Field",[11,2042,2043],{},"矢量场用于控制粒子的流向，效果上就像是场景中有风带动粒子移动一样。矢量场可以通过模块进行旋转和缩放，能够实现非常独特和真实的效果。",[11,2045,2046],{},"Vector Field模块只有在类型为GPU Sprites时才有效。矢量场分为Local Vector Field和Global Vector Field两种，分别作用在粒子系统的本地空间和实际场景中。",[11,2048,2049,2050,2055,2059,2060],{},"矢量场的制作已经完全进入了美工的领域，不再进行研究。官方的制作教程在这里：[",[25,2051,2054],{"href":2052,"rel":2053},"https:\u002F\u002Fwiki.unrealengine.com\u002FCreating_Vector_Fields_(Tutorial)%5D(",[29],"https:\u002F\u002Fwiki.unrealengine.com\u002FCreating_Vector_Fields_(Tutorial)](",[25,2056,2057],{"href":2057,"rel":2058},"https:\u002F\u002Fwiki.unrealengine.com\u002FCreating_Vector_Fields_(Tutorial",[29]," \"",[25,2061,2064],{"href":2062,"rel":2063},"https:\u002F\u002Fwiki.unrealengine.com\u002FCreating_Vector_Fields_(Tutorial)%22)%E3%80%82",[29],"https:\u002F\u002Fwiki.unrealengine.com\u002FCreating_Vector_Fields_(Tutorial)\")。",[1725,2066,2067],{"id":2067},"动态参数",[11,2069,2070],{},"GPU粒子不能进行动态参数传值，Dynamic模块将会失效。为了让粒子对参数进行一定程度的控制，教程中介绍了一个变通的方法。",[11,2072,2073],{},"那就是使用依然有效的Particle Color进行数值传递，虽然这样会导致无法对粒子的颜色进行控制，但是在没有办法进行粒子传递时还是需要这样一个替代方案的。",[1725,2075,2076],{"id":2076},"粒子碰撞",[11,2078,2079],{},"Collision(Scene Depth)模块用于为粒子添加碰撞功能，这个模块当前只在GPU粒子下有效。同时，这个功能必须使用Translucent的材质作为粒子的时候才会起作用。",[11,2081,2082],{},"可调节参数包括反弹系数、摩擦力、反应模式等。",[2084,2085],"hr",{},[11,2087,2088],{},"UE4的粒子功能很强大，提供很多用于修改的模块。感觉上作为程序的话，只要了解大概有什么功能，能够实现简单的粒子特效即可。实在有需要制作复杂的粒子时，可以参考别人做好的进行修改。",{"title":89,"searchDepth":117,"depth":124,"links":2090},[2091,2099],{"id":1935,"depth":117,"text":1935,"children":2092},[2093,2094,2095,2096,2097,2098],{"id":1941,"depth":124,"text":1941},{"id":1956,"depth":124,"text":1957},{"id":1966,"depth":124,"text":1967},{"id":1979,"depth":124,"text":1980},{"id":1989,"depth":124,"text":1990},{"id":2002,"depth":124,"text":2002},{"id":2014,"depth":117,"text":2015,"children":2100},[2101,2102,2103],{"id":2039,"depth":124,"text":2040},{"id":2067,"depth":124,"text":2067},{"id":2076,"depth":124,"text":2076},"2015-07-06",{"layout":1549,"status":1550,"published":120,"author":2106,"author_login":1552,"author_email":1553,"author_url":1554,"wordpress_id":2107,"wordpress_url":2108,"date_gmt":2109,"excerpt":2110},{"display_name":1552,"login":1552,"email":1553,"url":1554},1379,"\u002F\u002F?p=1379","2015-07-06 07:37:27 +0000",{"type":8,"value":2111},[2112],[11,2113,1919],{},"\u002F2015-07-06-ue4-particle-official-tutorial-summary",{"title":1914,"description":1919},"_legacy\u002F2015\u002F2015-07-06-ue4-particle-official-tutorial-summary",[1566,1909,2118,2040],"GPU Sprites","Q8Z_TjX1uDswg-jlR7mTVtwgWkNFLo7cfHdi4HeKs-o",{"id":2121,"title":2122,"body":2123,"date":3439,"description":2127,"extension":1547,"meta":3440,"navigation":120,"path":3449,"seo":3450,"stem":3451,"tags":3452,"__hash__":3453},"blogs\u002F_legacy\u002F2015\u002F2015-07-04-ue4-beamtype-particle-module.md","UE4粒子光束类发射器及应用",{"type":8,"value":2124,"toc":3424},[2125,2128,2130,2133,2137,2140,2146,2151,2154,2159,2162,2167,2170,2175,2178,2183,2186,2191,2194,2199,2202,2207,2210,2215,2218,2259,2264,2269,2272,2277,2281,2284,2289,2294,2297,2333,2338,2341,2346,2349,2354,2359,2362,2367,2370,2375,2378,2383,2386,2391,2394,2398,2401,2406,2410,2413,2418,2423,2426,2431,2435,2438,2443,2446,2482,2487,2491,2494,2499,2504,2507,2537,2542,2545,2550,2554,2557,2562,2565,2595,2599,2601,2605,2608,2613,2618,2621,2626,2629,2634,2637,2642,2645,2650,2653,2658,2661,2666,2669,2674,2677,2682,2685,2690,2693,2698,2701,2706,2709,2714,2717,2722,2725,2730,2733,2738,2741,2746,2749,2754,2757,2762,2765,2769,2771,2775,2778,2782,2787,2790,2842,2847,2850,2855,2858,2862,2865,2870,2873,2878,2881,2923,2928,2931,2936,2939,2944,2947,2952,2955,2959,2961,2965,2968,2972,2977,2980,3023,3028,3031,3036,3039,3043,3046,3051,3054,3059,3062,3100,3105,3108,3113,3116,3121,3124,3129,3131,3136,3139,3142,3145,3154,3157,3160,3170,3173,3178,3181,3184,3187,3192,3195,3311,3314,3319,3322,3325,3328,3410,3413,3418,3421],[11,2126,2127],{},"光束类粒子广泛应用于激光、闪电等有传输路径的效果的模拟。 光束类发射器将粒子由源点到目标点之间相互连接并形成一个流。",[11,2129,1922],{},[11,2131,2132],{},"光束粒子的使用首先要将类型模块改为Beam Data Type，然后根据需要添加模块和修改属性。",[18,2134,2136],{"id":2135},"beam-data-type","Beam Data Type",[11,2138,2139],{},"光束粒子类型模块，添加了这个模块之后发射器将会变成光束型。",[11,2141,2142],{},[2143,2144,2145],"em",{},"Beam",[11,2147,2148],{},[1732,2149,2150],{},"Beam Method",[11,2152,2153],{},"光束方法。有三种。Distance为沿着X轴方向的光束，Target为两点之间的光束，Branch暂时没有功能。",[11,2155,2156],{},[1732,2157,2158],{},"Texture Tile",[11,2160,2161],{},"调整粒子材质的平铺数，只对第一套UV有效。当Texture Tile Distance被启用时会被其设置覆盖。",[11,2163,2164],{},[1732,2165,2166],{},"Texutre Tile Distance",[11,2168,2169],{},"每一个粒子材质平铺的宽度，为0时关闭设置。",[11,2171,2172],{},[1732,2173,2174],{},"Sheets",[11,2176,2177],{},"沿着光束所渲染的面片的数量。",[11,2179,2180],{},[1732,2181,2182],{},"Max Beam Count",[11,2184,2185],{},"光束的数量上限。",[11,2187,2188],{},[1732,2189,2190],{},"Speed",[11,2192,2193],{},"光束的速度，为0时则直接跳转。",[11,2195,2196],{},[1732,2197,2198],{},"Interpolation Points",[11,2200,2201],{},"当这个设置大于0时，将会在源点和目标点之间进行插值，可以增强噪波的特效。",[11,2203,2204],{},[1732,2205,2206],{},"Always On",[11,2208,2209],{},"当打开这个开关时，发射器将会保证始终有粒子是存活的。",[11,2211,2212],{},[1732,2213,2214],{},"Up Vector Step Size",[11,2216,2217],{},"决定光束的Up向量的方法",[2219,2220,2221,2232],"table",{},[2222,2223,2224],"thead",{},[2225,2226,2227,2230],"tr",{},[2228,2229],"th",{},[2228,2231],{},[2233,2234,2235,2244,2251],"tbody",{},[2225,2236,2237,2241],{},[2238,2239,2240],"td",{},"0",[2238,2242,2243],{},"在光束的每一个点进行计算",[2225,2245,2246,2248],{},[2238,2247,992],{},[2238,2249,2250],{},"在光束的开始点计算并应用到所有点",[2225,2252,2253,2256],{},[2238,2254,2255],{},"N",[2238,2257,2258],{},"插值N个点并计算（当前未实现）",[11,2260,2261],{},[2143,2262,2263],{},"Branching",[11,2265,2266],{},[1732,2267,2268],{},"Branch Parent Name",[11,2270,2271],{},"分支的父发射点名称，必须在同一个粒子系统内。Beam Method为Branch才可用，当前无效。",[11,2273,2274],{},[2143,2275,2276],{},"Distance",[11,2278,2279],{},[1732,2280,2276],{},[11,2282,2283],{},"光束的传播距离，Beam Method为Distance时有效。",[11,2285,2286],{},[2143,2287,2288],{},"Taper",[11,2290,2291],{},[1732,2292,2293],{},"Taper Method",[11,2295,2296],{},"光束随着长度变少的方式。",[2219,2298,2299,2307],{},[2222,2300,2301],{},[2225,2302,2303,2305],{},[2228,2304],{},[2228,2306],{},[2233,2308,2309,2317,2325],{},[2225,2310,2311,2314],{},[2238,2312,2313],{},"None",[2238,2315,2316],{},"光束不会变少",[2225,2318,2319,2322],{},[2238,2320,2321],{},"Full",[2238,2323,2324],{},"从源到目标点之间变少，无视长度，相对计算。",[2225,2326,2327,2330],{},[2238,2328,2329],{},"Partial",[2238,2331,2332],{},"从源到位置之间变少，源为0，位置点为1",[11,2334,2335],{},[1732,2336,2337],{},"Taper Factor",[11,2339,2340],{},"光束变少因子。当使用曲线编辑器时，时间轴0.0代表光束的源头，时间轴1.0代表目标点处。",[11,2342,2343],{},[1732,2344,2345],{},"Taper Scale",[11,2347,2348],{},"光束变少缩放。缩放为Taper Factor与Taper Scale的乘积。",[11,2350,2351],{},[2143,2352,2353],{},"Rendering",[11,2355,2356],{},[1732,2357,2358],{},"Render Geometry",[11,2360,2361],{},"是否渲染光束的几何体。",[11,2363,2364],{},[1732,2365,2366],{},"Render Direct Line",[11,2368,2369],{},"调试用。在源点和目标点之间绘制一条线。",[11,2371,2372],{},[1732,2373,2374],{},"Render Lines",[11,2376,2377],{},"调试用。沿着光束渲染生成线。",[11,2379,2380],{},[1732,2381,2382],{},"Render Tessellation",[11,2384,2385],{},"调试用。绘制源和目标之间的细分路径。",[11,2387,2388],{},[2143,2389,2390],{},"Cascade",[11,2392,2393],{},"通用编辑器属性",[18,2395,2397],{"id":2396},"beam-modules","Beam Modules",[11,2399,2400],{},"当前光束发射器共有4种模块可添加并用于配置光束发射器表现：",[11,2402,2403],{},[1747,2404],{"alt":1749,"src":2405},"\u002Fwp-content\u002Fuploads\u002F2015\u002F07\u002Fimage_thumb7.png",[1725,2407,2409],{"id":2408},"beam-modifier","Beam Modifier",[11,2411,2412],{},"光束修改器。用于修改光束的源点或目标点的属性。",[11,2414,2415],{},[2143,2416,2417],{},"Modifier",[11,2419,2420],{},[1732,2421,2422],{},"Modifier Type",[11,2424,2425],{},"设定修改器的修改目标。Source为源点，Target为目标点。",[11,2427,2428],{},[2143,2429,2430],{},"Position",[11,2432,2433],{},[1732,2434,2430],{},[11,2436,2437],{},"修改位置值，可锁定坐标。",[11,2439,2440],{},[1732,2441,2442],{},"Position Options",[11,2444,2445],{},"与Position属性关联的选项",[2219,2447,2448,2456],{},[2222,2449,2450],{},[2225,2451,2452,2454],{},[2228,2453],{},[2228,2455],{},[2233,2457,2458,2466,2474],{},[2225,2459,2460,2463],{},[2238,2461,2462],{},"Modify",[2238,2464,2465],{},"选中才应用修改",[2225,2467,2468,2471],{},[2238,2469,2470],{},"Scale",[2238,2472,2473],{},"选中后会将当前的设置缩放到指定的长度，而不是使用修改后的长度进行计算",[2225,2475,2476,2479],{},[2238,2477,2478],{},"Lock",[2238,2480,2481],{},"选中是粒子生命周期中该数值将被锁定",[11,2483,2484],{},[2143,2485,2486],{},"Tangent",[11,2488,2489],{},[1732,2490,2486],{},[11,2492,2493],{},"修改切线，可锁定坐标。通过切线来决定运算基础线的弧度。",[11,2495,2496],{},[1747,2497],{"alt":1749,"src":2498},"\u002Fwp-content\u002Fuploads\u002F2015\u002F07\u002Fimage_thumb8.png",[11,2500,2501],{},[1732,2502,2503],{},"Tangent Options",[11,2505,2506],{},"与Tangent属性关联的选项",[2219,2508,2509,2517],{},[2222,2510,2511],{},[2225,2512,2513,2515],{},[2228,2514],{},[2228,2516],{},[2233,2518,2519,2525,2531],{},[2225,2520,2521,2523],{},[2238,2522,2462],{},[2238,2524,2465],{},[2225,2526,2527,2529],{},[2238,2528,2470],{},[2238,2530,2473],{},[2225,2532,2533,2535],{},[2238,2534,2478],{},[2238,2536,2481],{},[11,2538,2539],{},[1732,2540,2541],{},"Absolute Tangent",[11,2543,2544],{},"在世界空间中使用绝对切线。",[11,2546,2547],{},[2143,2548,2549],{},"Strength",[11,2551,2552],{},[1732,2553,2549],{},[11,2555,2556],{},"修改强度。添加之后会使得光束有一个动态的移动效果，类似于给点加上受力。对开启了Tangent修改的光束影响极大。",[11,2558,2559],{},[1732,2560,2561],{},"Strength Options",[11,2563,2564],{},"与Strength属性关联的选项",[2219,2566,2567,2575],{},[2222,2568,2569],{},[2225,2570,2571,2573],{},[2228,2572],{},[2228,2574],{},[2233,2576,2577,2583,2589],{},[2225,2578,2579,2581],{},[2238,2580,2462],{},[2238,2582,2465],{},[2225,2584,2585,2587],{},[2238,2586,2470],{},[2238,2588,2473],{},[2225,2590,2591,2593],{},[2238,2592,2478],{},[2238,2594,2481],{},[11,2596,2597],{},[2143,2598,2390],{},[11,2600,2393],{},[1725,2602,2604],{"id":2603},"noise","Noise",[11,2606,2607],{},"在光束上加上噪波影响的模块。",[11,2609,2610],{},[2143,2611,2612],{},"Low Freq",[11,2614,2615],{},[1732,2616,2617],{},"Low Freq Enabled",[11,2619,2620],{},"是否打开低频噪波",[11,2622,2623],{},[1732,2624,2625],{},"Frequency",[11,2627,2628],{},"噪波的频率",[11,2630,2631],{},[1732,2632,2633],{},"Frequency Low Range",[11,2635,2636],{},"噪波频率下界，当非0有效。",[11,2638,2639],{},[1732,2640,2641],{},"Noise Range",[11,2643,2644],{},"噪波范围。用于计算噪点的分布，使用曲线时，0为第一点，而1为目标点。通常为Uniform形式，以提供一个随机的范围。",[11,2646,2647],{},[1732,2648,2649],{},"Noise Range Scale",[11,2651,2652],{},"噪波范围缩放。",[11,2654,2655],{},[1732,2656,2657],{},"NRScale Emitter Time",[11,2659,2660],{},"当打开时噪波范围缩放将会使用发射器时间，否则使用粒子时间。",[11,2662,2663],{},[1732,2664,2665],{},"Noise Speed",[11,2667,2668],{},"噪波速度，噪点的移动速度。只有Smooth打开时才有效。",[11,2670,2671],{},[1732,2672,2673],{},"Smooth",[11,2675,2676],{},"打开时会在噪点发生之后会进行平滑的移动。",[11,2678,2679],{},[1732,2680,2681],{},"Noise Lock Radius",[11,2683,2684],{},"噪波锁定半径。防止生成的噪点过于接近。",[11,2686,2687],{},[1732,2688,2689],{},"Oscillate",[11,2691,2692],{},"噪波摆动。如果开启，则噪点在发射线两端摆动。",[11,2694,2695],{},[1732,2696,2697],{},"Noise Lock Time",[11,2699,2700],{},"噪波锁定时间。亦即噪点生成之后停留多久进行下一次噪点生成。",[11,2702,2703],{},[1732,2704,2705],{},"Noise Tension",[11,2707,2708],{},"噪波张力。随着这个设置的增强，噪点之间的细分点将会受到更大的张力影响。轨迹会变得更尖锐。",[11,2710,2711],{},[1732,2712,2713],{},"Use Noise Tangent",[11,2715,2716],{},"使用噪波切线。如果开启则会计算每一个噪点的切线。",[11,2718,2719],{},[1732,2720,2721],{},"Noise Tangent Strenth",[11,2723,2724],{},"噪波切线强度。这个值越大，将会使得沿着光束的插值点受到切线方向的影响越大。当这个值为0时，Noise Tension几乎不会对轨迹造成影响。",[11,2726,2727],{},[1732,2728,2729],{},"Noise Tessellagtion",[11,2731,2732],{},"在噪点之间插值细分的数量。使得噪波之后的线条轨迹变得平滑。",[11,2734,2735],{},[1732,2736,2737],{},"Target Noise",[11,2739,2740],{},"打开时将会应用噪波到目标点。光束的终点将在设置的目标点附近进行随机。",[11,2742,2743],{},[1732,2744,2745],{},"Frequency Distance",[11,2747,2748],{},"噪点距离。为0时使用Frequency Low Range~Frequency来决定噪点的频率。不为零时则根据Frequency的值与这个值来共同决定分布，作用在于减少较短的光束上的噪点数，同时保证长光束上的噪点。",[11,2750,2751],{},[1732,2752,2753],{},"Apply Noise Scale",[11,2755,2756],{},"噪波缩放开关。",[11,2758,2759],{},[1732,2760,2761],{},"Noise Scale",[11,2763,2764],{},"噪波缩放因子。决定噪点远离发射线的波幅比例，在Noise Range的基础产生影响，为0则无可见的噪波效果。",[11,2766,2767],{},[2143,2768,2390],{},[11,2770,2393],{},[1725,2772,2774],{"id":2773},"source","Source",[11,2776,2777],{},"源点，当未指定这个模块时发射器位置将会作为源点。",[11,2779,2780],{},[2143,2781,2774],{},[11,2783,2784],{},[1732,2785,2786],{},"Source Method",[11,2788,2789],{},"源点方式。",[2219,2791,2792,2800],{},[2222,2793,2794],{},[2225,2795,2796,2798],{},[2228,2797],{},[2228,2799],{},[2233,2801,2802,2810,2818,2826,2834],{},[2225,2803,2804,2807],{},[2238,2805,2806],{},"Default",[2238,2808,2809],{},"使用Source的设定值",[2225,2811,2812,2815],{},[2238,2813,2814],{},"UserSet",[2238,2816,2817],{},"用户指定，常用于武器",[2225,2819,2820,2823],{},[2238,2821,2822],{},"Emitter",[2238,2824,2825],{},"使用发射器位置",[2225,2827,2828,2831],{},[2238,2829,2830],{},"Particle",[2238,2832,2833],{},"使用其他发射器的粒子",[2225,2835,2836,2839],{},[2238,2837,2838],{},"Actor",[2238,2840,2841],{},"使用Actor对象位置",[11,2843,2844],{},[1732,2845,2846],{},"Source Name",[11,2848,2849],{},"源名称。在Source Method为Particle和Acotr时有效，如果没有对应，则会使用Source的设定值。",[11,2851,2852],{},[1732,2853,2854],{},"Source Absolute",[11,2856,2857],{},"使用源点绝对位置，亦即不进行变换。",[11,2859,2860],{},[1732,2861,2774],{},[11,2863,2864],{},"源点位置。当Source Method为Default时有效。采用其他设定却无效时也会使用这个值。",[11,2866,2867],{},[1732,2868,2869],{},"Lock Source",[11,2871,2872],{},"在粒子生命周期中锁定源点。",[11,2874,2875],{},[1732,2876,2877],{},"Source Tangent Method",[11,2879,2880],{},"源切线方法。",[2219,2882,2883,2891],{},[2222,2884,2885],{},[2225,2886,2887,2889],{},[2228,2888],{},[2228,2890],{},[2233,2892,2893,2901,2908,2916],{},[2225,2894,2895,2898],{},[2238,2896,2897],{},"Direct",[2238,2899,2900],{},"使用源与目标的连线",[2225,2902,2903,2905],{},[2238,2904,2814],{},[2238,2906,2907],{},"用户指定",[2225,2909,2910,2913],{},[2238,2911,2912],{},"Distribution",[2238,2914,2915],{},"使用SourceTangent的设定值",[2225,2917,2918,2920],{},[2238,2919,2822],{},[2238,2921,2922],{},"使用发射器的朝向",[11,2924,2925],{},[1732,2926,2927],{},"Source Tangent",[11,2929,2930],{},"源切线的设定值。",[11,2932,2933],{},[1732,2934,2935],{},"Lock Source Tangent",[11,2937,2938],{},"在粒子生命周期中锁定源切线值。",[11,2940,2941],{},[1732,2942,2943],{},"Source Strength",[11,2945,2946],{},"切线力量强度。",[11,2948,2949],{},[1732,2950,2951],{},"Lock Source Strength",[11,2953,2954],{},"在粒子生命周期中锁定切线强度。",[11,2956,2957],{},[2143,2958,2390],{},[11,2960,2393],{},[1725,2962,2964],{"id":2963},"target","Target",[11,2966,2967],{},"目标点。",[11,2969,2970],{},[2143,2971,2964],{},[11,2973,2974],{},[1732,2975,2976],{},"Target Method",[11,2978,2979],{},"目标点方式。",[2219,2981,2982,2990],{},[2222,2983,2984],{},[2225,2985,2986,2988],{},[2228,2987],{},[2228,2989],{},[2233,2991,2992,2999,3005,3011,3017],{},[2225,2993,2994,2996],{},[2238,2995,2806],{},[2238,2997,2998],{},"使用Target的设定值",[2225,3000,3001,3003],{},[2238,3002,2814],{},[2238,3004,2817],{},[2225,3006,3007,3009],{},[2238,3008,2822],{},[2238,3010,2825],{},[2225,3012,3013,3015],{},[2238,3014,2830],{},[2238,3016,2833],{},[2225,3018,3019,3021],{},[2238,3020,2838],{},[2238,3022,2841],{},[11,3024,3025],{},[1732,3026,3027],{},"Target Name",[11,3029,3030],{},"目标名称。在Target Method为Particle和Acotr时有效，如果没有对应，则会使用Target的设定值。",[11,3032,3033],{},[1732,3034,3035],{},"Target Absolute",[11,3037,3038],{},"使用目标点绝对位置，亦即不进行变换。",[11,3040,3041],{},[1732,3042,2964],{},[11,3044,3045],{},"目标点位置。当Target Method为Default时有效。采用其他设定却无效时也会使用这个值。",[11,3047,3048],{},[1732,3049,3050],{},"Lock Target",[11,3052,3053],{},"在粒子生命周期中锁定目标点。",[11,3055,3056],{},[1732,3057,3058],{},"Target Tangent Method",[11,3060,3061],{},"目标切线方法。",[2219,3063,3064,3072],{},[2222,3065,3066],{},[2225,3067,3068,3070],{},[2228,3069],{},[2228,3071],{},[2233,3073,3074,3081,3087,3094],{},[2225,3075,3076,3078],{},[2238,3077,2897],{},[2238,3079,3080],{},"使用目标与目标的连线",[2225,3082,3083,3085],{},[2238,3084,2814],{},[2238,3086,2907],{},[2225,3088,3089,3091],{},[2238,3090,2912],{},[2238,3092,3093],{},"使用TargetTangent的设定值",[2225,3095,3096,3098],{},[2238,3097,2822],{},[2238,3099,2922],{},[11,3101,3102],{},[1732,3103,3104],{},"Target Tangent",[11,3106,3107],{},"目标切线的设定值。",[11,3109,3110],{},[1732,3111,3112],{},"Lock Target Tangent",[11,3114,3115],{},"在粒子生命周期中锁定目标切线值。",[11,3117,3118],{},[1732,3119,3120],{},"Target Strength",[11,3122,3123],{},"切线强度。",[11,3125,3126],{},[1732,3127,3128],{},"Lock Target Strength",[11,3130,2954],{},[11,3132,3133],{},[1732,3134,3135],{},"Lock Radius",[11,3137,3138],{},"光束的结束点被锁定在目标点的范围内，当光束有Speed设定时用到。",[18,3140,3141],{"id":3141},"应用",[11,3143,3144],{},"光束粒子发射器的模块和参数都比较多，不在实际中应用很难掌握其具体含义。",[11,3146,3147,3148,3153],{},"参照官方社区的教程",[25,3149,3152],{"href":3150,"rel":3151},"https:\u002F\u002Fwiki.unrealengine.com\u002FBeam_Particle_(Tutorial)",[29],"Beam Particle (Tutorial)","进行操作，是一个类似于放电现象的光束粒子。",[1725,3155,3156],{"id":3156},"材质",[11,3158,3159],{},"第一步与其他粒子系统一样，是制作材质。材质用到了两张贴图：",[11,3161,3162,1751,3166],{},[1747,3163],{"alt":3164,"src":3165},"BeamPulse","\u002Fwp-content\u002Fuploads\u002F2015\u002F07\u002FBeamPulse_thumb.png",[1747,3167],{"alt":3168,"src":3169},"BaseBeam","\u002Fwp-content\u002Fuploads\u002F2015\u002F07\u002FBaseBeam_thumb.png",[11,3171,3172],{},"将材质导入UE4制作成为如下的贴图：",[11,3174,3175],{},[1747,3176],{"alt":1749,"src":3177},"\u002Fwp-content\u002Fuploads\u002F2015\u002F07\u002Fimage_thumb9.png",[11,3179,3180],{},"Panner节点在放置之后注意设置x轴速度，默认的情况下是不会进行平移的。",[1725,3182,3183],{"id":3183},"粒子系统",[11,3185,3186],{},"材质创建完成后，新建一个粒子系统并将默认发射器的材质指定为刚刚创建的材质。同时为发射器添加Beam Data Type模块。",[11,3188,3189],{},[1747,3190],{"alt":1749,"src":3191},"\u002Fwp-content\u002Fuploads\u002F2015\u002F07\u002Fimage_thumb10.png",[11,3193,3194],{},"然后参照下表修改各个模块的属性：",[2219,3196,3197,3207],{},[2222,3198,3199],{},[2225,3200,3201,3203,3205],{},[2228,3202],{},[2228,3204],{},[2228,3206],{},[2233,3208,3209,3220,3231,3241,3252,3262,3273,3282,3291,3301],{},[2225,3210,3211,3214,3217],{},[2238,3212,3213],{},"属性",[2238,3215,3216],{},"值",[2238,3218,3219],{},"目的",[2225,3221,3222,3227,3229],{},[2238,3223,3224],{},[1732,3225,3226],{},"Lifetime Module",[2238,3228],{},[2238,3230],{},[2225,3232,3233,3236,3238],{},[2238,3234,3235],{},"Lifetime",[2238,3237,2240],{},[2238,3239,3240],{},"使得光束粒子一直存在。",[2225,3242,3243,3248,3250],{},[2238,3244,3245],{},[1732,3246,3247],{},"Beam Data Module",[2238,3249],{},[2238,3251],{},[2225,3253,3254,3256,3259],{},[2238,3255,2150],{},[2238,3257,3258],{},"PEB2M_Distance",[2238,3260,3261],{},"光束将沿着X轴方向发射，便于观察效果",[2225,3263,3264,3267,3270],{},[2238,3265,3266],{},"Texture Tile Distance",[2238,3268,3269],{},"500",[2238,3271,3272],{},"光束上贴图的长度为500单位，与下面的长度1000相匹配，使得光束上有两个“点”在流动",[2225,3274,3275,3277,3279],{},[2238,3276,2182],{},[2238,3278,1328],{},[2238,3280,3281],{},"光束个数为3，便于之后添加噪波效果。",[2225,3283,3284,3286,3288],{},[2238,3285,2190],{},[2238,3287,2240],{},[2238,3289,3290],{},"粒子立刻到达目标点",[2225,3292,3293,3295,3298],{},[2238,3294,2198],{},[2238,3296,3297],{},"50",[2238,3299,3300],{},"加强下一步噪波的特效",[2225,3302,3303,3305,3308],{},[2238,3304,2276],{},[2238,3306,3307],{},"1000",[2238,3309,3310],{},"光束的发射距离为1000，使得光束足够长",[11,3312,3313],{},"上面的属性设定完成后粒子系统的效果类似下图。",[11,3315,3316],{},[1747,3317],{"alt":1749,"src":3318},"\u002Fwp-content\u002Fuploads\u002F2015\u002F07\u002Fimage_thumb11.png",[1725,3320,3321],{"id":3321},"增加噪波",[11,3323,3324],{},"噪波可以使得光束拥有更多的随机效果，而不是单调的笔直的路径。",[11,3326,3327],{},"噪波模块的属性设置如下：",[2219,3329,3330,3340],{},[2222,3331,3332],{},[2225,3333,3334,3336,3338],{},[2228,3335],{},[2228,3337],{},[2228,3339],{},[2233,3341,3342,3350,3360,3370,3379,3389,3400],{},[2225,3343,3344,3346,3348],{},[2238,3345,3213],{},[2238,3347,3216],{},[2238,3349,3219],{},[2225,3351,3352,3354,3357],{},[2238,3353,2625],{},[2238,3355,3356],{},"30",[2238,3358,3359],{},"噪波频率",[2225,3361,3362,3364,3367],{},[2238,3363,2617],{},[2238,3365,3366],{},"选中",[2238,3368,3369],{},"打开噪波特效",[2225,3371,3372,3374,3377],{},[2238,3373,2641],{},[2238,3375,3376],{},"Vector Uniform distribution",[2238,3378],{},[2225,3380,3381,3384,3387],{},[2238,3382,3383],{},"Min:( 0, -50, -50) Max:( 0, 50, 50)",[2238,3385,3386],{},"噪点能够离开光束的范围",[2238,3388],{},[2225,3390,3391,3394,3397],{},[2238,3392,3393],{},"Noise Tessellation",[2238,3395,3396],{},"10",[2238,3398,3399],{},"使得噪波之后的光束之间的连接变得平滑",[2225,3401,3402,3404,3407],{},[2238,3403,2745],{},[2238,3405,3406],{},"100",[2238,3408,3409],{},"获得合理的噪点个数",[11,3411,3412],{},"最终效果如下：",[11,3414,3415],{},[1747,3416],{"alt":1749,"src":3417},"\u002Fwp-content\u002Fuploads\u002F2015\u002F07\u002Fimage_thumb12.png",[1725,3419,3420],{"id":3420},"属性测试",[11,3422,3423],{},"关于Beam Modifier模块中的Scale，当发射距离为1000时，如果应用修改器将发射点移动到10000。那么在没有启用Scale时，按照设定每100会有一个噪点。当Scale启用时，10000的长度上依然是10个噪点。 对于可以使用Curv型分布的变量，如果改用Curv型的话可以实现很多不同的效果，由于现在还没有具体使用到，就没有一一的去测试了。",{"title":89,"searchDepth":117,"depth":124,"links":3425},[3426,3427,3433],{"id":2135,"depth":117,"text":2136},{"id":2396,"depth":117,"text":2397,"children":3428},[3429,3430,3431,3432],{"id":2408,"depth":124,"text":2409},{"id":2603,"depth":124,"text":2604},{"id":2773,"depth":124,"text":2774},{"id":2963,"depth":124,"text":2964},{"id":3141,"depth":117,"text":3141,"children":3434},[3435,3436,3437,3438],{"id":3156,"depth":124,"text":3156},{"id":3183,"depth":124,"text":3183},{"id":3321,"depth":124,"text":3321},{"id":3420,"depth":124,"text":3420},"2015-07-04",{"layout":1549,"status":1550,"published":120,"author":3441,"author_login":1552,"author_email":1553,"author_url":1554,"wordpress_id":3442,"wordpress_url":3443,"date_gmt":3444,"excerpt":3445},{"display_name":1552,"login":1552,"email":1553,"url":1554},1367,"\u002F\u002F?p=1367","2015-07-04 05:24:03 +0000",{"type":8,"value":3446},[3447],[11,3448,2127],{},"\u002F2015-07-04-ue4-beamtype-particle-module",{"title":2122,"description":2127},"_legacy\u002F2015\u002F2015-07-04-ue4-beamtype-particle-module",[1566,1909,2145],"a__oXoVRCC9pe-Fhjs6Jbix_E7m_yztyrVJCxWFD8nM",222,1788763184183]