{"id":14299,"date":"2026-06-06T20:14:17","date_gmt":"2026-06-06T18:14:17","guid":{"rendered":"https:\/\/store.algosyntax.com\/?post_type=asx-lms-tutorial-cpt&#038;p=14299"},"modified":"2026-06-08T12:07:29","modified_gmt":"2026-06-08T10:07:29","slug":"ue5-upropertymetatitleproperty","status":"publish","type":"asx-lms-tutorial-cpt","link":"https:\/\/store.algosyntax.com\/tutorials\/unreal-engine\/ue5-upropertymetatitleproperty\/","title":{"rendered":"UE5 UPROPERTY|meta=TitleProperty"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"14299\" class=\"elementor elementor-14299\" data-elementor-post-type=\"asx-lms-tutorial-cpt\">\n\t\t\t\t<div class=\"elementor-element elementor-element-dad4696 e-flex e-con-boxed e-con e-parent\" data-id=\"dad4696\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-84e7b72 elementor-widget elementor-widget-text-editor\" data-id=\"84e7b72\" 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 class=\"isSelectedEnd\"><code dir=\"ltr\">TitleProperty<\/code> is a <code dir=\"ltr\">UPROPERTY<\/code> metadata option that improves how arrays of structs appear in the Details panel.<\/p><p>It is commonly used when you have a <code dir=\"ltr\">TArray<\/code> of <code dir=\"ltr\">USTRUCT<\/code> entries and each entry has a name, label, ID, or title field. Instead of showing every collapsed entry as a plain index like <code dir=\"ltr\"><span class=\"text-token-text-primary cursor-text rounded-sm\" data-placeholder-token=\"true\">[0]<\/span><\/code>, <code dir=\"ltr\"><span class=\"text-token-text-primary cursor-text rounded-sm\" data-placeholder-token=\"true\">[1]<\/span><\/code>, or <code dir=\"ltr\"><span class=\"text-token-text-primary cursor-text rounded-sm\" data-placeholder-token=\"true\">[2]<\/span><\/code>, Unreal can display a useful value from inside the struct.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-788f1c6 e-flex e-con-boxed e-con e-parent\" data-id=\"788f1c6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-fbcb48c elementor-widget elementor-widget-heading\" data-id=\"fbcb48c\" 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 problem<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-afec26b elementor-widget elementor-widget-text-editor\" data-id=\"afec26b\" 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 class=\"isSelectedEnd\">Suppose you have an editable array of enemy wave data:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">TArray&lt;FEnemyWaveEntry&gt; WaveEntries;<\/code><\/pre><p class=\"isSelectedEnd\">Without <code dir=\"ltr\">TitleProperty<\/code>, the Details panel may show collapsed rows like this:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">Wave Entries\n  <span class=\"text-token-text-primary cursor-text rounded-sm\" data-placeholder-token=\"true\">[0]<\/span>\n  <span class=\"text-token-text-primary cursor-text rounded-sm\" data-placeholder-token=\"true\">[1]<\/span>\n  <span class=\"text-token-text-primary cursor-text rounded-sm\" data-placeholder-token=\"true\">[2]<\/span><\/code><\/pre><p class=\"isSelectedEnd\">That works, but it is not very readable. You have to expand each entry to know what it represents.<\/p><p>With <code dir=\"ltr\">TitleProperty<\/code>, the same array can display something closer to this:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">Wave Entries\n  <span class=\"text-token-text-primary cursor-text rounded-sm\" data-placeholder-token=\"true\">[0]<\/span> Grunt Wave\n  <span class=\"text-token-text-primary cursor-text rounded-sm\" data-placeholder-token=\"true\">[1]<\/span> Shield Enemy Wave\n  <span class=\"text-token-text-primary cursor-text rounded-sm\" data-placeholder-token=\"true\">[2]<\/span> Boss Wave<\/code><\/pre><p>This makes large editable arrays much easier to scan.<\/p><p>Watch the video to see what I mean exactly.\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-77ded4f elementor-widget elementor-widget-video\" data-id=\"77ded4f\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;youtube_url&quot;:&quot;https:\\\/\\\/youtu.be\\\/qblgfbx9Yjg&quot;,&quot;lazy_load&quot;:&quot;yes&quot;,&quot;video_type&quot;:&quot;youtube&quot;,&quot;controls&quot;:&quot;yes&quot;}\" data-widget_type=\"video.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-wrapper elementor-open-inline\">\n\t\t\t<div class=\"elementor-video\"><\/div>\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-420215e e-flex e-con-boxed e-con e-parent\" data-id=\"420215e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c2aa23c elementor-widget elementor-widget-heading\" data-id=\"c2aa23c\" 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\">Basic example<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-82ad900 elementor-widget elementor-widget-text-editor\" data-id=\"82ad900\" 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 class=\"isSelectedEnd\">First, create a struct with a property that can be used as the row title.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7943ace elementor-widget elementor-widget-code-highlight\" data-id=\"7943ace\" 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-cpp line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-cpp\">\n\t\t\t\t\t<xmp>USTRUCT(BlueprintType)\r\nstruct FEnemyWaveEntry\r\n{\r\n\tGENERATED_BODY()\r\n\r\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category=\"Wave\")\r\n\tFName EntryName;\r\n\r\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category=\"Wave\")\r\n\tTSubclassOf<APawn> EnemyClass;\r\n\r\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category=\"Wave\", meta=(ClampMin=\"1\", UIMin=\"1\"))\r\n\tint32 Count = 1;\r\n\r\n\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category=\"Wave\", meta=(ClampMin=\"0.0\", UIMin=\"0.0\"))\r\n\tfloat SpawnDelay = 0.25f;\r\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\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-062fc58 e-flex e-con-boxed e-con e-parent\" data-id=\"062fc58\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-46bffec elementor-widget elementor-widget-text-editor\" data-id=\"46bffec\" 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 class=\"isSelectedEnd\">Then, on the array property, you add <code data-start=\"1269\" data-end=\"1284\">TitleProperty<\/code>:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0f057c9 elementor-widget elementor-widget-code-highlight\" data-id=\"0f057c9\" 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-cpp line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-cpp\">\n\t\t\t\t\t<xmp>UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=\"Enemy Waves\", meta=(TitleProperty=\"EntryName\"))\r\nTArray<FEnemyWaveEntry> WaveEntries;<\/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\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-baa28cf e-flex e-con-boxed e-con e-parent\" data-id=\"baa28cf\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5d8b1af elementor-widget elementor-widget-text-editor\" data-id=\"5d8b1af\" 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 data-start=\"1437\" data-end=\"1464\">The important part is this:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2bd90cc elementor-widget elementor-widget-code-highlight\" data-id=\"2bd90cc\" 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-cpp line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-cpp\">\n\t\t\t\t\t<xmp>meta=(TitleProperty=\"EntryName\")<\/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\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8e74c7b e-flex e-con-boxed e-con e-parent\" data-id=\"8e74c7b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ec370db elementor-widget elementor-widget-text-editor\" data-id=\"ec370db\" 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 data-start=\"1511\" data-end=\"1666\">This tells Unreal: for each element in <code data-start=\"1550\" data-end=\"1563\">WaveEntries<\/code>, look inside the <code data-start=\"1581\" data-end=\"1598\">FEnemyWaveEntry<\/code> struct and use the <code data-start=\"1618\" data-end=\"1629\">EntryName<\/code> property as the collapsed row title.<\/p><p data-start=\"1668\" data-end=\"1746\"><code data-start=\"1668\" data-end=\"1683\">TitleProperty<\/code> should go on the array, not on the property inside the struct.<\/p><p data-start=\"1748\" data-end=\"1764\">This is correct:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6d2f206 elementor-widget elementor-widget-code-highlight\" data-id=\"6d2f206\" 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-cpp line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-cpp\">\n\t\t\t\t\t<xmp>UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=\"Enemy Waves\", meta=(TitleProperty=\"EntryName\"))\r\nTArray<FEnemyWaveEntry> WaveEntries;<\/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\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-2922a5d e-flex e-con-boxed e-con e-parent\" data-id=\"2922a5d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-742e92e elementor-widget elementor-widget-text-editor\" data-id=\"742e92e\" 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 data-start=\"1511\" data-end=\"1666\">The value you pass to <code data-start=\"2206\" data-end=\"2221\">TitleProperty<\/code> must be the name of a reflected property inside the struct. So this works because <code data-start=\"2304\" data-end=\"2315\">EntryName<\/code> is marked with <code data-start=\"2331\" data-end=\"2342\">UPROPERTY<\/code>:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9c208cb elementor-widget elementor-widget-code-highlight\" data-id=\"9c208cb\" 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-cpp line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-cpp\">\n\t\t\t\t\t<xmp>UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=\"Wave\")\r\nFName EntryName;<\/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\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-d33a64e e-flex e-con-boxed e-con e-parent\" data-id=\"d33a64e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4e467a6 elementor-widget elementor-widget-text-editor\" data-id=\"4e467a6\" 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 data-start=\"2435\" data-end=\"2491\">Good fields for <code data-start=\"2451\" data-end=\"2466\">TitleProperty<\/code> are usually things like:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5136a9a elementor-widget elementor-widget-code-highlight\" data-id=\"5136a9a\" 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-cpp line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-cpp\">\n\t\t\t\t\t<xmp>FName EntryName;\r\nFString DisplayName;\r\nFText EditorLabel;\r\nFName ItemId;<\/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\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-9022478 e-flex e-con-boxed e-con e-parent\" data-id=\"9022478\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6deee09 elementor-widget elementor-widget-text-editor\" data-id=\"6deee09\" 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 data-start=\"2435\" data-end=\"2491\">The main thing to remember is that <code data-start=\"4214\" data-end=\"4229\">TitleProperty<\/code> is only for editor display. It does not change runtime behavior, serialization, replication, or gameplay logic. It simply makes arrays of structs easier to inspect and edit in the Details panel.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"featured_media":0,"template":"","asx-lms-tutorial-categories":[45,58],"asx-lms-tutorial-tags":[141],"class_list":["post-14299","asx-lms-tutorial-cpt","type-asx-lms-tutorial-cpt","status-publish","hentry","asx-lms-tutorial-categories-unreal-engine","asx-lms-tutorial-categories-unreal-c-api","asx-lms-tutorial-tags-uproperty","entry"],"acf":[],"_links":{"self":[{"href":"https:\/\/store.algosyntax.com\/asx-rest\/wp\/v2\/asx-lms-tutorial-cpt\/14299","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":2,"href":"https:\/\/store.algosyntax.com\/asx-rest\/wp\/v2\/asx-lms-tutorial-cpt\/14299\/revisions"}],"predecessor-version":[{"id":14327,"href":"https:\/\/store.algosyntax.com\/asx-rest\/wp\/v2\/asx-lms-tutorial-cpt\/14299\/revisions\/14327"}],"wp:attachment":[{"href":"https:\/\/store.algosyntax.com\/asx-rest\/wp\/v2\/media?parent=14299"}],"wp:term":[{"taxonomy":"asx-lms-tutorial-categories","embeddable":true,"href":"https:\/\/store.algosyntax.com\/asx-rest\/wp\/v2\/asx-lms-tutorial-categories?post=14299"},{"taxonomy":"asx-lms-tutorial-tags","embeddable":true,"href":"https:\/\/store.algosyntax.com\/asx-rest\/wp\/v2\/asx-lms-tutorial-tags?post=14299"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}