{"id":4426,"date":"2022-06-29T20:59:05","date_gmt":"2022-06-29T18:59:05","guid":{"rendered":"https:\/\/store.algosyntax.com\/?post_type=asx-lms-tutorial-cpt&#038;p=4426"},"modified":"2026-03-09T17:48:31","modified_gmt":"2026-03-09T15:48:31","slug":"how-to-package-and-sell-binary-plugins-for-ue5","status":"publish","type":"asx-lms-tutorial-cpt","link":"https:\/\/store.algosyntax.com\/tutorials\/unreal-engine\/how-to-package-and-sell-binary-plugins-for-ue5\/","title":{"rendered":"How To Package And Sell Binary Plugins For UE5"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"4426\" class=\"elementor elementor-4426\" data-elementor-post-type=\"asx-lms-tutorial-cpt\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-cc6dc34 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"cc6dc34\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-327ff28\" data-id=\"327ff28\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d2ca4a5 elementor-widget elementor-widget-text-editor\" data-id=\"d2ca4a5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>You can package and distribute your unreal engine plugins as binary files only and not have to share your source files. There are a few advantages and disadvantages of both approaches which we&#8217;ll touch on in this tutorial.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-42111ad elementor-widget elementor-widget-heading\" data-id=\"42111ad\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">The Process To Package Binary Plugins<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2e49858 elementor-widget elementor-widget-text-editor\" data-id=\"2e49858\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>We assume you have a working plugin that you would like to package and strip the source files from.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-87b648b elementor-widget elementor-widget-text-editor\" data-id=\"87b648b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<ol><li><h3>Prepare Modules For Precompilation<\/h3><\/li><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-edf5883 elementor-widget elementor-widget-text-editor\" data-id=\"edf5883\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p><strong>AS OF UE 5.03 , YOU CAN SKIP THIS STEP.<\/strong><\/p><p>Modules are automatically pre-compiled by default for the platform you&#8217;re using. Eg xWin64.<br \/><br \/><br \/>The first thing we want to do is make sure the modules in our plugin are precompiled when packaging.<\/p><p>To do this, go to each module&#8217;s Build.cs and add the following line<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-672374e elementor-widget elementor-widget-code-highlight\" data-id=\"672374e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-aspnet line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-aspnet\">\n\t\t\t\t\t<xmp>PrecompileForTargets = PrecompileTargetsType.Any;<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-57a50e6 elementor-widget elementor-widget-text-editor\" data-id=\"57a50e6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>If you understand what this line does you can modify it to target a specific platform.<\/p><p>This line makes sure we are precompiling our modules so that our users won&#8217;t have to compile them on their end. We can just deliver them the precompiled files to use.(The binaries).<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e0b59a3 elementor-widget elementor-widget-text-editor\" data-id=\"e0b59a3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<ol start=2>\n \t<li>\n<h3>Package the Plugin using the editor<\/h3>\n<\/li>\n<\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6c3e969 elementor-widget elementor-widget-text-editor\" data-id=\"6c3e969\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>The next step is to package the plugin normally using the editor by going to the plugin window and using the Package button that sits below your plugin. You can also package from the command line. Just make sure the packaging is successful then move on to step 3.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f939d39 elementor-widget elementor-widget-text-editor\" data-id=\"f939d39\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<ol start=\"3\"><li><h3>Set The Modules To Use PreCompiled versions<\/h3><\/li><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-79e4b6e elementor-widget elementor-widget-text-editor\" data-id=\"79e4b6e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>In the packaged plugin, Go to each module&#8217;s build.cs and set<\/p><p>\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-338b77a elementor-widget elementor-widget-code-highlight\" data-id=\"338b77a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-aspnet line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-aspnet\">\n\t\t\t\t\t<xmp>bUsePrecompiled=true;\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-da37435 elementor-widget elementor-widget-text-editor\" data-id=\"da37435\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p><strong>You can remove every line in the Build.cs though and leave only the bUsePreCompiled=true line.<\/strong><\/p><p>\u00a0<\/p><p>This will instruct UBT to load the precompiled files we just made in the client machine, instead of attempting to build them. If you don&#8217;t do this UBT will discard your precompiled files and attempt to rebuild(which will fail without source.)<\/p><p>\u00a0<\/p><p>If you choose to clean up the Build.cs, make sure you leave ALL the &#8220;Add dependencies&#8221; lines intact.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-340fa1e elementor-widget elementor-widget-text-editor\" data-id=\"340fa1e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<ol start=\"4\">\n \t<li>\n<h3>Delete The Private Source Files<\/h3>\n<\/li>\n<\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5cfb368 elementor-widget elementor-widget-text-editor\" data-id=\"5cfb368\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Go to the packaged plugin&#8217;s folder, and then go inside the source folder. From here you need to decide which header files your user&#8217;s should get access to when working in c++.<\/p><p>\u00a0<\/p><p><strong>Important: You need the build.cs. Even For BP Access Only Plugins. You can delete the .h and cpp files only.\u00a0<\/strong><\/p><p>\u00a0<\/p><p>If your plugin is not meant to be interfaced with in c++ at ALL, you can delete all source files.<\/p><p>\u00a0<\/p><p>If you want them them to use some classes from c++ leave only the header files of that class.<\/p><p>So inside your Source folder, Go into the module folder and delete all .cpp and all header files you&#8217;d like to protect.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4f3abd6 elementor-widget elementor-widget-text-editor\" data-id=\"4f3abd6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>The organization of files is key, see our Plugin Development Course for Unreal Engine to see how to smartly use the Public and Private folders to hide some of your sensitive source files.<\/p><p>\u00a0<\/p><p>\u00a0<\/p><p>That&#8217;s it for the source folder. Go back to the main plugin folder and go to Binaries.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a5885ae elementor-widget elementor-widget-text-editor\" data-id=\"a5885ae\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<ol start=\"5\">\n \t<li>\n<h3>Delete Unnecessary Binary Files<\/h3>\n<\/li>\n<\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7caf25d elementor-widget elementor-widget-text-editor\" data-id=\"7caf25d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Inside the PluginName\/Binaries folder you can delete all files ending in .pdb. PDB files are used in debugging during development. To better protect your source we advice you delete these.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-65a5185 elementor-widget elementor-widget-text-editor\" data-id=\"65a5185\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<ol start=\"6\">\n \t<li>\n<h3>Delete Unnecessary Intermediate Files<\/h3>\n<\/li>\n<\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-83bfdf1 elementor-widget elementor-widget-text-editor\" data-id=\"83bfdf1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Inside the PluginName\/Intermediate\/Build\/Win64&#8230;<\/p><p>You will find both the UnrealEditor and UnrealGame Folders.\u00a0<\/p><p>Inside both folders, you may have the &#8220;Development&#8221;, &#8220;Shipping&#8221; and &#8220;Inc&#8221; folders.\u00a0<\/p><p>\u00a0<\/p><p>The files inside the UnrealEditor Folder are used during development for C++ projects only, and those inside UnrealGame are used in shipped games. Hence, both folders and their files need to stay IF your users will be accessing them in C++ projects and shipping with your plugin. The only exception is for PRIVATE editor modules. You can delete the .libs of editor modules in both folders in this case.<\/p><p>\u00a0<\/p><p>If your plugin is NOT to be shipped, and it&#8217;s not to be accessed from C++ at all, You can delete the entire &#8220;Intermediate Folder&#8221;. This will disable both shipping and access from C++ and make the plugin work only in the editor.\u00a0<\/p><p>\u00a0<\/p><p>That&#8217;s it you can distribute your binary-only plugin and users will be able to develop and ship with it without exposing your source files.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f7dc465 elementor-widget elementor-widget-text-editor\" data-id=\"f7dc465\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<ol start=\"7\"><li><h3>Set Plugin To Installed Mode<\/h3><\/li><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-97404a9 elementor-widget elementor-widget-text-editor\" data-id=\"97404a9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Finally, go to the plugin&#8217;s .uplugin and add the line :<\/p><p>&#8220;Installed&#8221;: true,<br \/><br \/><br \/>This will tell UE5 that this plugin has been installed once the user installs it and it will use this information to categorize it properly.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-948539f elementor-widget elementor-widget-text-editor\" data-id=\"948539f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<ol start=\"8\">\n \t<li>\n<h3>Disable Shipping With Your Plugin(For Demos\/Trials)<\/h3>\n<\/li>\n<\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3ea8ce9 elementor-widget elementor-widget-text-editor\" data-id=\"3ea8ce9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>To disable shipping with your plugin, you should instead delete the &#8220;UnrealGame&#8221; Folder and leave the &#8220;UnrealEditor&#8221; Folder in Step 6 above. The &#8220;UnrealGame&#8221; folder contains the &#8220;Shipping&#8221; Folder from step 6. This folder is critical to your users when shipping their projects with your plugin. If you delete it, The plugin will still work in the editor, but packaging projects using it will fail.\u00a0<\/p><p><strong>NB: The Build.Cs files inside the Source Folder are required<\/strong> so we can&#8217;t delete them. BUT you can remove all the custom code in the build.cs like dependencies and leave the barebones build.cs file. It will still work fine.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-caa92f4 elementor-widget elementor-widget-text-editor\" data-id=\"caa92f4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Sometimes you may wish for developers to try your plugin, But disable the ability for them to ship their projects with your plugin without buying a license. This model is great for offering free trials for developers to test if your plugin is a good fit for their project. Once they like it, they can buy the plugin with the &#8220;Shipping&#8221; config, which will allow them to ship their game. OR they can get the source version. So you get offer 3 versions: The Trial, The Binary(with shipping), And The Source.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-117a336 elementor-widget elementor-widget-heading\" data-id=\"117a336\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Binary  Vs Full Source Plugins<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4f69cd6 elementor-widget elementor-widget-text-editor\" data-id=\"4f69cd6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>First, let&#8217;s acknowledge this is a controversial topic and a lot of developers have different opinions on it. With most leaning to &#8220;just give us the source&#8221;. Which we understand, cause the source is critical to making customizations to your plugin AND also it&#8217;s a bargain, we get the source files to your awesome plugin at a fraction of the price.<\/p><p>You may be thinking the solution is to to raise the price of your source version so you get paid fairly for your hard work&#8230;:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fc1ba6a elementor-widget elementor-widget-text-editor\" data-id=\"fc1ba6a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Here are a few things to consider when pricing your unreal engine source-based plugin.<\/p><ol><li>The majority of your buyers are likely indie developers with limited budgets. Expensive plugins won&#8217;t convert well. They want to buy your plugin, it&#8217;s just too expensive.<\/li><li>You can get undercut by another developer\/competitor. Another developer may just get access to your source and develop a similar plugin and then undercut your original price sometimes by 80%.\u00a0<\/li><li>The moment your source files are out there, It&#8217;s only a matter of time before your plugin becomes obsolete. Even without Source files. Never tell yourself there&#8217;s no other developer that can write the same feature\/code. Always be aware of the realistic time your plugin can generate revenue.\u00a0<\/li><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b23d8f4 elementor-widget elementor-widget-text-editor\" data-id=\"b23d8f4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>But with that said, Developers having access to full source files of your plugin is almost a must for non-indie developers. What&#8217;s the solution?<\/p><p>We think a solution to this problem is to offer both at different pricing:<\/p><p>Offer an affordable solution, the binary version, and the source version that doesn&#8217;t leave you feeling like you&#8217;re selling yourself short.\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"featured_media":0,"template":"","asx-lms-tutorial-categories":[55,48,45],"asx-lms-tutorial-tags":[46],"class_list":["post-4426","asx-lms-tutorial-cpt","type-asx-lms-tutorial-cpt","status-publish","hentry","asx-lms-tutorial-categories-plugin-development","asx-lms-tutorial-categories-unreal-build-tool","asx-lms-tutorial-categories-unreal-engine","asx-lms-tutorial-tags-cpp","entry"],"acf":[],"_links":{"self":[{"href":"https:\/\/store.algosyntax.com\/asx-rest\/wp\/v2\/asx-lms-tutorial-cpt\/4426","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/store.algosyntax.com\/asx-rest\/wp\/v2\/asx-lms-tutorial-cpt"}],"about":[{"href":"https:\/\/store.algosyntax.com\/asx-rest\/wp\/v2\/types\/asx-lms-tutorial-cpt"}],"version-history":[{"count":0,"href":"https:\/\/store.algosyntax.com\/asx-rest\/wp\/v2\/asx-lms-tutorial-cpt\/4426\/revisions"}],"wp:attachment":[{"href":"https:\/\/store.algosyntax.com\/asx-rest\/wp\/v2\/media?parent=4426"}],"wp:term":[{"taxonomy":"asx-lms-tutorial-categories","embeddable":true,"href":"https:\/\/store.algosyntax.com\/asx-rest\/wp\/v2\/asx-lms-tutorial-categories?post=4426"},{"taxonomy":"asx-lms-tutorial-tags","embeddable":true,"href":"https:\/\/store.algosyntax.com\/asx-rest\/wp\/v2\/asx-lms-tutorial-tags?post=4426"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}