{"id":894,"date":"2025-03-12T15:39:18","date_gmt":"2025-03-12T15:39:18","guid":{"rendered":"https:\/\/www.portalsunited.com:443\/?post_type=docs&#038;p=894"},"modified":"2025-03-13T13:24:29","modified_gmt":"2025-03-13T13:24:29","password":"","slug":"worldbuilder-runtime-scripting-documentation","status":"publish","type":"docs","link":"https:\/\/www.portalsunited.com:443\/docs\/worldbuilder-runtime-scripting-documentation\/","title":{"rendered":"World Builder &#8211; Runtime Scripting Documentation"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\" id=\"introduction-to-runtime-scripting\">Introduction to Runtime Scripting<\/h2>\n\n\n\n<p>WorldBuilder&#8217;s runtime scripting system enables the creation of custom interactive components directly within the application environment using C# programming language.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"technical-framework\">Technical Framework<\/h2>\n\n\n\n<p>The runtime scripting implementation in WorldBuilder utilizes C# and the Unity engine&#8217;s core functionality. Components are created following a structured inheritance pattern:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Each component inherits from <code>DataComponentBase<\/code><\/li>\n\n\n\n<li>Properties are serialized using Newtonsoft.Json&#8217;s <code>[JsonProperty]<\/code> attributes<\/li>\n\n\n\n<li>Components leverage Unity&#8217;s lifecycle methods (<code>Start()<\/code>, <code>Update()<\/code>)<\/li>\n\n\n\n<li>Inspector views are created separately to manage the component&#8217;s visual editing interface<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"component-structure\">Component Structure<\/h2>\n\n\n\n<p>A runtime component consists of two primary files:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Component Implementation File<\/strong>: Defines behavior using C# and Unity libraries<\/li>\n\n\n\n<li><strong>Inspector View File<\/strong>: Provides the interface for modifying component properties<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"component-implementation-example\">Component Implementation Example<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MyHoverComponent<\/span>: <span class=\"hljs-title\">DataComponentBase<\/span>\n{\n    &#91;JsonProperty(<span class=\"hljs-string\">\"Speed\"<\/span>)]\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">float<\/span> Speed = <span class=\"hljs-number\">1.0<\/span>f;\n\n    &#91;JsonProperty(<span class=\"hljs-string\">\"Height\"<\/span>)]\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">float<\/span> Height = <span class=\"hljs-number\">2.0<\/span>f;\n\n    <span class=\"hljs-keyword\">private<\/span> Vector3 m_InitialPosition;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Start<\/span>(<span class=\"hljs-params\"><\/span>)\n    <\/span>{\n        m_InitialPosition = transform.position;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Update<\/span>(<span class=\"hljs-params\"><\/span>)\n    <\/span>{\n        <span class=\"hljs-keyword\">float<\/span> newY = Mathf.Sin(Time.time * Speed) * Height + m_InitialPosition.y;\n        transform.position = <span class=\"hljs-keyword\">new<\/span> Vector3(transform.position.x, newY, transform.position.z);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> List&lt;<span class=\"hljs-keyword\">string<\/span>&gt; <span class=\"hljs-title\">GetAssetReferences<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{ <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">null<\/span>; }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">AfterDeserialization<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{ }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"inspector-view-example\">Inspector View Example<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MyHoverComponentInspectorView<\/span> : <span class=\"hljs-title\">DataComponentInspectorViewBase<\/span>\n<\/span>{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> Type TypeOfDataComponent { <span class=\"hljs-keyword\">get<\/span> =&gt; typeof(MyHoverComponent); }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> void CreateInspectorEntries(VisualElement window, IReferenceProvider referenceProvider, IUIElementFactory elementFactory, object instance)\n    {\n        <span class=\"hljs-keyword\">var<\/span> hoverComponent = instance as MyHoverComponent;\n        elementFactory.CreateInspectorFloatField(window, <span class=\"hljs-string\">\"Speed\"<\/span>, hoverComponent.Speed, (oldValue, <span class=\"hljs-keyword\">new<\/span><span class=\"hljs-type\">Value<\/span>) =&gt;\n        {\n            hoverComponent.Speed = <span class=\"hljs-keyword\">new<\/span><span class=\"hljs-type\">Value<\/span>;\n        });\n\n        elementFactory.CreateInspectorFloatField(window, <span class=\"hljs-string\">\"Height\"<\/span>, hoverComponent.Height, (oldValue, <span class=\"hljs-keyword\">new<\/span><span class=\"hljs-type\">Value<\/span>) =&gt;\n        {\n            hoverComponent.Height = <span class=\"hljs-keyword\">new<\/span><span class=\"hljs-type\">Value<\/span>;\n        });\n    }\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"automatic-inspector-generation\">Automatic Inspector Generation<\/h2>\n\n\n\n<p>WorldBuilder provides automatic inspector view generation for common data types:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Integer Fields<\/strong><\/li>\n\n\n\n<li><strong>Float Fields<\/strong><\/li>\n\n\n\n<li><strong>String Fields<\/strong><\/li>\n<\/ul>\n\n\n\n<p>For components that want to expose more complex data types in the editor need to write a custom inspector view. Inheriting from DataComponentInspectorViewBase. In the examples you can find some basic custom inspector views.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"creating-custom-components-a-tutorial\">Creating Custom Components: A Tutorial<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"step-1-define-component-behavior\">Step 1: Define Component Behavior<\/h3>\n\n\n\n<p>Create a new C# script that inherits from <code>DataComponentBase<\/code>. Define serializable properties using <code>[JsonProperty]<\/code> attributes. Implement Unity&#8217;s lifecycle methods (<code>Start()<\/code>, <code>Update()<\/code>) to control behavior.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"step-2-create-inspector-view\">Step 2: Create Inspector View<\/h3>\n\n\n\n<p>Create a corresponding inspector view class that inherits from <code>DataComponentInspectorViewBase<\/code>. Implement the <code>CreateInspectorEntries()<\/code> method to generate UI controls for each property using the appropriate element factory methods.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"step-3-access-unity-libraries\">Step 3: Access Unity Libraries<\/h3>\n\n\n\n<p>Utilize Unity&#8217;s classes and functions (e.g., <code>Vector3<\/code>, <code>Transform<\/code>, <code>Mathf<\/code>, <code>Time<\/code>) for movement, calculations, and object manipulation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"step-4-implement-required-methods\">Step 4: Implement Required Methods<\/h3>\n\n\n\n<p>All components must implement <code>GetAssetReferences()<\/code> and <code>AfterDeserialization()<\/code> methods to conform to the <code>DataComponentBase<\/code> contract.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"component-types-and-applications\">Component Types and Applications<\/h2>\n\n\n\n<p>WorldBuilder&#8217;s example components demonstrate various interaction patterns:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>MyHoverComponent<\/strong>: Creates oscillating vertical movement using sine waves<\/li>\n\n\n\n<li><strong>MyInteractivePulseComponent<\/strong>: Adjusts object scale rhythmically<\/li>\n\n\n\n<li><strong>MyLookAtComponent<\/strong>: Orients objects toward specified targets<\/li>\n\n\n\n<li><strong>MyOrbitComponent<\/strong>: Creates circular movement around target objects<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"advanced-techniques\">Advanced Techniques<\/h2>\n\n\n\n<p>Components can reference other scene objects by name:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;JsonProperty(<span class=\"hljs-string\">\"TargetObjectName\"<\/span>)]\n<span class=\"hljs-keyword\">public<\/span> string TargetObjectName;\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Start<\/span><span class=\"hljs-params\">()<\/span>\n<\/span>{\n    var <span class=\"hljs-keyword\">target<\/span> = GameObject.Find(TargetObjectName);\n    <span class=\"hljs-keyword\">if<\/span> (<span class=\"hljs-keyword\">target<\/span>)\n        m_TargetTransform = <span class=\"hljs-keyword\">target<\/span>.transform;\n}\n<\/code><\/pre>\n\n\n\n<p>This allows for complex interactions between objects in educational scenarios.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction to Runtime Scripting WorldBuilder&#8217;s runtime scripting system enables the creation of custom interactive components directly within the application environment using C# programming language. Technical Framework The runtime scripting implementation in WorldBuilder utilizes C# and the Unity engine&#8217;s core functionality. Components are created following a structured inheritance pattern: Component Structure A runtime component consists of&#8230;<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"footnotes":""},"doc_category":[16],"doc_tag":[],"class_list":["post-894","docs","type-docs","status-publish","hentry","doc_category-world-builder-extensions"],"year_month":"2025-08","word_count":463,"total_views":0,"reactions":{"happy":0,"normal":0,"sad":0},"author_info":{"name":"maximilian.winter","author_nicename":"maximilian-winter","author_url":"https:\/\/www.portalsunited.com:443\/author\/maximilian-winter\/"},"doc_category_info":[{"term_name":"World Builder - Extensions","term_url":"https:\/\/www.portalsunited.com:443\/docs-category\/world-builder-extensions\/"}],"doc_tag_info":[],"_links":{"self":[{"href":"https:\/\/www.portalsunited.com:443\/wp-json\/wp\/v2\/docs\/894","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.portalsunited.com:443\/wp-json\/wp\/v2\/docs"}],"about":[{"href":"https:\/\/www.portalsunited.com:443\/wp-json\/wp\/v2\/types\/docs"}],"author":[{"embeddable":true,"href":"https:\/\/www.portalsunited.com:443\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.portalsunited.com:443\/wp-json\/wp\/v2\/comments?post=894"}],"version-history":[{"count":5,"href":"https:\/\/www.portalsunited.com:443\/wp-json\/wp\/v2\/docs\/894\/revisions"}],"predecessor-version":[{"id":1246,"href":"https:\/\/www.portalsunited.com:443\/wp-json\/wp\/v2\/docs\/894\/revisions\/1246"}],"wp:attachment":[{"href":"https:\/\/www.portalsunited.com:443\/wp-json\/wp\/v2\/media?parent=894"}],"wp:term":[{"taxonomy":"doc_category","embeddable":true,"href":"https:\/\/www.portalsunited.com:443\/wp-json\/wp\/v2\/doc_category?post=894"},{"taxonomy":"doc_tag","embeddable":true,"href":"https:\/\/www.portalsunited.com:443\/wp-json\/wp\/v2\/doc_tag?post=894"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}