PageSourceSearch

https://elmarathstudio.netlify.app/assets/js/bab34b2a.c3d8e618.js

js elmarathstudio.netlify.app collected 2026-10-03 10:43:03 UTC 17,994 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9292],{2499:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/T_DynamicInputSystemThumbanil-9c7851a4088f539fcaeee5ba4ce6fd52.png"},8516:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/T_EasyAbilitySetSystem_Logo-a3d2776b41f405833c0fede2397ff5b1.png"},10968:(e,n,s)=>{s.d(n,{J:()=>i,u:()=>a});var t=s(25901);const i=[{id:"StagedInteractionSystem",title:"Staged Interaction System",Img:s(33037).A,description:"Staged Interaction System that uses stages as a way to create complex player interactions with ease.",DocLink:"docs/Staged-Interaction-System/Overview",FabLink:"https://www.fab.com/listings/ea6cda8e-25b1-434e-a9ab-1c2bbaa5fe67"},{id:"EasyTraceTrailSystem",title:"Easy Trace-Trail System",Img:s(45155).A,description:"A modular, optimized solution for easily controlling and extending hit results from continuous hit trails.",DocLink:"/docs/Easy-Trace-Trail-System/EasyTraceTrailSystem",FabLink:"https://www.fab.com/listings/86d9af14-9ab3-4c47-83b2-96eb6a4b5957"},{title:"Ability Queue Task System",Img:s(67886).A,description:"Extension of Epic's Gameplay Ability System. Enables queueable abilities with priority-based activation.",DocLink:"/docs/Ability-Queue-Task-System/Overview",FabLink:"https://www.fab.com/listings/554398ff-338b-43da-bf43-b081ef166b92"},{title:"Nested Inventory Architecture",Img:s(67378).A,description:"Create customizable, nested, section-based, object-oriented inventory systems for intuitive gameplay.",DocLink:"/docs/Nested-Invnetory-Architecture/AboutNestedInventoryArchitecture",FabLink:"https://www.fab.com/listings/320f157f-9241-47ee-9f32-63aaf744f509"},{title:"Modular Action System",Img:s(60229).A,description:"A modular, data-driven action system for games. Network-ready and easy to customize.",DocLink:"/docs/Modular-Action-System/About-Modular-Action-System",FabLink:"https://www.fab.com/listings/6ef3ecaa-1a2f-4056-a209-cf228df40c3f"},{title:"Easy Skeletal Mesh Merge Async",Img:s(88612).A,description:"A simple and optimized workflow to create modular characters via skele merging.",DocLink:"/docs/Easy-Skeletal-Mesh-Merge-Async/EasySkeletalMeshMergeAsync",FabLink:"https://www.fab.com/listings/616906a0-c73d-4e7a-9002-866a6d9751d5",GitHubLink:"https://github.com/Elmarath/EasySkeletalMeshMergeAsync"},{title:"Easy Ability Set System",Img:s(8516).A,description:"Ability Set Management System that handles both granting and input binding for Gameplay Ability System.",DocLink:"/docs/Easy-Ability-Set-System/EasyAbilitySetSystemStartup",FabLink:"https://www.fab.com/sellers/Elmarath"},{title:"Dynamic Input System",Img:s(2499).A,description:"A flexible, runtime input management system that allows dynamic binding and modification of input mappings during gameplay.",DocLink:"/docs/Dynamic-Input-System/DynamicInputSystem",GitHubLink:"https://www.fab.com/listings/cdf2ad8e-b9b7-4b4e-87bb-fdcfbe3c3b2b",FabLink:"https://www.fab.com/listings/cdf2ad8e-b9b7-4b4e-87bb-fdcfbe3c3b2b"}],a=[{id:"email",label:"Email",value:t.ku.email,link:`mailto:${t.ku.email}`,icon:"mail",action:"link"},{id:"resume",label:"Resume/CV",value:"View my professional CV",link:"/docs/DenizhanToprak_Resume.pdf",icon:"resume",action:"resume"},{id:"linkedin",label:"LinkedIn",value:"Connect with me on LinkedIn",link:t.ku.linkedinUrl,icon:"linkedin",action:"external"},{id:"github",label:"GitHub Profile",value:"View all my projects",link:t.ku.githubUrl,icon:"github",action:"external"},{id:"blog",label:"About Me Blog",value:"Read my personal story and journey",link:t.ku.blogPath,icon:"blog",action:"navigate"}]},23392:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/T_EasySkeletalMeshMergingMethods-85955d4d3a3f12d38f3369cc1cf0c7ce.png"},25901:(e,n,s)=>{s.d(n,{ku:()=>t});const t={name:"Denizhan Toprak",title:"C++ Gameplay Programmer",email:"[email protected]",github:"https://github.com/elmarath",githubUrl:"https://github.com/elmarath",linkedin:"https://www.linkedin.com/in/denizhan-toprak-006073193/",linkedinUrl:"https://www.linkedin.com/in/denizhan-toprak-006073193/",resume:"https://docs.google.com/document/d/1NyO2H-jLeTuhU76wPoMm6xU3kDFCQn3Dn-A5imPmtfA/edit?tab=t.0",resumeUrl:"https://docs.google.com/document/d/1NyO2H-jLeTuhU76wPoMm6xU3kDFCQn3Dn-A5imPmtfA/edit?tab=t.0",avatar:"https://avatars.githubusercontent.com/u/65414809?v=4",description:"Unreal Engine C++ Developer. Creator of this platform and it's listed tools. Let's connect!",blogPath:"/blog/About Me"}},28453:(e,n,s)=>{s.d(n,{R:()=>l,x:()=>r});var t=s(96540);const i={},a=t.createContext(i);function l(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),t.createElement(a.Provider,{value:n},e.children)}},33037:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/T_StagedInteractionThumbnail-f52c7615a1914b0a177bf067ac5236f8.png"},40978:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/T_EasySkeletalMeshMergeAsyncHowToAAdd-48c36e25d6bfcb70935f0ed55094e7cf.png"},45155:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/T_EasyTraceTrailSystemThumbnail-4b9937a81de461b0f69e6d4907adc5b7.png"},51519:(e,n,s)=>{s.d(n,{A:()=>t});const t={pluginLinksContainer:"pluginLinksContainer_Xbps",linksTitle:"linksTitle_v6Hv",linksGrid:"linksGrid_l5Uu",linkButton:"linkButton_FFVW",linkIcon:"linkIcon_j8va",docsButton:"docsButton_y6Gg",fabButton:"fabButton_l3ky",githubButton:"githubButton_eyFH"}},60229:(e,n,s)=>{s.d(n,{A:()=>t});
1const t=s.p+"assets/images/T_ModularActionSystemLogo-8f65d3ec08ebf7cac0efeb4e8a2e5f96.png"},67378:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/T_NIA_Thumbnail-88027eb5cb699b50479f5d97e32f4ec9.png"},67886:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/T_AbilityQueueTaskSystemThumbnail-5f7d91c59f3881b0d5809c82cb6e6f83.png"},83930:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/T_EasySkeletalMeshAsyncPreview-aa94409acd97020c2d9942d461419e75.gif"},85843:(e,n,s)=>{s.d(n,{A:()=>l});s(96540);var t=s(10968),i=s(51519),a=s(74848);const l=({pluginId:e})=>{const n=t.J.find((n=>n.DocLink.includes(e)||n.title.toLowerCase().includes(e.toLowerCase())));return n?(0,a.jsxs)("div",{className:i.A.pluginLinksContainer,children:[(0,a.jsx)("h3",{className:i.A.linksTitle,children:"Quick Links"}),(0,a.jsxs)("div",{className:i.A.linksGrid,children:[n.FabLink&&(0,a.jsxs)("a",{href:n.FabLink,target:"_blank",rel:"noopener noreferrer",className:`${i.A.linkButton} ${i.A.fabButton}`,title:"View on Fab",children:[(0,a.jsx)("img",{src:"/img/T_Epic_Games_Fab_2024_icon.svg",alt:"Fab",className:i.A.linkIcon}),(0,a.jsx)("span",{children:"Fab"})]}),n.GitHubLink&&(0,a.jsxs)("a",{href:n.GitHubLink,target:"_blank",rel:"noopener noreferrer",className:`${i.A.linkButton} ${i.A.githubButton}`,title:"View on GitHub",children:[(0,a.jsx)("svg",{className:i.A.linkIcon,viewBox:"0 0 24 24",fill:"currentColor",children:(0,a.jsx)("path",{d:"M12,2A10,10 0 0,0 2,12C2,16.42 4.87,20.17 8.84,21.5C9.34,21.58 9.5,21.27 9.5,21C9.5,20.77 9.5,20.14 9.5,19.31C6.73,19.91 6.14,17.97 6.14,17.97C5.68,16.81 5.03,16.5 5.03,16.5C4.12,15.88 5.1,15.9 5.1,15.9C6.1,15.97 6.63,16.93 6.63,16.93C7.5,18.45 8.97,18 9.54,17.76C9.63,17.11 9.89,16.67 10.17,16.42C7.95,16.17 5.62,15.31 5.62,11.5C5.62,10.39 6,9.5 6.65,8.79C6.55,8.54 6.2,7.5 6.75,6.15C6.75,6.15 7.59,5.88 9.5,7.17C10.29,6.95 11.15,6.84 12,6.84C12.85,6.84 13.71,6.95 14.5,7.17C16.41,5.88 17.25,6.15 17.25,6.15C17.8,7.5 17.45,8.54 17.35,8.79C18,9.5 18.38,10.39 18.38,11.5C18.38,15.32 16.04,16.16 13.81,16.41C14.17,16.72 14.5,17.33 14.5,18.26C14.5,19.6 14.5,20.68 14.5,21C14.5,21.27 14.66,21.59 15.17,21.5C19.14,20.16 22,16.42 22,12A10,10 0 0,0 12,2Z"})}),(0,a.jsx)("span",{children:"GitHub"})]})]})]}):null}},86617:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>m,frontMatter:()=>r,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"Easy-Skeletal-Mesh-Merge-Async/EasySkeletalMeshMergeAsync","title":"Merge Meshes At Runtime!","description":"EasySkeletalMeshMergeAsync is an Unreal Engine plugin that lets you merge skeletal meshes asynchronously at runtime, making modular characters easy and efficient.","source":"@site/docs/Easy-Skeletal-Mesh-Merge-Async/Startup.md","sourceDirName":"Easy-Skeletal-Mesh-Merge-Async","slug":"/Easy-Skeletal-Mesh-Merge-Async/EasySkeletalMeshMergeAsync","permalink":"/docs/Easy-Skeletal-Mesh-Merge-Async/EasySkeletalMeshMergeAsync","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"id":"EasySkeletalMeshMergeAsync","title":"Merge Meshes At Runtime!","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Easy Skeletal Mesh Merge Async","permalink":"/docs/category/easy-skeletal-mesh-merge-async"},"next":{"title":"Easy Trace-Trail System","permalink":"/docs/category/easy-trace-trail-system"}}');var i=s(74848),a=s(28453),l=s(85843);const r={id:"EasySkeletalMeshMergeAsync",title:"Merge Meshes At Runtime!",sidebar_position:1},o="Easy Skeletal Mesh Merge Async",c={},d=[{value:"Video Overview",id:"video-overview",level:2},{value:"Features",id:"features",level:2},{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Adding the Component",id:"adding-the-component",level:3},{value:"C++ Example",id:"c-example",level:3},{value:"How It Works",id:"how-it-works",level:3},{value:"Runtime Merging",id:"runtime-merging",level:2},{value:"Example: Inventory Integration",id:"example-inventory-integration",level:2},{value:"Support",id:"support",level:2}];function h(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(l.A,{pluginId:"Easy Skeletal Mesh Merge Async"}),"\n",(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"easy-skeletal-mesh-merge-async",children:"Easy Skeletal Mesh Merge Async"})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"EasySkeletalMeshMergeAsync"})," is an Unreal Engine plugin that lets you merge skeletal meshes ",(0,i.jsx)(n.em,{children:"asynchronously"}
1)," at runtime, making modular characters easy and efficient."]}),"\n",(0,i.jsxs)(n.p,{children:["Many modular character solutions are hard to manage or cause extra draw calls, hurting performance. While Epic's ",(0,i.jsx)(n.a,{href:"https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Plugins/SkeletalMerging",children:"Skeletal Merging"})," plugin solves this, it can be tricky to use and manage hard references or replication.",(0,i.jsx)(n.br,{}),"\n","This plugin builds on Epic's system, but offers a much simpler API and workflow."]}),"\n",(0,i.jsx)(n.h2,{id:"video-overview",children:"Video Overview"}),"\n",(0,i.jsxs)(n.p,{children:["Watch this comprehensive tutorial to see ",(0,i.jsx)(n.strong,{children:"EasySkeletalMeshMergeAsync"})," in action:"]}),"\n",(0,i.jsx)("iframe",{width:"100%",height:"400",src:"https://www.youtube.com/embed/Vn82nP2bj0s?start=33",title:"Easy Skeletal Mesh Merge Async Tutorial",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.em,{children:"This video demonstrates the complete workflow from setup to implementation."})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Preview",src:s(83930).A+"",width:"800",height:"520"})}),"\n",(0,i.jsx)(n.h2,{id:"features",children:"Features"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Async Skeletal Mesh Loading:"})," Merge meshes ",(0,i.jsx)(n.em,{children:"without blocking the game thread"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Component-based:"})," Add merge capability to ",(0,i.jsx)(n.em,{children:"any actor"})," or ",(0,i.jsx)(n.em,{children:"override the default skeletal mesh component"})," on characters."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Task-based:"})," Loading and merging are handled as background tasks. Which is cancelled whenever a new request comes. Ensuring ",(0,i.jsx)(n.em,{children:"stability"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Network-ready:"})," ",(0,i.jsx)(n.em,{children:"Replicate"})," merged meshes so all players see the same result."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"From Epic Fab"})}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Install the plugin to your engine."}),"\n",(0,i.jsx)(n.li,{children:"Enable it in Unreal Engine's plugin settings."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Manual"})}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Copy ",(0,i.jsx)(n.code,{children:"EasySkeletalMeshMergeAsync"})," to your project's ",(0,i.jsx)(n.code,{children:"Plugins"})," folder."]}),"\n",(0,i.jsx)(n.li,{children:"Regenerate project files and build."}),"\n",(0,i.jsx)(n.li,{children:"Enable the plugin in Unreal Engine."}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,i.jsx)(n.h3,{id:"adding-the-component",children:"Adding the Component"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Add the ",(0,i.jsx)(n.code,{children:"UEasySkeletalMeshAsyncMergeable"})," component to any actor."]}),"\n",(0,i.jsxs)(n.li,{children:["Or, replace your actor's default skeletal mesh component with ",(0,i.jsx)(n.code,{children:"EasySkeletalMeshAsyncMergeable"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"How to Add Component",src:s(40978).A+"",width:"2140",height:"760"})}),"\n",(0,i.jsx)(n.h3,{id:"c-example",children:"C++ Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-cpp",children:'#include "Component/EasySkeletalMeshAsyncMergeable.h"\n'})}),"\n",(0,i.jsx)(n.h3,{id:"how-it-works",children:"How It Works"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["The plugin uses a background task (",(0,i.jsx)(n.code,{children:"LoadSkeletalMeshesAndMergeTask"}),") to load and merge meshes on every client."]}),"\n",(0,i.jsxs)(n.li,{children:["The main component, ",(0,i.jsx)(n.strong,{children:"UEasySkeletalMeshAsyncMergeable"}),", manages the tasks and ensures stability between clients."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"runtime-merging",children:"Runtime Merging"}),"\n",(0,i.jsxs)(n.p,{children:["Most settings work out-of-the-box. Advanced parameters are inherited from ",(0,i.jsx)(n.a,{href:"https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Plugins/SkeletalMerging",children:"Skeletal Merging"}),".",(0,i.jsx)(n.br,{}),"\n","You can override the base skeletal mesh via the component if needed."]}),"\n",(0,i.jsxs)(n.admonition,{type:"warning",children:[(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"Base Skeletal Mesh"})," parameter is set from the first mesh at begin play, but can be changed with ",(0,i.jsx)(n.code,{children:"Set Base Skeletal Mesh"}),"."]}),(0,i.jsxs)(n.p,{children:["Do not use the default ",(0,i.jsx)(n.code,{children:"Set Skeletal Mesh"})," on the component. It can cause inconsistency between clients."]})]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Component Params",src:s(87190).A+"",width:"717",height:"249"})}),"\n",(0,i.jsx)(n.p,{children:"You'll find several merge methods in the component:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Component Methods",src:s(23392).A+"",width:"1173",height:"1195"})}),"\n",(0,i.jsxs)(n.p,{children:["Most functions focus on currently equipped meshes, with parameters for custom effects.",(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.code,{children:"MeshMergeOverrideParams"})," matches Epic's Skeletal Merging options."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["You don't need to touch ",(0,i.jsx)(n.code,{children:"Mesh Merge Override Params"})," for basic use\u2014meshes will merge with correct materials.",(0,i.jsx)(n.br,{}),"\n","For advanced users: you can customize UVs for single-material meshes or further customization (see ",(0,i.jsx)(n.a,{href:"https://www.youtube.com/watch?v=A-P0llMckSw",children:"this video by Prismatica"}),")."]})}),"\n",(0,i.jsx)(n.h2,{id:"example-inventory-integration",children:"Example: Inventory Integration"}),"\n",(0,i.jsx)(n.p,{children:"When an item with a mesh is added to a slot, merge it with the base mesh\u2014perfect for inventory systems!"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Inventory Example",src:s(92529).A+"",width:"1950",height:"629"})}),"\n",(0,i.jsx)(n.p,{children:"This example function runs whenever an inventory slot changes content."}),"\n",(0,i.jsx)(n.h2,{id:"support",children:"Support"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://github.com/Elmarath/EasySkeletalMeshMergeAsync",children:"GitHub Issues"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://discord.gg/mUm4hYvG3x",children:"Discord Community"})}),"\n"]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.em,{children:"If you use this plugin, please consider leaving a review or feedback!"})})]})}function m(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},87190:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/T_EasySkeletalMeshComponentParams-14224ab1f78df01a118b28eb4c027f9e.png"},88612:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/EasySkeletalMeshMergeAsync-f341c8b592d95242c5ff7171ba714117.png"},92529:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/T_UI_MeshMergeFromInventoryExample-9210282087030e5a16703a96d4228ece.png"}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.