<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Qiita記事  &#8211;  ConquestArrow.com</title>
	<atom:link href="https://conquestarrow.com/category/qiita-article/feed/" rel="self" type="application/rss+xml" />
	<link>https://conquestarrow.com</link>
	<description></description>
	<lastBuildDate>Tue, 18 Sep 2018 15:30:40 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://conquestarrow.com/wp-content/uploads/2018/05/cropped-logo-32x32.png</url>
	<title>Qiita記事  &#8211;  ConquestArrow.com</title>
	<link>https://conquestarrow.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>[UE4]Unreal.jsをTypeScriptで書く</title>
		<link>https://qiita.com/ConquestArrow/items/154256d6f882dd942462</link>
		
		<dc:creator><![CDATA[Conquest Arrow]]></dc:creator>
		<pubDate>Sat, 30 Jun 2018 12:45:28 +0000</pubDate>
				<category><![CDATA[Qiita記事]]></category>
		<category><![CDATA[Qiita]]></category>
		<guid isPermaLink="false">http://conquestarrow.com/?guid=926248b518ad78a97b5649c075dec28f</guid>

					<description><![CDATA[

はじめに



 Unreal.jsとは


UnrealEngine上でJavaScriptを動かすことのできるプラグイン
Unreal.js 入門



 TypeScriptとは


JavaScriptの新規格先行取り込み＋静的型付けをしたAltJS
http://qiita.com/tags/TypeScript


👍 Unreal.jsをTypeScriptで書くメリット


Unreal.jsの出力する型定義ファイルを使って実行前型チェックができる


※簡単なエラーはこの時点で...]]></description>
										<content:encoded><![CDATA[

はじめに



 Unreal.jsとは


UnrealEngine上でJavaScriptを動かすことのできるプラグイン
Unreal.js 入門



 TypeScriptとは


JavaScriptの新規格先行取り込み＋静的型付けをしたAltJS
http://qiita.com/tags/TypeScript


👍 Unreal.jsをTypeScriptで書くメリット


Unreal.jsの出力する型定義ファイルを使って実行前型チェックができる


※簡単なエラーはこの時点で...]]></content:encoded>
					
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>[ #UE4 ]Blueprintの関数のピンに説明をつける</title>
		<link>https://qiita.com/ConquestArrow/items/ee730a535c74ca33014c</link>
		
		<dc:creator><![CDATA[Conquest Arrow]]></dc:creator>
		<pubDate>Tue, 20 Jun 2017 15:06:14 +0000</pubDate>
				<category><![CDATA[Qiita記事]]></category>
		<guid isPermaLink="false">http://conquestarrow.com/?guid=68fa3d25f4c05f6b17aed487b1e06244</guid>

					<description><![CDATA[関数のBlueprintの入出力のピン（引数、戻り値）に対してコメント説明を付けられる隠し機能？について。


TL;DR


JavaDoc形式でDescription中に説明がかきこめる
入出力ピンの説明はピンにホバーした時のTooltipに表示されるようになる
多人数で開発する際にちゃんとドキュメント化しておくと迷わなくて便利なのでおすすめ



環境


UE4.16以降


4.14ぐらいから機能自体は実装されているが、クラッシュするバグがある





入出力ピン説明付けられない問題

...]]></description>
										<content:encoded><![CDATA[関数のBlueprintの入出力のピン（引数、戻り値）に対してコメント説明を付けられる隠し機能？について。

<h1>
<span id="tldr" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/ee730a535c74ca33014c#tldr"><i class="fa fa-link"></i></a>TL;DR</h1>

<ul>
<li>JavaDoc形式でDescription中に説明がかきこめる</li>
<li>入出力ピンの説明はピンにホバーした時のTooltipに表示されるようになる</li>
<li>多人数で開発する際にちゃんとドキュメント化しておくと迷わなくて便利なのでおすすめ</li>
</ul>

<h1>
<span id="環境" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/ee730a535c74ca33014c#%E7%92%B0%E5%A2%83"><i class="fa fa-link"></i></a>環境</h1>

<ul>
<li>UE4.16以降

<ul>
<li>4.14ぐらいから機能自体は実装されているが、クラッシュするバグがある</li>
</ul>
</li>
</ul>

<h1>
<span id="入出力ピン説明付けられない問題" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/ee730a535c74ca33014c#%E5%85%A5%E5%87%BA%E5%8A%9B%E3%83%94%E3%83%B3%E8%AA%AC%E6%98%8E%E4%BB%98%E3%81%91%E3%82%89%E3%82%8C%E3%81%AA%E3%81%84%E5%95%8F%E9%A1%8C"><i class="fa fa-link"></i></a>入出力ピン説明付けられない問題</h1>

Blueprintの関数ノードそのものには説明がつけられる欄が用意されているが、入出力ピン（関数的に言えば引数や戻り値）には説明がつける欄が用意されていない。そのため、ピン数が多いノードはどのピンに何をどう繋げばよいのかわかりにくいという難点があった。

今回紹介する方法で説明を追加することで、きちんと入出力ピンに説明を追加し、しかもピンにホバーした時に表示することができるようになる。

<h1>
<span id="説明追加方法" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/ee730a535c74ca33014c#%E8%AA%AC%E6%98%8E%E8%BF%BD%E5%8A%A0%E6%96%B9%E6%B3%95"><i class="fa fa-link"></i></a>説明追加方法</h1>

やりかたは関数BPの説明欄（Description）のテキスト中に、JavaDoc方式でコメントを書き込むことで実現可能。以下のタグが対応している。


  <div id="toc" class="toc tnt-none toc-center tnt-none border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ul class="toc-list open"></li><li><a href="#toc1" tabindex="0">
@param
</a></li><li><a href="#toc2" tabindex="0">
@return/@returns
</a></li><li><a href="#toc3" tabindex="0">
@note/@see
</a></li></ul>
    </div>
  </div>

<h2><span id="toc1">
@param
</span></h2>

<div class="code-frame" data-lang="javadoc"><div class="highlight"><pre>@param [ParamName] ...
</pre></div></div>

<a href="https://camo.qiitausercontent.com/6eaf22733db1e6dbf387d7194af5f67d97a399e3/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f30636361316462312d356239652d376561632d363035352d6330633638303438356661652e706e67"  rel="nofollow noopener"><img width="215" alt="func_param_doc.PNG" src="https://camo.qiitausercontent.com/6eaf22733db1e6dbf387d7194af5f67d97a399e3/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f30636361316462312d356239652d376561632d363035352d6330633638303438356661652e706e67" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/0cca1db1-5b9e-7eac-6055-c0c680485fae.png"></a><a href="https://camo.qiitausercontent.com/9c282c3e705b73913a9b55106391ffc3f90f9e4f/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f65303930616335372d366133652d646334612d633434612d6364303765373564303539662e706e67"  rel="nofollow noopener"><img width="135" alt="func_output_pin_doc.PNG" src="https://camo.qiitausercontent.com/9c282c3e705b73913a9b55106391ffc3f90f9e4f/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f65303930616335372d366133652d646334612d633434612d6364303765373564303539662e706e67" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/e090ac57-6a3e-dc4a-c44a-cd07e75d059f.png"></a>

入力ピン（引数）、および出力ピン（戻り値）の両方のピンに説明を追加することできる。

C系の関数と異なり、Blueprintの関数は複数の戻り値を出力ピンという形で返すことができるが、<code>@param</code>タグも戻り値の説明ができることに注意。

<h2><span id="toc2">
@return/@returns
</span></h2>

<div class="code-frame" data-lang="javadoc"><div class="highlight"><pre>@return ...
</pre></div></div>

<a href="https://camo.qiitausercontent.com/269b21a149ecd9df32ce7c23998f664920e3b277/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f38303331373061632d323933382d396361362d346135612d3737623637316130333535372e706e67"  rel="nofollow noopener"><img width="229" alt="func_return_doc.PNG" src="https://camo.qiitausercontent.com/269b21a149ecd9df32ce7c23998f664920e3b277/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f38303331373061632d323933382d396361362d346135612d3737623637316130333535372e706e67" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/803170ac-2938-9ca6-4a5a-77b671a03557.png"></a>

<strong><code>ReturnValue</code>という名称の</strong> 出力ピンの説明を追加することができる。出力ピンの名称は <strong>固定で複数説明できない</strong> ことに注意。

<h1>
<span id="ノード自体への特別な説明追加方法" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/ee730a535c74ca33014c#%E3%83%8E%E3%83%BC%E3%83%89%E8%87%AA%E4%BD%93%E3%81%B8%E3%81%AE%E7%89%B9%E5%88%A5%E3%81%AA%E8%AA%AC%E6%98%8E%E8%BF%BD%E5%8A%A0%E6%96%B9%E6%B3%95"><i class="fa fa-link"></i></a>ノード自体への特別な説明追加方法</h1>

以下のタグはBPのノード自体への特別な説明表示ができるようになる。

<h2><span id="toc3">
@note/@see
</span></h2>

<div class="code-frame" data-lang="txt">
<div class="code-lang"><span class="bold">description欄のサンプル</span></div>
<div class="highlight"><pre>this is sample 
日本語ドキュメント


@note this is Note!
@see this is see!
</pre></div>
</div>

<a href="https://camo.qiitausercontent.com/3a35e84f52233c8ea054609b319d6b987d858034/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f36356533316436332d393934302d663363662d613433632d3764663535393738326434342e706e67"  rel="nofollow noopener"><img width="293" alt="func_note_see_doc.PNG" src="https://camo.qiitausercontent.com/3a35e84f52233c8ea054609b319d6b987d858034/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f36356533316436332d393934302d663363662d613433632d3764663535393738326434342e706e67" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/65e31d63-9940-f3cf-a43c-7df559782d44.png"></a>

<h1>
<span id="補足説明欄description内での改行" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/ee730a535c74ca33014c#%E8%A3%9C%E8%B6%B3%E8%AA%AC%E6%98%8E%E6%AC%84description%E5%86%85%E3%81%A7%E3%81%AE%E6%94%B9%E8%A1%8C"><i class="fa fa-link"></i></a>補足：説明欄（Description）内での改行</h1>

デフォルトでは1行文しかスペースがないが、Shift+Enterで改行することができる。<br>
もっとも横幅が全角１０文字ぐらいしかないのでテキストエディタ等で入力してコピペしたほうが容易かもしれない。

<h1>
<span id="補足その２bpマクロ" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/ee730a535c74ca33014c#%E8%A3%9C%E8%B6%B3%E3%81%9D%E3%81%AE%EF%BC%92bp%E3%83%9E%E3%82%AF%E3%83%AD"><i class="fa fa-link"></i></a>補足その２：BPマクロ</h1>

BPマクロは残念ながら非対応。この機能がつかえるのは内部的に<code>UK2Node_CallFunction</code>を継承したノードのみ。]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[ #UE4 ]Blueprintでユニットテスト・機能テスト</title>
		<link>https://qiita.com/ConquestArrow/items/31edd670a7a95997b1d4</link>
		
		<dc:creator><![CDATA[Conquest Arrow]]></dc:creator>
		<pubDate>Wed, 29 Mar 2017 16:35:58 +0000</pubDate>
				<category><![CDATA[Qiita記事]]></category>
		<guid isPermaLink="false">http://conquestarrow.com/?guid=a88b6a506c9d565bee9871e71d63a9e3</guid>

					<description><![CDATA[UnrealEngine4(以下UE4）のドキュメントにはオリジナルのテストはC++で書くように書いてあるが実はBlueprint（以下BP）でも書くことができる。やり方を簡単に紹介。


TL;DR



FunctionalTestクラスを継承したBPクラスを作成してテストのBPノードを書く
テスト対象のレベルに上記BPを配置、StandAloneでPlayできるようにしておく
SessionFrontEndで複数のテストやテスト回数をグラフィカルにチェック



環境

4.14以降？ここでは...]]></description>
										<content:encoded><![CDATA[UnrealEngine4(以下UE4）の<a href="https://docs.unrealengine.com/latest/JPN/Programming/Automation/index.html" rel="nofollow noopener" >ドキュメント</a>にはオリジナルのテストはC++で書くように書いてあるが実はBlueprint（以下BP）でも書くことができる。やり方を簡単に紹介。

<h1>
<span id="tldr" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/31edd670a7a95997b1d4#tldr"><i class="fa fa-link"></i></a><i></i>TL;DR</h1>

<ul>
<li>
<code>FunctionalTest</code>クラスを継承したBPクラスを作成してテストのBPノードを書く</li>
<li>テスト対象のレベルに上記BPを配置、StandAloneでPlayできるようにしておく</li>
<li>SessionFrontEndで複数のテストやテスト回数をグラフィカルにチェック</li>
</ul>

<h1>
<span id="環境" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/31edd670a7a95997b1d4#%E7%92%B0%E5%A2%83"><i class="fa fa-link"></i></a><i></i>環境</h1>

4.14以降？ここでは4.15で説明。

<h1>
<span id="やりかた" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/31edd670a7a95997b1d4#%E3%82%84%E3%82%8A%E3%81%8B%E3%81%9F"><i class="fa fa-link"></i></a><i></i>やりかた</h1>


  <div id="toc" class="toc tnt-none toc-center tnt-none border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-3" checked><label class="toc-title" for="toc-checkbox-3">目次</label>
    <div class="toc-content">
    <ul class="toc-list open"></li><li><a href="#toc1" tabindex="0">
①FunctionalTestの子クラス作成</a></li><li><a href="#toc2" tabindex="0">
②テストのBPノードグラフを書く</a><ul><li><a href="#toc3" tabindex="0">
Event Start Testイベントノード</a></li><li><a href="#toc4" tabindex="0">
Finish Testノード</a></li><li><a href="#toc5" tabindex="0">
Event Prepare Testイベントノード</a></li><li><a href="#toc6" tabindex="0">
Set Time Limitノード</a></li></ul></li><li><a href="#toc7" tabindex="0">
③BPをテスト対象のレベルに配置</a></li><li><a href="#toc8" tabindex="0">
④Standaloneで起動できるように設定</a></li><li><a href="#toc9" tabindex="0">
⑤念のためUE4再起動してプロジェクトを開きなおす</a></li><li><a href="#toc10" tabindex="0">
⑦Session FrontEndを開く</a><ul><li><a href="#toc11" tabindex="0">
⑧テストを実行</a></li></ul></li><li><a href="#toc12" tabindex="0">
他TIPS</a><ul><li><a href="#toc13" tabindex="0">
テストを複数回実行する</a></li></ul></li></ul>
    </div>
  </div>

<h2><span id="toc1">
①FunctionalTestの子クラス作成</span></h2>

まずはテストを書くBPクラスを作成する。親クラスは<code>FunctionalTest</code>を指定。

<a href="https://camo.qiitausercontent.com/e7c15a2a7703eef1fb80c3f60706a17813b6eaad/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f34353539623662322d643265342d653037642d613336352d3532366134396162663266312e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/e7c15a2a7703eef1fb80c3f60706a17813b6eaad/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f34353539623662322d643265342d653037642d613336352d3532366134396162663266312e706e67" alt="PickParentClass_FunctionalTest.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/4559b6b2-d2e4-e07d-a365-526a49abf2f1.png"></a>

<h2><span id="toc2">
②テストのBPノードグラフを書く</span></h2>

とりあえずサンプルとしてランダムに0～10の数字を返し、5以上なら成功、未満なら失敗という簡単なユニットテストのようなノードを書いてみる。

<a href="https://camo.qiitausercontent.com/a547889502441d0b49f9053259b32b2721edf045/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f34613633646466302d376432622d323234332d346562642d3836626236623237343539352e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/a547889502441d0b49f9053259b32b2721edf045/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f34613633646466302d376432622d323234332d346562642d3836626236623237343539352e706e67" alt="SimpleUnitTestNode.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/4a63ddf0-7d2b-2243-4ebd-86bb6b274595.png"></a><br>
<a href="https://blueprintue.com/blueprint/hmjyx32n/" rel="nofollow noopener" >code</a>

なお実際のユニットテストとしてならBPの関数などを呼び出す形になるだろう。

以下、重要なノードの説明。

<h3><span id="toc3">
Event Start Testイベントノード</span></h3>

ここからテストの処理が開始する。最終的に<code>Finish Test</code>ノードで終わらないとテストが完了せずにタイムアウトになるので注意。

<h3><span id="toc4">
Finish Testノード</span></h3>

テスト結果を通知して終了するノード。 <strong>テストを書くときに一番大事なノード。</strong> 失敗時にMessageLogに出力するメッセージの設定なども設定できる。

<a href="https://camo.qiitausercontent.com/24e0966977347d859905ae08788f1f67e852b13c/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f32333765663638332d306331352d383635392d613431362d6266636364653761323864372e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/24e0966977347d859905ae08788f1f67e852b13c/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f32333765663638332d306331352d383635392d613431362d6266636364653761323864372e706e67" alt="FinishTestNode.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/237ef683-0c15-8659-a416-bfccde7a28d7.png"></a>

Test Result入力ピンの<code>Succeeded</code>, <code>Failed</code>あたりはよく使うことになるはず。

<h3><span id="toc5">
Event Prepare Testイベントノード</span></h3>

テスト開始前に呼ばれるイベントノード。テスト前にやっておきたい処理を書いておく。

<h3><span id="toc6">
Set Time Limitノード</span></h3>

タイムアウトになるまでの時間や、タイムアウトを何とみなすかの設定をするノード。これがなくてもタイムアウトで失敗になる。

<a href="https://camo.qiitausercontent.com/ec9113045b9f27f012cd57aafb87b7de7dfd87f1/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f32353732366133612d346537362d653064372d613939372d3766386535643930383031332e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/ec9113045b9f27f012cd57aafb87b7de7dfd87f1/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f32353732366133612d346537362d653064372d613939372d3766386535643930383031332e706e67" alt="SetTimeLimitNode.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/25726a3a-4e76-e0d7-a997-7f8e5d908013.png"></a>

<h2><span id="toc7">
③BPをテスト対象のレベルに配置</span></h2>

<a href="https://camo.qiitausercontent.com/52bfab90ff8df7cfe7ca55f61288cd336a04965a/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f66303631386436362d323138642d313031322d383733632d3638343034326532643165352e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/52bfab90ff8df7cfe7ca55f61288cd336a04965a/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f66303631386436362d323138642d313031322d383733632d3638343034326532643165352e706e67" alt="TestOnMap.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/f0618d66-218d-1012-873c-684042e2d1e5.png"></a>

レベルに配置すると、専用の3D Widget付きで表示される。<br>
配置しなくてもよい方法もあるかもしれないが不明。

<h2><span id="toc8">
④Standaloneで起動できるように設定</span></h2>

<a href="https://camo.qiitausercontent.com/f00858e4f17f4301f8ef11b6f5a6d2b2a5dfc22c/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f35376331653331632d326635632d353863392d383230622d3533636565373362646264352e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/f00858e4f17f4301f8ef11b6f5a6d2b2a5dfc22c/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f35376331653331632d326635632d353863392d383230622d3533636565373362646264352e706e67" alt="PlayStandalone.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/57c1e31c-2f5c-58c9-820b-53cee73bdbd5.png"></a>

この後SessionFrontEndを使うために必要。いったん起動しておいてもよい。

<h2><span id="toc9">
⑤念のためUE4再起動してプロジェクトを開きなおす</span></h2>

そのままではSession FrontEndからTestを実行できなかった。<br>
プロジェクトを開く直すだけでもよいかもしれない？

<h2><span id="toc10">
⑦Session FrontEndを開く</span></h2>

<a href="https://camo.qiitausercontent.com/8d1ed6d6602f5641bb8ca7d66964bff866aff63d/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f62343030303135632d366138612d633632302d623734362d3632623138343061636334312e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/8d1ed6d6602f5641bb8ca7d66964bff866aff63d/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f62343030303135632d366138612d633632302d623734362d3632623138343061636334312e706e67" alt="OpenSessionFrontEnd.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/b400015c-6a8a-c620-b746-62b1840acc41.png"></a>

Window &gt; Developer Tools &gt; Session FrontEnd

ウィンドウが開いたら、左側の<code>This Application</code>のセッションを選択。<br>
Automatinタブのテスト一覧に、先ほど作成したBPクラス（例では<code>MyFunctionalTest</code>）が表示されればOK。

<a href="https://camo.qiitausercontent.com/0f5001f063ae9128697defc96b6a11e2939923f6/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f38303631383835362d303935372d353334662d326530372d6437383734623566666431632e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/0f5001f063ae9128697defc96b6a11e2939923f6/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f38303631383835362d303935372d353334662d326530372d6437383734623566666431632e706e67" alt="ActivateSessionFrontend.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/80618856-0957-534f-2e07-d7874b5ffd1c.png"></a>

※なお表示されない場合はPlayしたり、UE4開きなおしたり、しばらく待ったりすることで表示される。セッションが張られないと一覧に出てこないようである。

<h3><span id="toc11">
⑧テストを実行</span></h3>

Session FrontEndのウィンドウからStart Testsボタンを押してテストを実行する。<br>
実行するとウィンドウでゲームが起動しつつ、テストの結果がグラフィカルに表示されてゆく。

<a href="https://camo.qiitausercontent.com/3490c955ddf6ad8e560ab1d51be4d9ea79caf2cf/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f31616138346336342d333235342d326466302d626635332d3338663434326534306637322e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/3490c955ddf6ad8e560ab1d51be4d9ea79caf2cf/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f31616138346336342d333235342d326466302d626635332d3338663434326534306637322e706e67" alt="Result1.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/1aa84c64-3254-2df0-bf53-38f442e40f72.png"></a>

上記は１つだけだが、複数ある場合は複数の結果が一覧で表示される。

<h2><span id="toc12">
他TIPS</span></h2>

<h3><span id="toc13">
テストを複数回実行する</span></h3>

Start Testsボタンの横の▼から実行回数を増やすことができる。

<a href="https://camo.qiitausercontent.com/e6dd1f8d67fe23c3f2e942dbe20f4dd845cbee29/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f61393430633262312d616534332d336139642d653334352d3032373033383831313961342e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/e6dd1f8d67fe23c3f2e942dbe20f4dd845cbee29/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f61393430633262312d616534332d336139642d653334352d3032373033383831313961342e706e67" alt="10Times.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/a940c2b1-ae43-3a9d-e345-0270388119a4.png"></a>

サンプルコードのように毎回結果が違う場合は複数回テストを回してみてどうなるかをみることができる。

<h1>
<span id="参考" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/31edd670a7a95997b1d4#%E5%8F%82%E8%80%83"><i class="fa fa-link"></i></a>参考</h1>

<ul>
<li><a href="https://docs.unrealengine.com/latest/JPN/Programming/Automation/index.html" rel="nofollow noopener" >自動化システムの概要</a></li>
<li><a href="http://historia.co.jp/archives/689" rel="nofollow noopener" >[UE4] 自動テストツールの使い方</a></li>
<li><a href="https://www.youtube.com/watch?v=f4LpDXjFgVQ" rel="nofollow noopener" >Tutorial: Automated Functional Testing in Blueprints in UE 4.14</a></li>
</ul>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>BlueprintのFormatTextノードの使い方 #UE4</title>
		<link>https://qiita.com/ConquestArrow/items/ad842281f925348d61ee</link>
		
		<dc:creator><![CDATA[Conquest Arrow]]></dc:creator>
		<pubDate>Thu, 02 Mar 2017 16:53:34 +0000</pubDate>
				<category><![CDATA[Qiita記事]]></category>
		<guid isPermaLink="false">http://conquestarrow.com/?guid=df4c36446e9ad17f9c464d316128da55</guid>

					<description><![CDATA[UnrealEngine4(以下、UE4）では文字列型が3つあるが、ユーザーにUIなどで表示して見せる文字列はText型であるべきとされている。このText型の文字列の一部を置き換えたり加工したりするのに使えるのがFormatTextノードだ。




TL;DR


UE4でユーザーに見せる文字列はText型である必要がある

Text型の利点を損なうことなく、加工をするのに必要なのが FormatTextノード

具体的には文字列内での変数展開ができる

String型を加工して使っちゃダメ

...]]></description>
										<content:encoded><![CDATA[UnrealEngine4(以下、UE4）では<a href="https://docs.unrealengine.com/latest/JPN/Programming/UnrealArchitecture/StringHandling/index.html" rel="nofollow noopener" >文字列型が3つある</a>が、ユーザーにUIなどで表示して見せる文字列は<code>Text</code>型であるべきとされている。このText型の文字列の一部を置き換えたり加工したりするのに使えるのが<strong><a href="https://docs.unrealengine.com/latest/INT/BlueprintAPI/Utilities/Text/FormatText/index.html" rel="nofollow noopener" >FormatTextノード</a></strong>だ。

<a href="https://camo.qiitausercontent.com/224985761beae901c561454cc505ce00ef4cfb51/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f34663035336562302d366331642d353562362d643261392d6330323839333238343433392e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/224985761beae901c561454cc505ce00ef4cfb51/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f34663035336562302d366331642d353562362d643261392d6330323839333238343433392e706e67" alt="FT_normal.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/4f053eb0-6c1d-55b6-d2a9-c02893284439.png"></a>

<h1>
<span id="tldr" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/ad842281f925348d61ee#tldr"><i class="fa fa-link"></i></a>TL;DR</h1>

<ul>
<li>UE4でユーザーに見せる文字列は<code>Text</code>型である必要がある</li>
<li>
<code>Text</code>型の利点を損なうことなく、加工をするのに必要なのが <strong>FormatTextノード</strong>
</li>
<li>具体的には<strong>文字列内での変数展開</strong>ができる</li>
<li>
<code>String</code>型を加工して使っちゃダメ</li>
</ul>

<h1>
<span id="なんでtext型を使うの" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/ad842281f925348d61ee#%E3%81%AA%E3%82%93%E3%81%A7text%E5%9E%8B%E3%82%92%E4%BD%BF%E3%81%86%E3%81%AE"><i class="fa fa-link"></i></a>なんで<code>Text</code>型を使うの？</h1>

<ul>
<li>
<strong>どこに散らばっていてもgatherできる</strong>

<ul>
<li><a href="http://qiita.com/go_astrayer/items/9f6b2eae57c9d7c8efc1#%E6%8A%BD%E5%87%BA%E5%85%83%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B" id="reference-0a4b9b1c098835610245">localization dashboardのGatherで横断して収集できる</a></li>
<li>UMG内, LevelBP, ClassBP, WidgetBP, それらの各種パラメータなどバイナリのアセットファイルを横断して収集する</li>
<li>本来は翻訳用だが、誤植修正や一括置換に使うこともできる</li>
<li>バイナリアセット内に含まれることが多いUE4では大きな利点</li>
</ul>
</li>
<li>UMGで文字列表示は原則<code>Text</code>型のみ

<ul>
<li>むりやりキャストすることもできるが、前述の利点がない</li>
</ul>
</li>
</ul>

<h1>
<span id="formattextノードの使い方" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/ad842281f925348d61ee#formattext%E3%83%8E%E3%83%BC%E3%83%89%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9"><i class="fa fa-link"></i></a>FormatTextノードの使い方</h1>


  <div id="toc" class="toc tnt-none toc-center tnt-none border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ul class="toc-list open"></li><li><a href="#toc1" tabindex="0">
文字列内で数字の引数を指定する</a></li><li><a href="#toc2" tabindex="0">
文字列内で名前つき引数を指定する</a></li><li><a href="#toc3" tabindex="0">
Formatピンにノードをつないだ後に +Add Pin</a></li></ul>
    </div>
  </div>

<h2><span id="toc1">
文字列内で数字の引数を指定する</span></h2>

文字フォーム内の文字列に<code>{0}</code>といった記法で記入する。<br>
記入後確定すると、数字の名前の付いた引数ピンがノードに追加される。

<a href="https://camo.qiitausercontent.com/d9198d68741e463c66d9e32a88d25ff0a5b2f50d/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f36383566313337632d663538632d633932372d333663342d3730356331343337323930612e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/d9198d68741e463c66d9e32a88d25ff0a5b2f50d/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f36383566313337632d663538632d633932372d333663342d3730356331343337323930612e706e67" alt="FT_number_params.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/685f137c-f58c-c927-36c4-705c1437290a.png"></a>

引数ピンは<code>Wildcard</code>型で以下の型が引数として許される。

<ul>
<li>数値：<code>Byte</code>, <code>Integer</code>, <code>Float</code>
</li>
<li>文字列： <code>Text</code>
</li>
<li>Enum: <code>ETextGender</code>
</li>
</ul>

<h2><span id="toc2">
文字列内で名前つき引数を指定する</span></h2>

文字フォーム内の文字列に<code>{param}</code>といった記法で記入する。<br>
記入後確定すると、その<code>param</code>という名前の引数の入力ピンが追加される。

<a href="https://camo.qiitausercontent.com/498c9b55602669cfbff4898d2f0a35cdfab79583/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f62663764643735652d623739392d663439642d326533382d3330626639313363663034632e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/498c9b55602669cfbff4898d2f0a35cdfab79583/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f62663764643735652d623739392d663439642d326533382d3330626639313363663034632e706e67" alt="FT_named_param.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/bf7dd75e-b799-f49d-2e38-30bf913cf04c.png"></a>

他の挙動も数字の引数と同じ。<br>
マジックナンバーを防止する意味ではこちらのほうが良いかも。

<h2><span id="toc3">
Formatピンにノードをつないだ後に +Add Pin</span></h2>

まずは引数を含んだ<code>Text</code>文字列を用意する（<code>Text</code>型の変数のデフォルト値や<code>MakeLiteralText</code>ノードで）。これを<code>Format</code>ピンにつなぐ。

<a href="https://camo.qiitausercontent.com/fdd3696aa840da1c00f91711986e20121d4af87b/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f38663436643836322d366261392d623861312d663039302d3532316330313339366234642e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/fdd3696aa840da1c00f91711986e20121d4af87b/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f38663436643836322d366261392d623861312d663039302d3532316330313339366234642e706e67" alt="FT_addpin_01.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/8f46d862-6ba9-b8a1-f090-521c01396b4d.png"></a>

すると<code>+Add Pin</code>ボタンが増えるのでクリックして入力ピンを増やす。

<a href="https://camo.qiitausercontent.com/c15337456bfb3bee3105bb6056a27d712ced9d6d/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f34613732633864382d343739632d346432362d626636612d3436323132363235353936372e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/c15337456bfb3bee3105bb6056a27d712ced9d6d/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f34613732633864382d343739632d346432362d626636612d3436323132363235353936372e706e67" alt="FT_addpin_02.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/4a72c8d8-479c-4d26-bf6a-462126255967.png"></a>

そのままでは<code>0</code>という名前の入力ピンで<code>{0}</code>以外は置き換えできないのでDetailsパネルで引数名（ピン名）を変更する。

<a href="https://camo.qiitausercontent.com/b24f5e7eb23f81392f8f8b81f01f2d399bc2578f/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f61383231323566392d303531612d343865312d353339302d6263623337353335376439642e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/b24f5e7eb23f81392f8f8b81f01f2d399bc2578f/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f61383231323566392d303531612d343865312d353339302d6263623337353335376439642e706e67" alt="FT_addpin_03.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/a82125f9-051a-48e1-5390-bcb375357d9d.png"></a>

この方法は手間は多いが文字列の中身にかかわらずピンを増やすことができる。

<h1>
<span id="まとめ" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/ad842281f925348d61ee#%E3%81%BE%E3%81%A8%E3%82%81"><i class="fa fa-link"></i></a>まとめ</h1>

<a href="https://camo.qiitausercontent.com/76c17793f1e8473f08aa92494f876b9bb9cc95df/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f64303062643537352d366332352d353633382d643763392d6138306137313134316135322e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/76c17793f1e8473f08aa92494f876b9bb9cc95df/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f64303062643537352d366332352d353633382d643763392d6138306137313134316135322e706e67" alt="FT_Sample.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/d00bd575-6c25-5638-d7c9-a80a71141a52.png"></a><br>
<a href="https://camo.qiitausercontent.com/3c34bc1d283e51262a039883dbeee2bac15a4890/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f32626665393262612d633539392d323936662d346161382d3637653638333464643338372e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/3c34bc1d283e51262a039883dbeee2bac15a4890/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f32626665393262612d633539392d323936662d346161382d3637653638333464643338372e706e67" alt="FT_print_text.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/2bfe92ba-c599-296f-4aa8-67e6834dd387.png"></a>

<h1>
<span id="参考" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/ad842281f925348d61ee#%E5%8F%82%E8%80%83"><i class="fa fa-link"></i></a>参考</h1>

<ul>
<li><a href="https://docs.unrealengine.com/latest/JPN/Gameplay/Localization/Formatting/index.html" rel="nofollow noopener" >ユーザーに表示するテキストの書式設定</a></li>
</ul>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[UE4]Blueprintの関数のpureとconstの違い</title>
		<link>https://qiita.com/ConquestArrow/items/de893fb706f334a12ea9</link>
		
		<dc:creator><![CDATA[Conquest Arrow]]></dc:creator>
		<pubDate>Fri, 10 Feb 2017 16:18:40 +0000</pubDate>
				<category><![CDATA[Qiita記事]]></category>
		<guid isPermaLink="false">http://conquestarrow.com/?guid=2a2eac2ed4d43e5a05008e6e5d2ba6e4</guid>

					<description><![CDATA[

初めに結論



pureはドキュメントとは異なりクラスのメンバーを変更可能

constならばクラスのメンバーを変更できない
実行ピンを消すのはpure, constは変わらない



説明

Blueprintの関数にはpureのオプションとconstのオプションがある。

pureのオプションを有効にするとそのBPの関数は「純粋関数」となるとドキュメントでは説明されている。


関数は 純粋関数 または 非純粋関数 のどちらかになります。両者の大きな違いは、純粋関数がステートやクラスのメン...]]></description>
										<content:encoded><![CDATA[<h1>
<span id="初めに結論" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/de893fb706f334a12ea9#%E5%88%9D%E3%82%81%E3%81%AB%E7%B5%90%E8%AB%96"><i class="fa fa-link"></i></a>初めに結論</h1>

<ul>
<li>
<code>pure</code>はドキュメントとは異なりクラスのメンバーを変更可能</li>
<li>
<code>const</code>ならばクラスのメンバーを変更できない</li>
<li>実行ピンを消すのは<code>pure</code>, <code>const</code>は変わらない</li>
</ul>

<h1>
<span id="説明" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/de893fb706f334a12ea9#%E8%AA%AC%E6%98%8E"><i class="fa fa-link"></i></a>説明</h1>

Blueprintの関数にはpureのオプションとconstのオプションがある。

pureのオプションを有効にするとそのBPの関数は「純粋関数」となるとドキュメントでは説明されている。

<blockquote>
関数は 純粋関数 または 非純粋関数 のどちらかになります。両者の大きな違いは、純粋関数がステートやクラスのメンバーを一切変更しないのに対し、 非純粋関数はステートを自由に変更します。純粋関数は通常、データ値を出力するだけの getter 関数や演算子に使用されます。 <br>
<a href="https://docs.unrealengine.com/latest/JPN/Engine/Blueprints/UserGuide/Functions/index.html#%E7%B4%94%E7%B2%8B%E9%96%A2%E6%95%B0%E3%81%A8%E9%9D%9E%E7%B4%94%E7%B2%8B%E9%96%A2%E6%95%B0" class="autolink" rel="nofollow noopener" >https://docs.unrealengine.com/latest/JPN/Engine/Blueprints/UserGuide/Functions/index.html#純粋関数と非純粋関数</a>
</blockquote>

一方、constのオプションは普段は隠されており、ドキュメント中には明確な説明はない。

<a href="https://camo.qiitausercontent.com/38812f07d0e5816a3a226e5a5ce953015398678e/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f65366331626162352d333233622d343030332d383263612d3731363063363863653830382e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/38812f07d0e5816a3a226e5a5ce953015398678e/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f65366331626162352d333233622d343030332d383263612d3731363063363863653830382e706e67" alt="option_setting_details.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/e6c1bab5-323b-4003-82ca-7160c68ce808.png"></a>


  <div id="toc" class="toc tnt-none toc-center tnt-none border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-5" checked><label class="toc-title" for="toc-checkbox-5">目次</label>
    <div class="toc-content">
    <ul class="toc-list open"></li><li><a href="#toc1" tabindex="0">
比較表</a></li><li><a href="#toc2" tabindex="0">
メンバーの変更</a></li><li><a href="#toc3" tabindex="0">
Selfへの参照入力pin</a></li></ul>
    </div>
  </div>

<h2><span id="toc1">
比較表</span></h2>

挙動を調べると以下のような違いがある。

<table>
<thead>
<tr>
<th style="text-align: center"></th>
<th style="text-align: center">通常</th>
<th style="text-align: center">pure</th>
<th style="text-align: center">const</th>
<th style="text-align: center">pure &amp; const</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center">sample</td>
<td style="text-align: center"><a href="https://camo.qiitausercontent.com/5b42f8a6e9f8b41cf45437c5d76d270617650315/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f32636666306265662d653632312d366634652d396437362d6233366231643063346330662e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/5b42f8a6e9f8b41cf45437c5d76d270617650315/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f32636666306265662d653632312d366634652d396437362d6233366231643063346330662e706e67" alt="normal_fn.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/2cff0bef-e621-6f4e-9d76-b36b1d0c4c0f.png"></a></td>
<td style="text-align: center"><a href="https://camo.qiitausercontent.com/e4833d1654d0b56727fb67e09c40cc9b38ac251b/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f66666637386361612d653334322d343539652d363064612d6466386433643261333433612e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/e4833d1654d0b56727fb67e09c40cc9b38ac251b/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f66666637386361612d653334322d343539652d363064612d6466386433643261333433612e706e67" alt="pure_fn.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/fff78caa-e342-459e-60da-df8d3d2a343a.png"></a></td>
<td style="text-align: center"><a href="https://camo.qiitausercontent.com/f2910a80869045ecbb62b613225ea92ff8a744f7/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f63363565313433322d363337332d653239302d333731312d3137303965303033316137342e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/f2910a80869045ecbb62b613225ea92ff8a744f7/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f63363565313433322d363337332d653239302d333731312d3137303965303033316137342e706e67" alt="const_fn.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/c65e1432-6373-e290-3711-1709e0031a74.png"></a></td>
<td style="text-align: center"><a href="https://camo.qiitausercontent.com/b2eb97c6aed258866905188e5c31da0725cfee3d/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f62313231653035312d333139322d656135612d383333352d3934366231323565343732382e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/b2eb97c6aed258866905188e5c31da0725cfee3d/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f62313231653035312d333139322d656135612d383333352d3934366231323565343732382e706e67" alt="constpure_fn.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/b121e051-3192-ea5a-8335-946b125e4728.png"></a></td>
</tr>
<tr>
<td style="text-align: center">実行ピン</td>
<td style="text-align: center">あり</td>
<td style="text-align: center">なし</td>
<td style="text-align: center">あり</td>
<td style="text-align: center">なし</td>
</tr>
<tr>
<td style="text-align: center">メンバーの変更</td>
<td style="text-align: center">可能</td>
<td style="text-align: center">可能</td>
<td style="text-align: center">不可</td>
<td style="text-align: center">不可</td>
</tr>
<tr>
<td style="text-align: center">Selfへの参照入力pin <br>(除くBP関数ライブラリ)</td>
<td style="text-align: center">あり</td>
<td style="text-align: center">なし</td>
<td style="text-align: center">あり</td>
<td style="text-align: center">あり</td>
</tr>
</tbody>
</table>

<h2><span id="toc2">
メンバーの変更</span></h2>

たとえば関数の中身が以下のようなグラフとする。<br>
※<code>param</code>はクラスのprivateメンバー変数<br>
<a href="https://camo.qiitausercontent.com/20a05d756771c895d6ca33418a2c1c7a52a54f53/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f61323537313561612d313865392d316132352d313066652d6238636566336337663530332e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/20a05d756771c895d6ca33418a2c1c7a52a54f53/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f61323537313561612d313865392d316132352d313066652d6238636566336337663530332e706e67" alt="code.PNG" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/a25715aa-18e9-1a25-10fe-b8cef3c7f503.png"></a>

pureを設定した場合、返り値の値は変更後の値が返ってくる。

一方、constを設定すると、そもそもこのグラフはコンパイルできない。

<div class="code-frame" data-lang="text"><div class="highlight"><pre>Error Variable  param  is read-only within this context and cannot be set to a new value
</pre></div></div>

<h2><span id="toc3">
Selfへの参照入力pin</span></h2>

クラスBPやLvBPで関数を作成すると、通常はデフォルトが<code>Self</code>を指すObjectリファレンス型の入力ピン（引数）が自動でノードにつく。

<code>pure</code>を設定すると<code>Self</code>入力ピンはつかないが、<code>const</code>を設定した場合はつく。両方設定した場合は<code>const</code>が優先となって入力ピンがつく。

※Blueprint関数ライブラリの関数を除く

<h1>
<span id="まとめ" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/de893fb706f334a12ea9#%E3%81%BE%E3%81%A8%E3%82%81"><i class="fa fa-link"></i></a>まとめ</h1>

<ul>
<li>BPの純粋関数は実はクラスのメンバーを変更可能</li>
<li>変えられなくするためにはconstをつける</li>
<li>pureは主に実行ピンの有り無し、selfへの参照入力ピンの有無に影響</li>
</ul>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>型定義で`typeof T`したくなった時は {new ():T}</title>
		<link>https://qiita.com/ConquestArrow/items/ace6d926b7e89b8f92d9</link>
		
		<dc:creator><![CDATA[Conquest Arrow]]></dc:creator>
		<pubDate>Sat, 21 Jan 2017 08:29:24 +0000</pubDate>
				<category><![CDATA[Qiita記事]]></category>
		<guid isPermaLink="false">http://conquestarrow.com/?guid=3997e5beb90d127b1f46a84d6a1793f4</guid>

					<description><![CDATA[型定義でジェネリクスの型変数Tを使いつつ、インスタンス化する前のTそのもの1を定義するときのTIPS。

以前の記事で型クエリと組み合わせられたらなあ(typeof T)と書いていた。

同様に思う人は多かったらしく、いつの間にかTypeScriptの公式WIKIのFAQにやり方が書いてあった。
オブジェクトリテラル型の 型表現で {new ():T} とすればよい らしい。

function create&#60;T&#62;(ctor: { new(): T }) {
    return new...]]></description>
										<content:encoded><![CDATA[型定義でジェネリクスの型変数Tを使いつつ、インスタンス化する前のTそのもの<sup id="fnref1"><a href="https://qiita.com/ConquestArrow/items/ace6d926b7e89b8f92d9#fn1" rel="footnote" title="何と呼べばいいのか。">1</a></sup>を定義するときのTIPS。

<a href="http://qiita.com/ConquestArrow/items/e85ea06ac14ab39e94fa" id="reference-9458481cc8881d5a01d1">以前の記事で型クエリと組み合わせられたらなあ(<code>typeof T</code>)</a>と書いていた。

同様に思う人は多かったらしく、いつの間にかTypeScriptの公式WIKIのFAQにやり方が書いてあった。<br>
オブジェクトリテラル型の <strong>型表現で <code>{new ():T}</code> とすればよい</strong> らしい。

<div class="code-frame" data-lang="ts"><div class="highlight"><pre><span class="kd">function</span> <span class="nx">create</span><span class="o">&lt;</span><span class="nx">T</span><span class="o">&gt;</span><span class="p">(</span><span class="nx">ctor</span><span class="p">:</span> <span class="p">{</span> <span class="k">new</span><span class="p">():</span> <span class="nx">T</span> <span class="p">})</span> <span class="p">{</span>
    <span class="k">return</span> <span class="k">new</span> <span class="nx">ctor</span><span class="p">();</span>
<span class="p">}</span>
<span class="kd">var</span> <span class="nx">c</span> <span class="o">=</span> <span class="nx">create</span><span class="p">(</span><span class="nx">MyClass</span><span class="p">);</span> <span class="c1">// c: MyClass</span>
</pre></div></div>

出典：<a href="https://github.com/Microsoft/TypeScript/wiki/FAQ#why-cant-i-write-typeof-t-new-t-or-instanceof-t-in-my-generic-function" rel="nofollow noopener" >Why can't I write typeof T, new T, or instanceof T in my generic function?</a>

厳密にやるなら次のissueに紹介されていた方法もある。

<div class="code-frame" data-lang="ts"><div class="highlight"><pre><span class="cm">/** Generic class type. */</span>
<span class="nx">type</span> <span class="nx">Constructor</span><span class="o">&lt;</span><span class="nx">T</span><span class="o">&gt;</span> <span class="o">=</span> <span class="p">{</span> <span class="k">new</span> <span class="p">(...</span><span class="na">args</span><span class="p">:</span> <span class="nx">any</span><span class="p">[]):</span> <span class="nx">T</span> <span class="p">}</span> <span class="o">|</span> <span class="p">((...</span><span class="nx">args</span><span class="p">:</span> <span class="nx">any</span><span class="p">[])</span> <span class="o">=&gt;</span> <span class="nx">T</span><span class="p">)</span> <span class="o">|</span> <span class="nb">Function</span><span class="p">;</span>
</pre></div></div>

<a href="https://github.com/Microsoft/TypeScript/issues/204#issuecomment-257722306" class="autolink" rel="nofollow noopener" >https://github.com/Microsoft/TypeScript/issues/204#issuecomment-257722306</a>

<div class="footnotes">
<hr>
<ol>

<li id="fn1">
何と呼べばいいのか。 <a href="https://qiita.com/ConquestArrow/items/ace6d926b7e89b8f92d9#fnref1">↩</a>
</li>

</ol>
</div>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[UE4]Unreal.jsでUE4のエディタ拡張を作る</title>
		<link>https://qiita.com/ConquestArrow/items/85481de046f1922555dc</link>
		
		<dc:creator><![CDATA[Conquest Arrow]]></dc:creator>
		<pubDate>Sun, 04 Dec 2016 15:02:35 +0000</pubDate>
				<category><![CDATA[Qiita記事]]></category>
		<guid isPermaLink="false">http://conquestarrow.com/?guid=909bf7c41c4ce83048802a2e8e54f0bb</guid>

					<description><![CDATA[この記事は裏 Unreal Engine 4 (UE4) Advent Calendar 2016の5日目の記事です。


はじめに

UnrealEngine4(UE4)はUnity3D(Unity)に比べるとエディタ拡張が作りにくい。Unityの場合、通常のゲームのコードを書くときと同じC# or UnityScriptで特別な環境がなくても書ける。一方、UE4の場合はVisualStudioかXcodeでUnreal C++で書かないといけない。

UE4でエディタ拡張をやりたい場合、「エディ...]]></description>
										<content:encoded><![CDATA[この記事は<a href="http://qiita.com/advent-calendar/2016/ue4_inside">裏 Unreal Engine 4 (UE4) Advent Calendar 2016</a>の5日目の記事です。

<h1>
<span id="はじめに" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/85481de046f1922555dc#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB"><i class="fa fa-link"></i></a>はじめに</h1>

UnrealEngine4(UE4)はUnity3D(Unity)に比べるとエディタ拡張が作りにくい。Unityの場合、通常のゲームのコードを書くときと同じC# or UnityScriptで特別な環境がなくても書ける。一方、UE4の場合はVisualStudioかXcodeでUnreal C++で書かないといけない。

UE4でエディタ拡張をやりたい場合、「エディタに新機能を付ける」というよりも「 <strong>効率の良い処理を便利なUIでやりたい</strong> 」という需要が多いのではないか <sup id="fnref1"><a href="https://qiita.com/ConquestArrow/items/85481de046f1922555dc#fn1" rel="footnote" title="UE4の場合、機能追加はエンジンのソースに手を入れればよいので。">1</a></sup> 。そしてその需要があるのはプログラマはもちろん、アーティストやゲームデザイナなどのノンプログラマも同じである。

ノンプログラマにVisualStudioやXcodeの環境はふつうはまずない。C++というのも敷居が高い。BlutilityはBPで書けるって？いやー、あれUI自由に作れないし、そもそもしばらくメンテされてないよね～。

そんなあなたに福音となるかもしれないのが、<strong><a href="https://github.com/ncsoft/Unreal.js" rel="nofollow noopener" >Unreal.js</a>でエディタ拡張を書く</strong> というアプローチだ。

参考：<a href="http://qiita.com/ConquestArrow/items/bb81ad5e63cf6bc4e549" id="reference-ea8371485df1b94d1145">Unreal.js 入門</a>

<h1>
<span id="エディタ拡張テンプレ" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/85481de046f1922555dc#%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E6%8B%A1%E5%BC%B5%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC"><i class="fa fa-link"></i></a>エディタ拡張テンプレ</h1>

<div class="code-frame" data-lang="js">
<div class="code-lang"><span class="bold">エディタ拡張のテンプレcode</span></div>
<div class="highlight"><pre><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">main</span><span class="p">(){</span>
    <span class="kd">const</span> <span class="nx">UMG</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">"UMG"</span><span class="p">);</span>
    <span class="kd">const</span> <span class="nx">I</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'instantiator'</span><span class="p">);</span>
    <span class="kd">const</span> <span class="nx">EMaker</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">"editor-maker"</span><span class="p">);</span>

    <span class="c1">//menu group settings</span>
    <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nb">global</span><span class="p">.</span><span class="nx">editorGroup</span><span class="p">){</span>
        <span class="nb">global</span><span class="p">.</span><span class="nx">editorGroup</span> <span class="o">=</span> <span class="nx">JavascriptWorkspaceItem</span><span class="p">.</span><span class="nx">AddGroup</span><span class="p">(</span><span class="nx">JavascriptWorkspaceItem</span><span class="p">.</span><span class="nx">GetGroup</span><span class="p">(</span><span class="s2">"Root"</span><span class="p">),</span> <span class="s2">"Samples"</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="c1">//Editor window with tab simple template</span>
    <span class="nx">EMaker</span><span class="p">.</span><span class="nx">tabSpawner</span><span class="p">(</span>
        <span class="p">{</span>
            <span class="na">DisplayName</span><span class="p">:</span><span class="s2">"Simple Tab Win"</span><span class="p">,</span>
            <span class="na">TabId</span><span class="p">:</span> <span class="s2">"SimpleTabWin@"</span><span class="p">,</span>
            <span class="na">Role</span><span class="p">:</span> <span class="nx">EJavascriptTabRole</span><span class="p">.</span><span class="nx">MajorTab</span><span class="p">,</span>
            <span class="na">Group</span><span class="p">:</span> <span class="nb">global</span><span class="p">.</span><span class="nx">editorGroup</span>
        <span class="p">},</span>
        <span class="p">()</span> <span class="o">=&gt;</span> <span class="nx">I</span><span class="p">(</span><span class="nx">UMG</span><span class="p">.</span><span class="nx">text</span><span class="p">({},</span><span class="s2">"test"</span><span class="p">))</span>
    <span class="p">)</span>

    <span class="c1">//deconstructor</span>
    <span class="k">return</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>

    <span class="p">};</span>
<span class="p">}</span>
</pre></div>
</div>

メニュー &gt; Window &gt; Samples &gt; Simple Tab Win に追加される。

<a href="https://camo.qiitausercontent.com/460b6b7ca7257c50a90bedb6a25f5df880768ec8/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f36376535666163332d376533632d366637302d303039642d3538303866343763326438332e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/460b6b7ca7257c50a90bedb6a25f5df880768ec8/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f36376535666163332d376533632d366637302d303039642d3538303866343763326438332e706e67" alt="Template_Tabspawner_SampleTabWin.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/67e5fac3-7e3c-6f70-009d-5808f47c2d83.png"></a>

生成されるのはタブが一つあるウィンドウ。

<a href="https://camo.qiitausercontent.com/220b47958632579e57c5ceb6206c060a6ed2b82a/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f35356335313666352d663739622d363162312d613334302d3166336634353163313137322e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/220b47958632579e57c5ceb6206c060a6ed2b82a/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f35356335313666352d663739622d363162312d613334302d3166336634353163313137322e706e67" alt="SampleTabWin.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/55c516f5-f79b-61b1-a340-1f3f451c1172.png"></a>

<ul>
<li><a href="https://github.com/ConquestArrow/UnrealJSEditorExtSamples/blob/master/Content/Scripts/extension-SimpleTabWin.js" rel="nofollow noopener" >sample code</a></li>
</ul>

これをひな型に作るのが容易。

※エディタ拡張制作中は<code>bootstrap.js</code>を持ってきて、live-reload対応の処理を入れておくとなお便利。

<div class="code-frame" data-lang="js">
<div class="code-lang"><span class="bold">コードの最後に追加してmain関数をここでexportするように書き換えておく</span></div>
<div class="highlight"><pre><span class="c1">// bootstrap to initiate live-reloading dev env.</span>
<span class="k">try</span> <span class="p">{</span>
    <span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
        <span class="kd">let</span> <span class="nx">cleanup</span> <span class="o">=</span> <span class="kc">null</span>

        <span class="c1">// wait for map to be loaded.</span>
        <span class="nx">process</span><span class="p">.</span><span class="nx">nextTick</span><span class="p">(()</span> <span class="o">=&gt;</span> <span class="nx">cleanup</span> <span class="o">=</span> <span class="nx">main</span><span class="p">());</span>

        <span class="c1">// live-reloadable function should return its cleanup function</span>
        <span class="k">return</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="nx">cleanup</span><span class="p">()</span>
    <span class="p">}</span>
<span class="p">}</span>
<span class="k">catch</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">require</span><span class="p">(</span><span class="s1">'bootstrap'</span><span class="p">)(</span><span class="s1">'extension-Button'</span><span class="p">)</span>
<span class="p">}</span>
</pre></div>
</div>

<h1>
<span id="基本的な作り方" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/85481de046f1922555dc#%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E4%BD%9C%E3%82%8A%E6%96%B9"><i class="fa fa-link"></i></a>基本的な作り方</h1>

Unreal.jsにはエディタ拡張作成に便利なライブラリが同梱されているのでそれを使う<sup id="fnref2"><a href="https://qiita.com/ConquestArrow/items/85481de046f1922555dc#fn2" rel="footnote" title="もちろん、APIを一つ一つたたくことで作成することもできるが">2</a></sup>。

<ol>
<li>ファイル名を <code>extension-*.js</code> で作成</li>
<li>GUI部品は同梱ライブラリの <code>UMG.js</code> を使って設定</li>
<li>UMG.jsで作ったものは <code>instantiator.js</code> で有効化</li>
<li>ウィンドウやタブ、メニュー登録などは <code>editor-maker.js</code>で設定</li>
<li>
<code>JavascriptEditorLibrary</code>や<code>JavascriptEditorEngineLibrary</code>などのAPIでエディタの機能にアクセス</li>
<li>処理自体はJSで書く</li>
</ol>

ドキュメントは不足しているので、<a href="http://qiita.com/ConquestArrow/items/fa7560d8fa7aa03553e5" id="reference-7f85b43ccb88bad64007">Unreal.jsの型定義ファイルを再生成してAPIを調べやすくする</a>で紹介した方法で<code>ue.d.ts</code>を更新し、コード補完が効くようにしておくのがおすすめ。

<h1>
<span id="ui編" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/85481de046f1922555dc#ui%E7%B7%A8"><i class="fa fa-link"></i></a>UI編</h1>

UE4のエディタUIはSlateでできているが、UMGはSlateを継承しているので、UMG.jsでSlateもUMGも扱える。

公式Wiki: <a href="https://github.com/ncsoft/Unreal.js/wiki/UMG-widgets" rel="nofollow noopener" >UMG widgets</a>


  <div id="toc" class="toc tnt-none toc-center tnt-none border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-7" checked><label class="toc-title" for="toc-checkbox-7">目次</label>
    <div class="toc-content">
    <ul class="toc-list open"></li><li><a href="#toc1" tabindex="0">
レイアウト</a><ul><li><a href="#toc2" tabindex="0">
UMG.div()
</a></li><li><a href="#toc3" tabindex="0">
UMG.span()
</a></li><li><a href="#toc4" tabindex="0">
スロットのサイズルール</a></li><li><a href="#toc5" tabindex="0">
タブ・パネルのレイアウト</a></li></ul></li><li><a href="#toc6" tabindex="0">
テキスト</a><ul><li><a href="#toc7" tabindex="0">
UMG.text({}, "text")
</a></li></ul></li><li><a href="#toc8" tabindex="0">
画像</a></li><li><a href="#toc9" tabindex="0">
ボタン</a></li><li><a href="#toc10" tabindex="0">
リスト</a></li><li><a href="#toc11" tabindex="0">
PropertyEditor</a></li><li><a href="#toc12" tabindex="0">
タブ</a><ul><li><a href="#toc13" tabindex="0">
タブの種類</a></li><li><a href="#toc14" tabindex="0">
複数のタブ</a></li><li><a href="#toc15" tabindex="0">
タブレイアウト</a></li></ul></li><li><a href="#toc16" tabindex="0">
メニュー</a></li><li><a href="#toc17" tabindex="0">
ユーザーウィジェットをUIとして使う</a></li><li><a href="#toc18" tabindex="0">
その他</a></li><li><a href="#toc19" tabindex="0">
UIのトリガーイベント</a><ul><li><a href="#toc20" tabindex="0">
$link, $unlink
</a></li><li><a href="#toc21" tabindex="0">
UI毎のトリガーイベント</a></li></ul></li><li><a href="#toc22" tabindex="0">
選択中のアクターインスタンスを取得する</a></li><li><a href="#toc23" tabindex="0">
UE4 API</a><ul><li><a href="#toc24" tabindex="0">
JavascriptEditorLibrary</a></li><li><a href="#toc25" tabindex="0">
JavascriptEditorEngineLibrary</a></li><li><a href="#toc26" tabindex="0">
Javascript*クラス</a></li></ul></li><li><a href="#toc27" tabindex="0">
Unreal.js同梱</a><ul><li><a href="#toc28" tabindex="0">
fs.js
</a></li><li><a href="#toc29" tabindex="0">
UMG.js
</a></li><li><a href="#toc30" tabindex="0">
instantiator.js</a></li><li><a href="#toc31" tabindex="0">
editor-maker.js
</a></li></ul></li></ul>
    </div>
  </div>

<h2><span id="toc1">
レイアウト</span></h2>

<h3><span id="toc2">
UMG.div()
</span></h3>

<code>VerticalBox</code>を作成する。HTMLのdiv要素のように<sup id="fnref3"><a href="https://qiita.com/ConquestArrow/items/85481de046f1922555dc#fn3" rel="footnote" title="正確にはもちろんHTMLのdiv/spanは縦横の並びは固定ではない。">3</a></sup>、子要素を縦方向に持つことができる。

<div class="code-frame" data-lang="js">
<div class="code-lang"><span class="bold">使い方</span></div>
<div class="highlight"><pre><span class="nx">UMG</span><span class="p">.</span><span class="nx">div</span><span class="p">({</span><span class="err">【オプションの</span><span class="nb">Object</span><span class="err">】</span><span class="p">},</span> <span class="p">...</span><span class="nx">children</span><span class="p">)</span>
</pre></div>
</div>

オプションに指定できるのは<code>VerticalBox</code>およびそれの先祖クラスのプロパティが指定できる。

<h3><span id="toc3">
UMG.span()
</span></h3>

<code>HorizontalBox</code>を作成する。HTMLのspan要素のように<sup id="fnref3"><a href="https://qiita.com/ConquestArrow/items/85481de046f1922555dc#fn3" rel="footnote" title="正確にはもちろんHTMLのdiv/spanは縦横の並びは固定ではない。">3</a></sup>、子要素を横方向に持つことができる。

<div class="code-frame" data-lang="js">
<div class="code-lang"><span class="bold">使い方</span></div>
<div class="highlight"><pre><span class="nx">UMG</span><span class="p">.</span><span class="nx">span</span><span class="p">({</span><span class="err">【オプションの</span><span class="nb">Object</span><span class="err">】</span><span class="p">},</span> <span class="p">...</span><span class="nx">children</span><span class="p">)</span>
</pre></div>
</div>

オプションに指定できるのは<code>HorizontalBox</code>およびそれの先祖クラスのプロパティが指定できる。

<h3><span id="toc4">
スロットのサイズルール</span></h3>

UMG/Slateには「<a href="https://docs.unrealengine.com/latest/JPN/Engine/UMG/UserGuide/Slots/index.html" rel="nofollow noopener" >スロット</a>」があり、Unreal.jsでUIを設定する際にもUMG.jsのオプションやプロパティ経由で設定できる。

レイアウトにかかわるスロットのサイズルールは<code>ESlateSizeRule</code>というEnumがあるのでそれで指定可能。

<div class="code-frame" data-lang="js"><div class="highlight"><pre><span class="nx">UMG</span><span class="p">.</span><span class="nx">div</span><span class="p">(</span>
  <span class="p">{</span>
    <span class="c1">//オプションでの設定</span>
    <span class="na">Slot</span><span class="p">:{</span><span class="na">Size</span><span class="p">:{</span><span class="na">Value</span><span class="p">:</span><span class="mi">10</span><span class="p">,</span> <span class="na">SizeRule</span><span class="p">:</span><span class="nx">ESlateSizeRule</span><span class="p">.</span><span class="nx">Fill</span><span class="p">}},</span>
    <span class="c1">//入れ子が面倒な時は以下の方法でも設定可能</span>
    <span class="s2">"slot.size.size-rule"</span><span class="p">:</span><span class="nx">ESlateSizeRule</span><span class="p">.</span><span class="nx">Fill</span><span class="p">,</span>
    <span class="c1">//...</span>
  <span class="p">},</span>
  <span class="c1">//...</span>
<span class="p">)</span>
</pre></div></div>

<h3><span id="toc5">
タブ・パネルのレイアウト</span></h3>

ある程度複雑な複数のタブやパネルをもつエディタ拡張を作る場合には、上記までの簡易な方法ではなく<code>JavascriptEditorTabManager</code>に対してJSONフォーマットをパラメータに与える形になる。詳細は<a href="https://qiita.com/ConquestArrow/items/85481de046f1922555dc#%E3%82%BF%E3%83%96%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88">後述</a>。

<h2><span id="toc6">
テキスト</span></h2>

<a href="https://github.com/ConquestArrow/UnrealJSEditorExtSamples/blob/master/Content/Scripts/extension-Text.js" rel="nofollow noopener" >sample code</a>

<h3><span id="toc7">
UMG.text({}, "text")
</span></h3>

<code>TextBlock</code>を生成する、UMG.jsのメソッド。ショートハンドメソッドになっており、<code>UMG(TextBlock,{Text:"text"})</code>のシュガーシンタックスである。

<a href="https://camo.qiitausercontent.com/c5801764d944e124e4cfff0e97ad88dea5e989ce/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f30333361386634302d346361612d316136302d306337312d6135663864383233633639362e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/c5801764d944e124e4cfff0e97ad88dea5e989ce/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f30333361386634302d346361612d316136302d306337312d6135663864383233633639362e706e67" alt="UMG_text.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/033a8f40-4caa-1a60-0c71-a5f8d823c696.png"></a>

<div class="code-frame" data-lang="js"><div class="highlight"><pre><span class="nx">UMG</span><span class="p">.</span><span class="nx">div</span><span class="p">(</span>
    <span class="p">{},</span>
    <span class="nx">UMG</span><span class="p">.</span><span class="nx">text</span><span class="p">({},</span><span class="s2">"text"</span><span class="p">),</span>
    <span class="nx">UMG</span><span class="p">(</span><span class="nx">TextBlock</span><span class="p">,{</span><span class="na">Text</span><span class="p">:</span><span class="s2">"text"</span><span class="p">})</span>
<span class="p">)</span>
</pre></div></div>

なお、エディタ拡張用にはデフォルトのフォントが大きすぎるので小さいフォントを設定しておくとよい。

<div class="code-frame" data-lang="js"><div class="highlight"><pre><span class="c1">//エディタ組み込みのフォントにアクセスするために取得</span>
<span class="kd">const</span> <span class="nx">GEngine</span> <span class="o">=</span> <span class="nx">Root</span><span class="p">.</span><span class="nx">GetEngine</span><span class="p">();</span>

<span class="c1">//フォント：SmallFont、サイズ10が大体エディタ拡張の通常のフォントサイズ</span>
<span class="nx">UMG</span><span class="p">.</span><span class="nx">text</span><span class="p">({</span><span class="na">Font</span><span class="p">:{</span><span class="na">FontObject</span><span class="p">:</span><span class="nx">GEngine</span><span class="p">.</span><span class="nx">SmallFont</span><span class="p">,</span><span class="na">Size</span><span class="p">:</span><span class="mi">10</span><span class="p">}},</span><span class="s2">"text"</span><span class="p">);</span>
</pre></div></div>

<a href="https://camo.qiitausercontent.com/74c3f3ad1ea4b857895ee104cf2a3aae8b83c3ef/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f39383535643830622d353433642d376561622d663034662d6361373165663639393537372e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/74c3f3ad1ea4b857895ee104cf2a3aae8b83c3ef/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f39383535643830622d353433642d376561622d663034662d6361373165663639393537372e706e67" alt="UMG_fonts.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/9855d80b-543d-7eab-f04f-ca71ef699577.png"></a>

<ul>
<li><a href="https://github.com/ConquestArrow/UnrealJSEditorExtSamples/blob/master/Content/Scripts/extension-Text.js" rel="nofollow noopener" >sample code</a></li>
</ul>

なお、文字入力系は<code>EditableTextBox</code>などを使用する。

<h2><span id="toc8">
画像</span></h2>

<a href="https://camo.qiitausercontent.com/0614983adce76e3eea1a6749cc5845d86efb395d/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f62363439333339332d666137352d643864662d356338342d3630303362396631323034322e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/0614983adce76e3eea1a6749cc5845d86efb395d/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f62363439333339332d666137352d643864662d356338342d3630303362396631323034322e706e67" alt="Image_sample.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/b6493393-fa75-d8df-5c84-6003b9f12042.png"></a>

<div class="code-frame" data-lang="js"><div class="highlight"><pre><span class="nx">UMG</span><span class="p">.</span><span class="nx">span</span><span class="p">(</span>
    <span class="p">{},</span>
    <span class="nx">UMG</span><span class="p">(</span><span class="nx">UImage</span><span class="p">,</span>
    <span class="p">{</span>
        <span class="na">Brush</span><span class="p">:{</span>
            <span class="na">ImageSize</span><span class="p">:{</span><span class="na">X</span><span class="p">:</span><span class="mi">248</span><span class="p">,</span><span class="na">Y</span><span class="p">:</span><span class="mi">138</span><span class="p">},</span>
            <span class="na">ResourceObject</span><span class="p">:</span><span class="nx">UObject</span><span class="p">.</span><span class="nx">Load</span><span class="p">(</span><span class="s2">"/Game/Image"</span><span class="p">)</span>
        <span class="p">}</span>
    <span class="p">})</span>
<span class="p">)</span>
</pre></div></div>

<code>VerticalBox</code>直下に置くと、エディタUI上のデフォルトだと引き延ばされるので注意。

なお、<code>UMG.img()</code>というショートハンドメソッドもある。

<div class="code-frame" data-lang="js"><div class="highlight"><pre><span class="nx">UMG</span><span class="p">.</span><span class="nx">img</span><span class="p">({</span><span class="na">Brush</span><span class="p">:{</span><span class="na">ResourceObject</span><span class="p">:</span><span class="nx">UObject</span><span class="p">.</span><span class="nx">Load</span><span class="p">(</span><span class="s2">"/Game/Image"</span><span class="p">)}})</span>
</pre></div></div>

<ul>
<li><a href="https://github.com/ConquestArrow/UnrealJSEditorExtSamples/blob/master/Content/Scripts/extension-Image.js" rel="nofollow noopener" >sample code</a></li>
</ul>

<h2><span id="toc9">
ボタン</span></h2>

いわゆる普通のボタン。

<a href="https://camo.qiitausercontent.com/6be8b5569460488df7c57c580cdd5b4073af4ec9/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f63646664393865612d343364302d313764332d316234382d3063366534326236346438622e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/6be8b5569460488df7c57c580cdd5b4073af4ec9/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f63646664393865612d343364302d313764332d316234382d3063366534326236346438622e706e67" alt="Button_default.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/cdfd98ea-43d0-17d3-1b48-0c6e42b64d8b.png"></a>

<div class="code-frame" data-lang="js"><div class="highlight"><pre><span class="nx">UMG</span><span class="p">(</span><span class="nx">Button</span><span class="p">,{},</span><span class="s2">"default button"</span><span class="p">)</span>
</pre></div></div>

何も設定しないとフォントがでかく、パネルいっぱいに広がるので実際には調整することになるだろう。

<a href="https://camo.qiitausercontent.com/c0b8df6aa37ef8d9e8b80bc66f335c62fc9f1c84/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f39343665326338382d663530662d363463382d366438632d3964383262306466366664382e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/c0b8df6aa37ef8d9e8b80bc66f335c62fc9f1c84/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f39343665326338382d663530662d363463382d366438632d3964383262306466366664382e706e67" alt="Button_decotext.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/946e2c88-f50f-64c8-6d8c-9d82b0df6fd8.png"></a>

<div class="code-frame" data-lang="js"><div class="highlight"><pre><span class="kd">const</span> <span class="nx">GEngine</span> <span class="o">=</span> <span class="nx">Root</span><span class="p">.</span><span class="nx">GetEngine</span><span class="p">();</span>
<span class="kd">const</span> <span class="nx">btnFColor</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">LinearColor</span><span class="p">()</span>
    <span class="nx">btnFColor</span><span class="p">.</span><span class="nx">R</span> <span class="o">=</span> <span class="nx">btnFColor</span><span class="p">.</span><span class="nx">G</span> <span class="o">=</span> <span class="nx">btnFColor</span><span class="p">.</span><span class="nx">B</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="nx">btnFColor</span><span class="p">.</span><span class="nx">A</span> <span class="o">=</span> <span class="mi">100</span><span class="p">;</span>

<span class="c1">//simple button with font decoration</span>
<span class="nx">UMG</span><span class="p">(</span><span class="nx">Button</span><span class="p">,{</span><span class="na">ColorAndOpacity</span><span class="p">:</span><span class="nx">btnFColor</span><span class="p">},</span><span class="nx">UMG</span><span class="p">.</span><span class="nx">text</span><span class="p">({</span><span class="na">Font</span><span class="p">:{</span><span class="na">FontObject</span><span class="p">:</span><span class="nx">GEngine</span><span class="p">.</span><span class="nx">SmallFont</span><span class="p">,</span><span class="na">Size</span><span class="p">:</span><span class="mi">10</span><span class="p">}},</span><span class="s2">"decorated text button"</span><span class="p">))</span>
</pre></div></div>

<ul>
<li><a href="https://github.com/ConquestArrow/UnrealJSEditorExtSamples/blob/master/Content/Scripts/extension-Button.js" rel="nofollow noopener" >sample code</a></li>
</ul>

<h2><span id="toc10">
リスト</span></h2>

<code>JavascriptListView</code>

<a href="https://camo.qiitausercontent.com/998914be26c98c6966e3ffbc9b84030bf15a42fc/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f62373230313062612d656461352d663431642d653339642d6535653032363530646535332e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/998914be26c98c6966e3ffbc9b84030bf15a42fc/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f62373230313062612d656461352d663431642d653339642d6535653032363530646535332e706e67" alt="ListView_Sample.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/b72010ba-eda5-f41d-e39d-e5e02650de53.png"></a>

<code>OnGenerateRowEvent</code>プロパティの中でリスト項目を設定する。リスト項目は<code>UObject</code>である必要があるのでuclass.jsで<code>Struct</code>を作って渡す。

<div class="code-frame" data-lang="js">
<div class="code-lang"><span class="bold">リストの表示データ</span></div>
<div class="highlight"><pre>    <span class="kd">class</span> <span class="nx">A</span><span class="cm">/* Struct */</span><span class="p">{</span>
        <span class="nx">ctor</span><span class="p">(){</span>
            <span class="k">this</span><span class="p">.</span><span class="nx">desc</span> <span class="o">=</span> <span class="s2">"A desc"</span>
            <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="s2">"A"</span>
        <span class="p">}</span>
        <span class="nx">properties</span><span class="p">(){</span>
            <span class="k">this</span><span class="p">.</span><span class="nx">desc</span> <span class="cm">/* String */</span>
            <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="cm">/* String */</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="kd">class</span> <span class="nx">B</span><span class="cm">/* Struct */</span><span class="p">{</span>
        <span class="nx">ctor</span><span class="p">(){</span>
            <span class="k">this</span><span class="p">.</span><span class="nx">desc</span> <span class="o">=</span> <span class="s2">"B desc"</span>
            <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="s2">"B"</span>
        <span class="p">}</span>
        <span class="nx">properties</span><span class="p">(){</span>
            <span class="k">this</span><span class="p">.</span><span class="nx">desc</span> <span class="cm">/* String */</span>
            <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="cm">/* String */</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="kd">let</span> <span class="nx">data</span> <span class="o">=</span> <span class="p">[</span>
        <span class="k">new</span> <span class="p">(</span><span class="nx">UClass</span><span class="p">()(</span><span class="nb">global</span><span class="p">,</span> <span class="nx">A</span><span class="p">)),</span>
        <span class="k">new</span> <span class="p">(</span><span class="nx">UClass</span><span class="p">()(</span><span class="nb">global</span><span class="p">,</span> <span class="nx">B</span><span class="p">)),</span>
    <span class="p">]</span>
</pre></div>
</div>

公式のサンプルにはJSONからUObjectのデータをまとめて作成する <a href="https://github.com/ncsoft/Unreal.js/blob/3f3cd4bfa65769089855b403289c9893aa27b4e9/Examples/Content/Scripts/json2u.js" rel="nofollow noopener" >json2u.js</a> というライブラリもあるので数がある場合はこれを使うのもよいだろう。

<div class="code-frame" data-lang="js">
<div class="code-lang"><span class="bold">表示設定箇所</span></div>
<div class="highlight"><pre><span class="nx">OnGenerateRowEvent</span><span class="p">:</span> <span class="p">(</span><span class="nx">item</span><span class="p">,</span> <span class="nx">column</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="kd">let</span> <span class="nx">s</span> <span class="o">=</span> <span class="s2">""</span>
    <span class="k">switch</span><span class="p">(</span><span class="nx">column</span><span class="p">){</span>
        <span class="k">case</span> <span class="s2">"Name"</span><span class="p">:</span>
            <span class="nx">s</span> <span class="o">=</span> <span class="nx">item</span> <span class="p">?</span> <span class="nx">item</span><span class="p">.</span><span class="nx">name</span> <span class="p">:</span> <span class="nx">column</span><span class="p">;</span>
            <span class="k">break</span><span class="p">;</span>
        <span class="k">case</span> <span class="s2">"Desc"</span><span class="p">:</span>
            <span class="nx">s</span> <span class="o">=</span> <span class="nx">item</span> <span class="p">?</span> <span class="nx">item</span><span class="p">.</span><span class="nx">desc</span> <span class="p">:</span> <span class="nx">column</span><span class="p">;</span>
            <span class="k">break</span><span class="p">;</span>
        <span class="nl">default</span><span class="p">:</span>
            <span class="nx">s</span> <span class="o">=</span> <span class="s2">"default"</span>
    <span class="p">}</span>

    <span class="kd">let</span> <span class="nx">design</span> <span class="o">=</span> 
        <span class="nx">UMG</span><span class="p">(</span><span class="nx">JavascriptTextBlock</span><span class="p">,</span>
            <span class="p">{</span>
                <span class="na">Font</span> <span class="p">:</span> <span class="p">{</span>
                    <span class="na">FontObject</span> <span class="p">:</span> <span class="nx">GEngine</span><span class="p">.</span><span class="nx">SmallFont</span><span class="p">,</span>
                    <span class="na">Size</span> <span class="p">:</span> <span class="mi">10</span>
                <span class="p">},</span>
                <span class="na">Text</span> <span class="p">:</span> <span class="nx">s</span>
            <span class="p">}</span>
        <span class="p">)</span>
    <span class="k">return</span> <span class="nx">I</span><span class="p">(</span><span class="nx">design</span><span class="p">)</span>
<span class="p">},</span>
</pre></div>
</div>

なお、3項演算子で設定している個所があるのは、最初はリストのヘッダー部分で<code>item</code>が<code>undefined</code>で返ってくるからである。

<ul>
<li><a href="https://github.com/ConquestArrow/UnrealJSEditorExtSamples/blob/master/Content/Scripts/extension-List.js" rel="nofollow noopener" >sample code</a></li>
</ul>

<h2><span id="toc11">
PropertyEditor</span></h2>

Detailsパネルの中身。

<a href="https://camo.qiitausercontent.com/8e0a43212dca9e4037da323075301dfe5d782a02/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f64643236633762302d613731632d353635302d303939622d3632373237633933636464622e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/8e0a43212dca9e4037da323075301dfe5d782a02/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f64643236633762302d613731632d353635302d303939622d3632373237633933636464622e706e67" alt="PropertyEditorSample.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/dd26c7b0-a71c-5650-099b-62727c93cddb.png"></a>

表示内容はプロパティを見たいものを直接渡すか、見せたいUPROPERTYを定義したUClassを作って渡す必要がある。<br>
→参考： <a href="http://qiita.com/ConquestArrow/items/6c1eac9226aeb5ce2794" id="reference-2769f97a550f24fe1b44">[UE4]Unreal.jsでJSのコードに型とフラグ情報を付与する</a>

<div class="code-frame" data-lang="js">
<div class="code-lang"><span class="bold">見せたいプロパティを定義したクラス</span></div>
<div class="highlight"><pre><span class="c1">//PropertyEditor showing props</span>
<span class="kd">class</span> <span class="nx">ShowProps</span><span class="p">{</span>
    <span class="nx">ctor</span><span class="p">(){</span>
        <span class="c1">//default value set </span>

        <span class="k">this</span><span class="p">.</span><span class="nx">myInt</span> <span class="o">=</span> <span class="mi">123</span><span class="p">;</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">myFloat</span> <span class="o">=</span> <span class="mf">987.6</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="nx">properties</span><span class="p">(){</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">myBoolean</span> <span class="cm">/* EditAnywhere+bool */</span><span class="p">;</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">myInt</span> <span class="cm">/* EditAnywhere+Int */</span><span class="p">;</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">myFloat</span> <span class="cm">/* EditAnywhere+float */</span><span class="p">;</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">myIntArray</span> <span class="cm">/* EditAnywhere+Int[] */</span><span class="p">;</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">myString</span> <span class="cm">/* EditAnywhere+String */</span><span class="p">;</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">myVector2d</span> <span class="cm">/* EditAnywhere+Vector2D */</span><span class="p">;</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">myVector</span> <span class="cm">/* EditAnywhere+Vector */</span><span class="p">;</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">myActor</span> <span class="cm">/* EditAnywhere+Actor */</span><span class="p">;</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">myColor</span> <span class="cm">/* EditAnywhere+Color */</span><span class="p">;</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">someProp</span> <span class="cm">/* EditAnywhere+Category:MyCategory+DisplayName:My Prop Name+int */</span><span class="p">;</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">advancedProp</span> <span class="cm">/* EditAnywhere+Category:MyCategory+AdvancedDisplay+Color */</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="kd">let</span> <span class="nx">UShowProps</span> <span class="o">=</span> <span class="nx">UClass</span><span class="p">()(</span><span class="nb">global</span><span class="p">,</span> <span class="nx">ShowProps</span><span class="p">)</span>
<span class="kd">let</span> <span class="nx">ushowProp</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">UShowProps</span><span class="p">();</span>
</pre></div>
</div>

<div class="code-frame" data-lang="js">
<div class="code-lang"><span class="bold">PropertyEditorのコア処理</span></div>
<div class="highlight"><pre><span class="nx">UMG</span><span class="p">(</span><span class="nx">PropertyEditor</span><span class="p">,</span>
<span class="p">{</span>
    <span class="na">OnChange</span><span class="p">:(</span><span class="nx">propertyName</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
        <span class="c1">//...</span>
    <span class="p">},</span>
    <span class="na">$link</span><span class="p">:(</span><span class="nx">elem</span><span class="p">)</span><span class="o">=&gt;</span><span class="p">{</span>
        <span class="nx">elem</span><span class="p">.</span><span class="nx">SetObject</span><span class="p">(</span><span class="nx">ushowProp</span><span class="p">)</span>
        <span class="nx">elem</span><span class="p">.</span><span class="nx">updateData</span> <span class="o">=</span> <span class="nx">_</span> <span class="o">=&gt;</span> <span class="p">{</span>
            <span class="nx">elem</span><span class="p">.</span><span class="nx">SetObject</span><span class="p">(</span><span class="nx">ushowProp</span><span class="p">)</span>
        <span class="p">}</span>
    <span class="p">},</span>
    <span class="na">$unlink</span><span class="p">:(</span><span class="nx">elem</span><span class="p">)</span> <span class="o">=&gt;</span><span class="p">{</span>
        <span class="c1">//...</span>
    <span class="p">}</span>
<span class="p">})</span>
</pre></div>
</div>

<ul>
<li><a href="https://github.com/ConquestArrow/UnrealJSEditorExtSamples/blob/master/Content/Scripts/extension-PropertyEditor.js" rel="nofollow noopener" >sample code</a></li>
</ul>

<h2><span id="toc12">
タブ</span></h2>

<a href="https://camo.qiitausercontent.com/17571945138eb5081f71795fc77d197806f681c9/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f65366464653035342d363338372d383033382d346662632d3933623036343233393234362e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/17571945138eb5081f71795fc77d197806f681c9/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f65366464653035342d363338372d383033382d346662632d3933623036343233393234362e706e67" alt="Tabs_sample.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/e6dde054-6387-8038-4fbc-93b064239246.png"></a>

タブ自体は<code>JavascriptEditorTab</code>のインスタンス。editor-maker.jsに簡単に生成できる<code>tab()</code>メソッドがあるのでそれを使うと便利。

<div class="code-frame" data-lang="js">
<div class="code-lang"><span class="bold">最低限のタブのサンプル</span></div>
<div class="highlight"><pre><span class="kd">const</span> <span class="nx">EMaker</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">"editor-maker"</span><span class="p">)</span>
<span class="kd">let</span> <span class="nx">tab</span> <span class="o">=</span> <span class="nx">EMaker</span><span class="p">.</span><span class="nx">tab</span><span class="p">(</span>
            <span class="p">{</span>
                <span class="na">TabId</span><span class="p">:</span><span class="s2">"Tab"</span><span class="p">,</span>
                <span class="na">Role</span><span class="p">:</span><span class="nx">EJavascriptTabRole</span><span class="p">.</span><span class="nx">NamadTab</span><span class="p">,</span>
                <span class="na">DisplayName</span><span class="p">:</span><span class="s2">"Tab"</span>
            <span class="p">},</span>
            <span class="p">()</span><span class="o">=&gt;</span><span class="p">{</span>
                <span class="k">return</span> <span class="nx">I</span><span class="p">(</span><span class="nx">UMG</span><span class="p">.</span><span class="nx">text</span><span class="p">({},</span><span class="s2">"text"</span><span class="p">))</span>
            <span class="p">}</span>
<span class="p">);</span>
</pre></div>
</div>

<ul>
<li><a href="https://github.com/ConquestArrow/UnrealJSEditorExtSamples/blob/master/Content/Scripts/extension-Tabs.js" rel="nofollow noopener" >sample code</a></li>
</ul>

<h3><span id="toc13">
タブの種類</span></h3>

<code>EJavascriptTabRole</code>には4種類あるが、見た目上は2種類しかない。

<ul>
<li>
<code>MajorTab</code> : 基本的なタブで、パネルとしてドッキングはできない。</li>
<li>
<code>NomadTab</code> : 他のNomadTabの四隅にドッキングしたり、タブを隠してパネル化できる。</li>
<li>
<code>DocumentTab</code>, <code>PanelTab</code> : 見た目・機能的には<code>NomadTab</code>と同じ？意味的に使い分けるのかもしれない。</li>
</ul>

<h3><span id="toc14">
複数のタブ</span></h3>

複数タブを表示させるにはそのままではなく<code>JavascriptEditorTabManager</code>を使い、レイアウトやタブの設定等を行う。

<div class="code-frame" data-lang="js"><div class="highlight"><pre>    <span class="kd">let</span> <span class="nx">tabManager</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">JavascriptEditorTabManager</span><span class="p">(</span><span class="nx">JavascriptLibrary</span><span class="p">.</span><span class="nx">CreatePackage</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span><span class="s1">'/Script/Javascript'</span><span class="p">))</span>
    <span class="nx">tabManager</span><span class="p">.</span><span class="nx">Tabs</span> <span class="o">=</span> <span class="p">[</span><span class="nx">tab</span><span class="p">,</span> <span class="cm">/* ... */</span><span class="p">]</span>
    <span class="nx">tabManager</span><span class="p">.</span><span class="nx">Layout</span> <span class="o">=</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">tabLayout</span><span class="p">)</span>

    <span class="c1">//...</span>

    <span class="nx">$link</span><span class="p">:</span><span class="nx">elem</span> <span class="o">=&gt;</span> <span class="p">{</span>
         <span class="nx">elem</span><span class="p">.</span><span class="nx">AddChild</span><span class="p">(</span><span class="nx">tabManager</span><span class="p">).</span><span class="nx">Size</span><span class="p">.</span><span class="nx">SizeRule</span>  <span class="o">=</span> <span class="s2">"Fill"</span>
   <span class="p">}</span>
</pre></div></div>

<h3><span id="toc15">
タブレイアウト</span></h3>

<code>tabManager.Layout</code>にはJSONを設定する。このJSONはエディタのレイアウトを保存したときにiniファイルの中に保存されるものと同じフォーマットで、<code>/Saved/Config/Windows/Editor.ini</code>などを見るとわかる。

パラメータの詳細は以下の公式ドキュメントを見ると参考になる。

<ul>
<li><a href="https://docs.unrealengine.com/latest/INT/API/Runtime/Slate/Framework/Docking/FTabManager/FLayout/index.html" rel="nofollow noopener" >FLayout</a></li>
<li><a href="https://docs.unrealengine.com/latest/INT/API/Runtime/Slate/Framework/Docking/FTabManager/FArea/index.html" rel="nofollow noopener" >FArea</a></li>
<li><a href="https://docs.unrealengine.com/latest/INT/API/Runtime/Slate/Framework/Docking/FTabManager/FLayoutNode/index.html" rel="nofollow noopener" >FLayoutNode</a></li>
<li><a href="https://docs.unrealengine.com/latest/INT/API/Runtime/Slate/Framework/Docking/FTabManager/FStack/index.html" rel="nofollow noopener" >FStack</a></li>
<li><a href="https://docs.unrealengine.com/latest/INT/API/Runtime/Slate/Framework/Docking/FTabManager/FSplitter/index.html" rel="nofollow noopener" >FSplitter</a></li>
<li><a href="https://docs.unrealengine.com/latest/INT/API/Runtime/Slate/Framework/Docking/ETabState__Type/index.html" rel="nofollow noopener" >ETabState::Type</a></li>
</ul>

<h2><span id="toc16">
メニュー</span></h2>

デフォルトのエディタの左上のメニューバーや画面上部のツールバーを拡張することができる。

<a href="https://github.com/ncsoft/Unreal.js/blob/master/Examples/Content/Scripts/extension-extender.js" rel="nofollow noopener" >公式サンプル</a>

なお、<a href="https://github.com/ncsoft/Unreal.js-core/blob/master/Source/JavascriptEditor/JavascriptEditorLibrary.cpp#L589" rel="nofollow noopener" >現時点ではUnreal.jsはデフォルトのウィンドウ（<code>Level Editor</code>）のメニューの拡張にしか対応していない</a>。

<h2><span id="toc17">
ユーザーウィジェットをUIとして使う</span></h2>

WidgetBPをDesinerでWysiwygに作ったものをエディタ拡張のUIとして使うこともできる。

<a href="https://camo.qiitausercontent.com/72fba59aa6bbb3e7f5419397c549b2d75bf34305/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f62663039383362352d316431652d346361312d626339372d3538353063653662326438612e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/72fba59aa6bbb3e7f5419397c549b2d75bf34305/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f62663039383362352d316431652d346361312d626339372d3538353063653662326438612e706e67" alt="UserWidgetDesiner.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/bf0983b5-1d1e-4ca1-bc97-5850ce6b2d8a.png"></a><br>
<a href="https://camo.qiitausercontent.com/29517e1e11ed1dbbbc94ba67a45119f059c4d613/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f66373166663933342d353134632d346630662d643136662d6136313562363731363637622e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/29517e1e11ed1dbbbc94ba67a45119f059c4d613/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f66373166663933342d353134632d346630662d643136662d6136313562363731363637622e706e67" alt="UserWidget_sample.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/f71ff934-514c-4f0f-d16f-a615b671667b.png"></a>

JSで設定するのすら面倒！な場合はこの方法が使えるかも？<br>
ただし、イベント周りの処理は工夫が必要になるだろう（未検証）。

<ul>
<li><a href="https://github.com/ConquestArrow/UnrealJSEditorExtSamples/blob/master/Content/Scripts/extension-MyWidgetUMG.js" rel="nofollow noopener" >sample code</a></li>
</ul>

<h2><span id="toc18">
その他</span></h2>

JS側にAPIが出されているUI(<code>ue.d.ts</code>で<code>Visual</code>を継承する子クラス)であれば基本使用可能。

<div class="code-frame" data-lang="js">
<div class="code-lang"><span class="bold">呼び方</span></div>
<div class="highlight"><pre><span class="nx">UMG</span><span class="p">(</span><span class="err">【</span><span class="nx">UI</span><span class="err">】</span><span class="p">,</span><span class="err">【</span><span class="nx">UI</span><span class="err">のオプション】</span><span class="p">);</span>
</pre></div>
</div>

<a href="https://github.com/ncsoft/Unreal.js-core/tree/master/Source/JavascriptUMG" rel="nofollow noopener" >GithubのC++ソース</a>を眺めるだけでも全体像はつかめる。<code>JavascriptGraphEditor</code>など気になるものも用意されているようだ。

ここにないものは追加でプラグインに組み込むことになる。

<h1>
<span id="機能編" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/85481de046f1922555dc#%E6%A9%9F%E8%83%BD%E7%B7%A8"><i class="fa fa-link"></i></a>機能編</h1>

<h2><span id="toc19">
UIのトリガーイベント</span></h2>

<h3><span id="toc20">
$link, $unlink
</span></h3>

オプションの<code>Object</code>プロパティに<code>$link</code>,<code>$unlink</code>を設定する。

<div class="code-frame" data-lang="js"><div class="highlight"><pre><span class="nx">UMG</span><span class="p">(</span><span class="nx">Button</span><span class="p">,</span>
  <span class="p">{</span>
     <span class="na">$link</span><span class="p">:</span><span class="nx">elem</span> <span class="o">=&gt;</span> <span class="p">{},</span>
     <span class="na">$unlink</span><span class="p">:</span><span class="nx">elem</span> <span class="o">=&gt;</span> <span class="p">{}</span>
  <span class="p">}</span>
<span class="p">)</span>
</pre></div></div>

<code>$link</code>はUIの構築時、<code>$unlink</code>はUIの破棄時に呼ばれる？ようだ。

なお、<code>$link</code>,<code>$unlink</code>の引数<code>elem</code>はイベントの設定されたUI自身となる。

<div class="code-frame" data-lang="ts">
<div class="code-lang"><span class="bold">TypeScriptの型定義で書くと以下のような感じ</span></div>
<div class="highlight"><pre>
<span class="nx">UMG</span><span class="o">&lt;</span><span class="nx">T</span> <span class="kd">extends</span> <span class="nx">Visual</span><span class="o">&gt;</span><span class="p">(</span>
  <span class="nx">T</span><span class="p">,</span>
  <span class="p">{</span>
    <span class="nx">$link</span><span class="p">?:(</span><span class="na">elem</span><span class="p">:</span><span class="nx">T</span><span class="p">)</span><span class="o">=&gt;</span><span class="k">void</span><span class="p">,</span>
    <span class="nx">$unlink</span><span class="p">?:(</span><span class="na">elem</span><span class="p">:</span><span class="nx">T</span><span class="p">)</span><span class="o">=&gt;</span><span class="k">void</span>
  <span class="p">},</span>
<span class="c1">//...</span>
</pre></div>
</div>

<h3><span id="toc21">
UI毎のトリガーイベント</span></h3>

UIの部品ごとに設定できるイベントがあるので、

<div class="code-frame" data-lang="ts">
<div class="code-lang"><span class="bold">_part_1_ue.d.ts</span></div>
<div class="highlight"><pre><span class="nx">declare</span> <span class="kd">class</span> <span class="nx">Button</span> <span class="kd">extends</span> <span class="nx">ContentWidget</span> <span class="p">{</span> 
        <span class="c1">//略</span>
    <span class="nl">OnClicked</span><span class="p">:</span> <span class="nx">UnrealEngineMulticastDelegate</span><span class="o">&lt;</span><span class="p">()</span> <span class="o">=&gt;</span> <span class="k">void</span><span class="o">&gt;</span><span class="p">;</span>
    <span class="nl">OnPressed</span><span class="p">:</span> <span class="nx">UnrealEngineMulticastDelegate</span><span class="o">&lt;</span><span class="p">()</span> <span class="o">=&gt;</span> <span class="k">void</span><span class="o">&gt;</span><span class="p">;</span>
    <span class="nl">OnReleased</span><span class="p">:</span> <span class="nx">UnrealEngineMulticastDelegate</span><span class="o">&lt;</span><span class="p">()</span> <span class="o">=&gt;</span> <span class="k">void</span><span class="o">&gt;</span><span class="p">;</span>
    <span class="nl">OnHovered</span><span class="p">:</span> <span class="nx">UnrealEngineMulticastDelegate</span><span class="o">&lt;</span><span class="p">()</span> <span class="o">=&gt;</span> <span class="k">void</span><span class="o">&gt;</span><span class="p">;</span>
    <span class="nl">OnUnhovered</span><span class="p">:</span> <span class="nx">UnrealEngineMulticastDelegate</span><span class="o">&lt;</span><span class="p">()</span> <span class="o">=&gt;</span> <span class="k">void</span><span class="o">&gt;</span><span class="p">;</span>
<span class="c1">//以後省略</span>
</pre></div>
</div>

<code>$link</code>などと同様にオプションの<code>Object</code>内で設定する。

<div class="code-frame" data-lang="js"><div class="highlight"><pre><span class="nx">UMG</span><span class="p">(</span><span class="nx">Button</span><span class="p">,</span>
  <span class="p">{</span>
     <span class="na">OnClicked</span><span class="p">:</span> <span class="nx">_</span> <span class="o">=&gt;</span> <span class="p">{</span>
        <span class="c1">//do something</span>
     <span class="p">}</span>
  <span class="p">}</span>
<span class="p">)</span>
</pre></div></div>

<h2><span id="toc22">
選択中のアクターインスタンスを取得する</span></h2>

<div class="code-frame" data-lang="js"><div class="highlight"><pre><span class="c1">//エディタ（World Outlinerなど）上で選択したActorインスタンスの配列を取得</span>
<span class="kd">let</span> <span class="nx">usel</span> <span class="o">=</span> <span class="nx">JavascriptEditorEngineLibrary</span><span class="p">.</span><span class="nx">GetSelectedSet</span><span class="p">(</span><span class="nx">Root</span><span class="p">.</span><span class="nx">GetEngine</span><span class="p">(),</span> <span class="nx">Actor</span><span class="p">)</span>
<span class="kd">let</span> <span class="nx">sel</span> <span class="o">=</span> <span class="nx">usel</span><span class="p">.</span><span class="nx">GetSelectedObjects</span><span class="p">()</span>

<span class="c1">//一つ目のActorインスタンスを取得</span>
<span class="kd">let</span> <span class="nx">p</span> <span class="o">=</span> <span class="nx">sel</span><span class="p">.</span><span class="nx">Out</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</pre></div></div>

<h1>
<span id="ライブラリ編" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/85481de046f1922555dc#%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E7%B7%A8"><i class="fa fa-link"></i></a>ライブラリ編</h1>

<h2><span id="toc23">
UE4 API</span></h2>

<h3><span id="toc24">
JavascriptEditorLibrary</span></h3>

エディタの機能にアクセスするAPI群が定義されたライブラリクラス。

<h3><span id="toc25">
JavascriptEditorEngineLibrary</span></h3>

上記に似ているが、こちらは<code>EditorEngine</code>に関してのAPI群のライブラリクラス。

<h3><span id="toc26">
Javascript*クラス</span></h3>

<code>Javascript*</code>という名前のクラスは頭の<code>Javascript</code>を消すと、Unreal C++の元の該当するAPIにたどり着けることが多い。

<h2><span id="toc27">
Unreal.js同梱</span></h2>

同梱ライブラリでエディタ拡張に使えそうなものを紹介。

<h3><span id="toc28">
fs.js
</span></h3>

node.js互換のファイルIOライブラリ。

コード中でファイルの読み書きに使えるほか、npm経由で入れたjsライブラリで<code>fs</code>モジュールを呼んでいる場合に役に立つ。

なお、ファイルIO自体はUE4自体のAPIを使うこともできる。

<h3><span id="toc29">
UMG.js
</span></h3>

<div class="code-frame" data-lang="js"><div class="highlight"><pre><span class="nx">UMG</span><span class="p">(</span><span class="err">【</span><span class="nx">UI</span><span class="err">】</span><span class="p">,</span><span class="err">【</span><span class="nx">UI</span><span class="err">のオプション】</span><span class="p">,</span><span class="err">【子要素</span><span class="nx">UI</span><span class="err">】</span><span class="p">);</span>
</pre></div></div>

すでに紹介済みだが、UMG/Slateを便利に扱うためのクラス。いくつかのショートハンドメソッドも用意されている。

ショートハンドメソッドには実は<code>UMG.list()</code>や<code>UMG.TabManager()</code>など上記で元のクラスAPIだけ紹介したものもあり、代表的なものは一通り用意されているようだ（今回は未検証）。時間があれば今後検証していきたい。

<h3><span id="toc30">
instantiator.js</span></h3>

UMG.jsで作成したUIを各APIに渡せる形にする。

<h3><span id="toc31">
editor-maker.js
</span></h3>

エディタのUI（タブ・メニュー・コマンドなど）を便利に作れるライブラリ。

<h1>
<span id="まとめ" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/85481de046f1922555dc#%E3%81%BE%E3%81%A8%E3%82%81"><i class="fa fa-link"></i></a>まとめ</h1>

<ul>
<li>
<a href="https://qiita.com/ConquestArrow/items/85481de046f1922555dc#%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E4%BD%9C%E3%82%8A%E6%96%B9">基本的な作り方</a> をもとにJSでエディタ拡張を作れる</li>
<li>UE4のAPI群とUnreal.js同梱のライブラリを活用できる</li>
<li>
<a href="https://github.com/ConquestArrow/UnrealJSEditorExtSamples" rel="nofollow noopener" >今回のサンプルをgithubにあげてある</a>ので参考に</li>
</ul>

<h1>
<span id="next-day" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/85481de046f1922555dc#next-day"><i class="fa fa-link"></i></a>Next Day</h1>

明日（6日目）は <a href="https://qiita.com/alwei" class="user-mention js-hovercard" title="alwei" data-hovercard-target-type="user" data-hovercard-target-name="alwei">@alwei</a> さんによる　「<a href="http://unrealengine.hatenablog.com/entry/2016/12/06/000000" rel="nofollow noopener" >UE4 VR空間で手を飛ばす方法について</a>」です。

<div class="footnotes">
<hr>
<ol>

<li id="fn1">
UE4の場合、機能追加はエンジンのソースに手を入れればよいので。 <a href="https://qiita.com/ConquestArrow/items/85481de046f1922555dc#fnref1">↩</a>
</li>

<li id="fn2">
もちろん、APIを一つ一つたたくことで作成することもできるが <a href="https://qiita.com/ConquestArrow/items/85481de046f1922555dc#fnref2">↩</a>
</li>

<li id="fn3">
正確にはもちろんHTMLのdiv/spanは縦横の並びは固定ではない。 <a href="https://qiita.com/ConquestArrow/items/85481de046f1922555dc#fnref3">↩</a>
</li>

</ol>
</div>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Unreal.jsの型定義ファイルを再生成してAPIを調べやすくする</title>
		<link>https://qiita.com/ConquestArrow/items/fa7560d8fa7aa03553e5</link>
		
		<dc:creator><![CDATA[Conquest Arrow]]></dc:creator>
		<pubDate>Thu, 24 Nov 2016 14:13:24 +0000</pubDate>
				<category><![CDATA[Qiita記事]]></category>
		<guid isPermaLink="false">http://conquestarrow.com/?guid=e6ddf4d4bbb3e8a228458a987577282b</guid>

					<description><![CDATA[

問題

Unreal.jsはVSCodeなどの補完が効くエディタ用に型定義ファイルを出力する機能がある。

大変便利なのだが、デフォルトで出力されているものはAPIがただ羅列しているだけである。そのため内容を調べるには名前から類推するか、Unreal C++の元のAPIのマニュアルを探す手間が必要だった。

Unreal.jsはマニュアルが充実しているとは言い難いのでこれはなかなかつらいところである。


解決方法

結論から書くと、型定義ファイルを生成するメソッド JavascriptCont...]]></description>
										<content:encoded><![CDATA[<h1>
<span id="問題" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/fa7560d8fa7aa03553e5#%E5%95%8F%E9%A1%8C"><i class="fa fa-link"></i></a>問題</h1>

<a href="http://qiita.com/ConquestArrow/items/bb81ad5e63cf6bc4e549" id="reference-e0446e771bc09d2c1295">Unreal.js</a>はVSCodeなどの<a href="https://github.com/ncsoft/Unreal.js/wiki/Autocompletion" rel="nofollow noopener" >補完が効くエディタ用に型定義ファイルを出力する機能</a>がある。

大変便利なのだが、<a href="https://github.com/ncsoft/Unreal.js/blob/master/Examples/Content/Scripts/typings/ue.d.ts" rel="nofollow noopener" >デフォルトで出力されているもの</a>はAPIがただ羅列しているだけである。そのため内容を調べるには名前から類推するか、Unreal C++の元のAPIのマニュアルを探す手間が必要だった。

Unreal.jsはマニュアルが充実しているとは言い難いのでこれはなかなかつらいところである。

<h1>
<span id="解決方法" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/fa7560d8fa7aa03553e5#%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95"><i class="fa fa-link"></i></a>解決方法</h1>

結論から書くと、型定義ファイルを生成するメソッド <code>JavascriptContext.WriteDTS()</code> の第二引数を<code>true</code>にして型定義ファイルを生成すればOK。

<div class="code-frame" data-lang="js">
<div class="code-lang"><span class="bold">Sample</span></div>
<div class="highlight"><pre><span class="nx">Context</span><span class="p">.</span><span class="nx">WriteDTS</span><span class="p">(</span><span class="nx">Context</span><span class="p">.</span><span class="nx">Paths</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="s1">'typings/ue.d.ts'</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>
</pre></div>
</div>

元のC++ APIのコメントがJSDocフォーマットで型定義ファイル内にも出力され、コードの補完時にAPIの説明を読むことができるようになる。

<a href="https://camo.qiitausercontent.com/e5236c7f0006e4a6626d0cba0378f135a99e07f1/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f38386661376334302d633062652d356266322d303764372d3461626639613434663166342e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/e5236c7f0006e4a6626d0cba0378f135a99e07f1/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f38386661376334302d633062652d356266322d303764372d3461626639613434663166342e706e67" alt="Unreal-js_WriteDTS.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/88fa7c40-c0be-5bf2-07d7-4abf9a44f1f4.png"></a>

<h1>
<span id="説明" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/fa7560d8fa7aa03553e5#%E8%AA%AC%E6%98%8E"><i class="fa fa-link"></i></a>説明</h1>

<a href="https://github.com/ncsoft/Unreal.js/wiki/Visual-Studio-Code" rel="nofollow noopener" >公式wikiには書かれていない</a>が、型定義ファイル<code>ue.d.ts</code>の方に以下のように詳細が書かれている。

<div class="code-frame" data-lang="ts"><div class="highlight"><pre><span class="nx">WriteDTS</span><span class="p">(</span><span class="nx">Target</span><span class="p">:</span> <span class="nx">string</span><span class="p">,</span><span class="nx">bIncludingTooltip</span><span class="p">:</span> <span class="kr">boolean</span><span class="p">):</span> <span class="kr">boolean</span><span class="p">;</span>
</pre></div></div>

第二引数をtrueにすると、メソッドやプロパティにコメントが出力され、（対応しているエディタなら）補完時に確認することができる。

<h1>
<span id="注意点" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/fa7560d8fa7aa03553e5#%E6%B3%A8%E6%84%8F%E7%82%B9"><i class="fa fa-link"></i></a>注意点</h1>


  <div id="toc" class="toc tnt-none toc-center tnt-none border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ul class="toc-list open"></li><li><a href="#toc1" tabindex="0">
型定義ファイルの肥大化</a></li><li><a href="#toc2" tabindex="0">
ver.0.23 クラスのコメントが出力されない</a></li><li><a href="#toc3" tabindex="0">
APIのコメントは機械抽出</a></li></ul>
    </div>
  </div>

<h2><span id="toc1">
型定義ファイルの肥大化</span></h2>

コメントが追加されることで型定義ファイルのサイズが非常に大きくなる（出力されるファイル数が増える）。エディタの補完動作がやや遅くなるので注意。

<h2><span id="toc2">
ver.0.23 クラスのコメントが出力されない</span></h2>

なぜかクラスの説明が出力されない。<a href="https://github.com/ncsoft/Unreal.js-core/pull/9/commits/461a8399884baf4fb1b65bb7791fd738224f230c" rel="nofollow noopener" >プルリクを取り込んでもらった</a>ので次のリリースからは出力されるようになるはず。

<h2><span id="toc3">
APIのコメントは機械抽出</span></h2>

機械抽出したコメントを追加しているようなので、ほぼ意味をなしていないコメントや誤ったコメントを出力している例がある。最終的にはUnreal C++のAPIを確認する必要になることもあるだろう。

<h1>
<span id="まとめ" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/fa7560d8fa7aa03553e5#%E3%81%BE%E3%81%A8%E3%82%81"><i class="fa fa-link"></i></a>まとめ</h1>

<ul>
<li>素の型定義ファイルはコメントがなくて辛い</li>
<li>
<code>WriteDTS()</code>の第二引数を<code>true</code>で再生成するとコメントが追加されて便利！</li>
<li>注意点は次の３つ

<ol>
<li>型定義ファイルがめっちゃでかくなる</li>
<li>なぜかクラスのコメントが出力されない</li>
<li>おかしなコメントが出力されることも</li>
</ol>
</li>
</ul>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[UE4]Unreal.jsでBlueprintからJSを実行する</title>
		<link>https://qiita.com/ConquestArrow/items/06cdeca8c3ce5e1d7451</link>
		
		<dc:creator><![CDATA[Conquest Arrow]]></dc:creator>
		<pubDate>Tue, 18 Oct 2016 17:58:33 +0000</pubDate>
				<category><![CDATA[Qiita記事]]></category>
		<guid isPermaLink="false">http://conquestarrow.com/?guid=bbad33cae30bb4793c2e247441f87bf8</guid>

					<description><![CDATA[Unreal.jsプラグインでは通常JSの実行手段はJavascriptコンポーネントを任意のActorにつけるか、ファイル名をextension-*.jsとする方法がある。ただし前者では何らかのActorをワールドに出す必要があり、後者はそもそもエディタの拡張用である。

可能なら任意のタイミングでBlueprint(以下、BP)からJS呼び出しのタイミングを制御したい。今回はその方法を簡単に説明する。


ゲーム起動時にJSを実行：カスタムGameInstanceクラスで呼ぶ

UE4ではゲーム...]]></description>
										<content:encoded><![CDATA[<a href="http://qiita.com/ConquestArrow/items/bb81ad5e63cf6bc4e549" id="reference-78a0b8cff3eeeaeee8bf">Unreal.jsプラグイン</a>では通常JSの実行手段は<code>Javascript</code>コンポーネントを任意のActorにつけるか、ファイル名を<code>extension-*.js</code>とする方法がある。ただし前者では何らかのActorをワールドに出す必要があり、後者はそもそもエディタの拡張用である。

可能なら任意のタイミングでBlueprint(以下、BP)からJS呼び出しのタイミングを制御したい。今回はその方法を簡単に説明する。

<h1>
<span id="ゲーム起動時にjsを実行カスタムgameinstanceクラスで呼ぶ" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/06cdeca8c3ce5e1d7451#%E3%82%B2%E3%83%BC%E3%83%A0%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%ABjs%E3%82%92%E5%AE%9F%E8%A1%8C%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0gameinstance%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%A7%E5%91%BC%E3%81%B6"><i class="fa fa-link"></i></a>ゲーム起動時にJSを実行：カスタム<code>GameInstance</code>クラスで呼ぶ</h1>

UE4ではゲームを最初に呼び出したときに<code>GameInstance</code>というクラスBPが呼ばれるが、このクラスBPはプロジェクト設定で任意のものに変更ができる。この機能を使ってJSを呼ぶBPを組んでおけば、ゲーム起動時にJSを実行できる。


  <div id="toc" class="toc tnt-none toc-center tnt-none border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-9" checked><label class="toc-title" for="toc-checkbox-9">目次</label>
    <div class="toc-content">
    <ul class="toc-list open"></li><li><a href="#toc1" tabindex="0">
カスタムGameInstanceクラスの準備</a></li><li><a href="#toc2" tabindex="0">
呼び出されるJSの用意</a></li><li><a href="#toc3" tabindex="0">
BPからJSを呼ぶノードを組む</a></li><li><a href="#toc4" tabindex="0">
BPをコンパイルして実行</a></li></ul>
    </div>
  </div>

<h2><span id="toc1">
カスタムGameInstanceクラスの準備</span></h2>

<ol>
<li>コンテンツブラウザのメニューから新規でBPクラスを作成する</li>
<li>親クラスに<code>GameInstance</code>を指定</li>
<li>適当な名前を付けて保存（例では「HelloFromBP」）</li>
<li>メニューのEdit &gt; Project Settings... を選択</li>
<li>「Map &amp; Modes」を選択し、さっき作成したカスタム<code>GameInstance</code>クラスを指定

<ul>
<li><a href="https://camo.qiitausercontent.com/1d9b5265219dc8e00dd02580793a572bef04a02f/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f37393361643332392d376334342d303637382d653735392d3935633062323065626533372e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/1d9b5265219dc8e00dd02580793a572bef04a02f/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f37393361643332392d376334342d303637382d653735392d3935633062323065626533372e706e67" alt="HelloFromBP_GameInstanceSetting.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/793ad329-7c44-0678-e759-95c0b20ebe37.png"></a></li>
</ul>
</li>
</ol>

<h2><span id="toc2">
呼び出されるJSの用意</span></h2>

<code>/Content/Scripts/</code>以下に任意の名前のJSを用意する。今回は以下の内容で。

<div class="code-frame" data-lang="js">
<div class="code-lang"><span class="bold">hi.js</span></div>
<div class="highlight"><pre><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">"hi console log!"</span><span class="p">)</span>
</pre></div>
</div>

<h2><span id="toc3">
BPからJSを呼ぶノードを組む</span></h2>

<ol>
<li>カスタム<code>GameInstance</code>クラスをダブルクリックなどしてBPエディタを開く</li>
<li>以下のようなノードを組む

<ul>
<li><a href="https://camo.qiitausercontent.com/5f020f413d3be4829d00b4713b68fab522a7ab6d/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f32333539396164312d303538612d383461302d343130352d3237313361616261376363662e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/5f020f413d3be4829d00b4713b68fab522a7ab6d/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f32333539396164312d303538612d383461302d343130352d3237313361616261376363662e706e67" alt="HelloFromBP_BPcore.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/23599ad1-058a-84a0-4105-2713aaba7ccf.png"></a></li>
<li><a href="http://blueprintue.com/blueprint/aqwx-7ba/" class="autolink" rel="nofollow noopener" >http://blueprintue.com/blueprint/aqwx-7ba/</a></li>
</ul>
</li>
<li>Event Initから開始</li>
<li>
<code>Construct Object from Class</code>ノードを追加

<ul>
<li>Outerピンには自身<code>self</code>
</li>
<li>クラスは<code>JavascriptIsolate</code>を指定</li>
</ul>
</li>
<li>
<code>Create Context</code>ノードを追加

<ul>
<li>Unreal.js導入で追加されるノード</li>
</ul>
</li>
<li>（任意）JSからイベントを呼べるように<code>Expose</code>ノートを追加

<ul>
<li>後述</li>
</ul>
</li>
<li>
<code>Run File</code>もしくは<code>Run Script</code>ノードを追加

<ul>
<li>
<code>Run File</code>はファイルを指定するノード。例では<code>hi.js</code>を指定</li>
<li>
<code>Run Script</code>は文字列をスクリプトとして実行するノード</li>
</ul>
</li>
</ol>

<h2><span id="toc4">
BPをコンパイルして実行</span></h2>

<a href="https://camo.qiitausercontent.com/c398ec7d5545fb5e099882856e3a7173c2918802/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f37393038336162642d323961302d306637362d303630312d6634666334383365393739652e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/c398ec7d5545fb5e099882856e3a7173c2918802/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f37393038336162642d323961302d306637362d303630312d6634666334383365393739652e706e67" alt="HelloFromBP_console1.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/79083abd-29a0-0f76-0601-f4fc483e979e.png"></a>

JavascriptConsoleに上記のログが出ればOK.

※なお<code>GameInstance</code>からはそのままでは<code>GWorld</code>が取得できないので注意。

<h1>
<span id="レベル読み込み時に実行レベルbpから呼び出す" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/06cdeca8c3ce5e1d7451#%E3%83%AC%E3%83%99%E3%83%AB%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E6%99%82%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%83%AC%E3%83%99%E3%83%ABbp%E3%81%8B%E3%82%89%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99"><i class="fa fa-link"></i></a>レベル読み込み時に実行：レベルBPから呼び出す</h1>

開始のノードが<code>Event BeginPlay</code>であること以外は基本的には同じように呼び出せる。

<a href="https://camo.qiitausercontent.com/c6ed64166700caf217334bb461b7a367fa873f86/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f30333335363861312d373363372d383134322d353535642d3065643263323863363432352e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/c6ed64166700caf217334bb461b7a367fa873f86/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f30333335363861312d373363372d383134322d353535642d3065643263323863363432352e706e67" alt="HelloFromBP_LevelBP.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/033568a1-73c7-8142-555d-0ed2c28c6425.png"></a>

もちろん、開始ノードを<code>Event BeginPlay</code>以外にすることで任意のタイミングでJSを実行可能。

<h1>
<span id="おまけjsからbpを実行する" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/06cdeca8c3ce5e1d7451#%E3%81%8A%E3%81%BE%E3%81%91js%E3%81%8B%E3%82%89bp%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B"><i class="fa fa-link"></i></a>おまけ：JSからBPを実行する</h1>

カスタム<code>GameInstance</code>クラスに<code>Expose</code>ノードで名前を付けておくことでJSから呼び出せるようになる。

<a href="https://camo.qiitausercontent.com/50a2fde005fdf24d426b1bfef9efb0dce8e35ce2/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f61363439656461632d626563312d306239652d376135352d3037396435383034343730612e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/50a2fde005fdf24d426b1bfef9efb0dce8e35ce2/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f61363439656461632d626563312d306239652d376135352d3037396435383034343730612e706e67" alt="HelloFromBP_ExposeNode.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/a649edac-bec1-0b9e-7a55-079d5804470a.png"></a>

たとえば<code>HelloFromBP</code>と名前を付けておく。

<a href="https://camo.qiitausercontent.com/1012fe663fbf7cb14687691d841f1f08c74ca95d/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f64663432393934372d663464382d326363312d303534632d3237386133323864343562612e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/1012fe663fbf7cb14687691d841f1f08c74ca95d/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f64663432393934372d663464382d326363312d303534632d3237386133323864343562612e706e67" alt="HelloFromBP_CustomEvent.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/df429947-f4d8-2cc1-054c-278a328d45ba.png"></a>

適当な名前(例：「HelloBP」)でカスタムイベントを作成するとそのカスタムイベントを以下の形でJSから呼び出せる。

<div class="code-frame" data-lang="js">
<div class="code-lang"><span class="bold">hi.js</span></div>
<div class="highlight"><pre><span class="nx">HelloFromBP</span><span class="p">.</span><span class="nx">HelloBP</span><span class="p">();</span>
</pre></div>
</div>

<a href="https://camo.qiitausercontent.com/53546447fcfa15cb2c76f6e7b4315cdb3e753758/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f33643361663435652d336239632d343332622d666136372d6539656336656563333939612e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/53546447fcfa15cb2c76f6e7b4315cdb3e753758/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f33643361663435652d336239632d343332622d666136372d6539656336656563333939612e706e67" alt="HelloFromBP_PIE.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/3d3af45e-3b9c-432b-fa67-e9ec6eec399a.png"></a>

<a href="https://camo.qiitausercontent.com/9aaede25bca601d83cab9fd0b8b43b8c460957ee/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f62363565363731362d343333382d613064322d343563302d3161646335393033343630352e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/9aaede25bca601d83cab9fd0b8b43b8c460957ee/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f62363565363731362d343333382d613064322d343563302d3161646335393033343630352e706e67" alt="HelloFromBP_console2.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/b65e6716-4338-a0d2-45c0-1adc59034605.png"></a>

なお、Wikiには<a href="https://github.com/ncsoft/Unreal.js/wiki/Subclassing" rel="nofollow noopener" >クラスBPを継承したクラスをJSで作る例</a>も載っているので併せて読むといいかもしれない。

<h1>
<span id="まとめ" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/06cdeca8c3ce5e1d7451#%E3%81%BE%E3%81%A8%E3%82%81"><i class="fa fa-link"></i></a>まとめ</h1>

<ul>
<li>BPからJSを呼ぶには以下のノードの組み合わせでできる

<ul>
<li>
<code>Construct Object from Class</code>

<ul>
<li>クラスは<code>JavascriptIsolate</code>を指定</li>
</ul>
</li>
<li><code>Create Context</code></li>
<li>
<code>Run File</code> or <code>Run Script</code>
</li>
</ul>
</li>
<li>
<code>GameInstance</code>やレベルBPなどの任意のBPの任意のタイミングから呼べる</li>
<li>JSから見えるようにしておけば（<code>Expose</code>）JSからBPのカスタムイベントを呼ぶこともできる</li>
</ul>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[UE4]Unreal.jsでJSのコードに型とフラグ情報を付与する</title>
		<link>https://qiita.com/ConquestArrow/items/6c1eac9226aeb5ce2794</link>
		
		<dc:creator><![CDATA[Conquest Arrow]]></dc:creator>
		<pubDate>Sun, 16 Oct 2016 16:22:13 +0000</pubDate>
				<category><![CDATA[Qiita記事]]></category>
		<guid isPermaLink="false">http://conquestarrow.com/?guid=128ef1ce06b9d0bb4bb7dbf4433e51e4</guid>

					<description><![CDATA[Unreal.jsプラグインでJavaScriptで作成したものをUE4の世界に認識させるには次の方法が必要になる。


ES2015(ES6)の書き方でクラスを生成
クラス・メソッド・プロパティに 型とフラグの情報を付与


uclass.jsで型とフラグ情報を解析させてUE4側にクラスを認識させる


この「型とフラグの情報を付与」という部分が若干特殊なので説明。


Unreal.jsでの型およびフラグ情報の独自表現

周知の通り、JavaScriptには型表現の方法が基本的にない。一方UE4...]]></description>
										<content:encoded><![CDATA[<a href="http://qiita.com/ConquestArrow/items/bb81ad5e63cf6bc4e549" id="reference-4d4275cfbf48074ee016">Unreal.jsプラグイン</a>でJavaScriptで作成したものをUE4の世界に認識させるには次の方法が必要になる。

<ol>
<li>ES2015(ES6)の書き方でクラスを生成</li>
<li>クラス・メソッド・プロパティに <strong>型とフラグの情報を付与</strong>
</li>
<li>
<code>uclass.js</code>で型とフラグ情報を解析させてUE4側にクラスを認識させる</li>
</ol>

この「型とフラグの情報を付与」という部分が若干特殊なので説明。

<h1>
<span id="unrealjsでの型およびフラグ情報の独自表現" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/6c1eac9226aeb5ce2794#unrealjs%E3%81%A7%E3%81%AE%E5%9E%8B%E3%81%8A%E3%82%88%E3%81%B3%E3%83%95%E3%83%A9%E3%82%B0%E6%83%85%E5%A0%B1%E3%81%AE%E7%8B%AC%E8%87%AA%E8%A1%A8%E7%8F%BE"><i class="fa fa-link"></i></a>Unreal.jsでの型およびフラグ情報の独自表現</h1>

周知の通り、JavaScriptには型表現の方法が基本的にない。一方UE4のUnreal C++ &amp; Blueprintには型がある。Unreal.jsではこの差を埋めるために、コメント中に埋め込まれた型とフラグ情報を解析した上でUE4側に渡す形になっている。

また、Unreal C++独自のマクロ（<code>UPROPERTY</code>など）での識別子指定もフラグ情報等として表現できる（ <del>メタデータ識別子</del> メタプロパティも一部対応しているようだ）。

以下が、それぞれのUnreal C++マクロに対応するJS側での書き方。


  <div id="toc" class="toc tnt-none toc-center tnt-none border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10" checked><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ul class="toc-list open"></li><li><a href="#toc1" tabindex="0">
UCLASS</a></li><li><a href="#toc2" tabindex="0">
UFUNCTION</a></li><li><a href="#toc3" tabindex="0">
UPROPERTY</a></li><li><a href="#toc4" tabindex="0">
USTRUCT</a></li></ul>
    </div>
  </div>

<h2><span id="toc1">
UCLASS</span></h2>

<div class="code-frame" data-lang="cpp">
<div class="code-lang"><span class="bold">unreal_c++</span></div>
<div class="highlight"><pre><span class="n">UCLASS</span><span class="p">([</span><span class="n">specifier</span><span class="p">,</span> <span class="n">specifier</span><span class="p">,</span> <span class="p">...],</span> <span class="p">[</span><span class="n">meta</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">value</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">value</span><span class="p">,</span> <span class="p">...)])</span>
<span class="k">class</span> <span class="nc">ClassName</span> <span class="o">:</span> <span class="k">public</span> <span class="n">ParentName</span>
<span class="p">{</span>
    <span class="n">GENERATED_BODY</span><span class="p">()</span>
<span class="p">}</span>
</pre></div>
</div>

<div class="code-frame" data-lang="js"><div class="highlight"><pre><span class="kd">class</span> <span class="nx">ClassName</span> <span class="cm">/* ClassFlag+ClassFlag+... */</span> <span class="kd">extends</span> <span class="nx">ParentClass</span> <span class="p">{</span>
   <span class="nx">ctor</span><span class="p">()</span> <span class="p">{</span>
     <span class="c1">// initialization</span>
     <span class="c1">// component setup</span>
   <span class="p">}</span>
   <span class="nx">properties</span><span class="p">()</span> <span class="p">{</span>
     <span class="c1">// property-declarations</span>
   <span class="p">}</span>
<span class="p">}</span>
</pre></div></div>

<code>class クラス名 /* フラグ情報1+フラグ情報2+... */ {}</code>の形で定義する。

注意点：

<ul>
<li>ES5以前の疑似クラス定義には非対応

<ul>
<li>文字列解析で処理されているため</li>
</ul>
</li>
<li>コンストラクタは<code>ctor()</code>

<ul>
<li>ES2015の<code>constructor()</code>はJS側のコンストラクタ、<code>ctor()</code>はUE4側のコンストラクタとして働く</li>
</ul>
</li>
<li>プロパティ(UPROPERTY)は<code>properties()</code>で定義</li>
<li>
<code>UClass</code>として扱うには最後にuclass.jsで解析する必要がある</li>
</ul>

<div class="code-frame" data-lang="js"><div class="highlight"><pre><span class="c1">//transformed into corresponding USTRUCT and UCLASS</span>
<span class="kd">let</span> <span class="nx">cls</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'uclass'</span><span class="p">)()(</span><span class="nb">global</span><span class="p">,</span> <span class="nx">ClassName</span><span class="p">);</span>
</pre></div></div>

参考：<a href="https://github.com/ncsoft/Unreal.js/wiki/USTRUCT-and-UCLASS" rel="nofollow noopener" >USTRUCT and UCLASS</a>

<h2><span id="toc2">
UFUNCTION</span></h2>

<div class="code-frame" data-lang="cpp">
<div class="code-lang"><span class="bold">unreal_c++</span></div>
<div class="highlight"><pre><span class="n">UFUNCTION</span><span class="p">([</span><span class="n">specifier</span><span class="p">,</span> <span class="n">specifier</span><span class="p">,</span> <span class="p">...],</span> <span class="p">[</span><span class="n">meta</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">value</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">value</span><span class="p">,</span> <span class="p">...)])</span>
<span class="n">ReturnType</span> <span class="n">FunctionName</span><span class="p">([</span><span class="n">Parameter</span><span class="p">,</span> <span class="n">Parameter</span><span class="p">,</span> <span class="p">...])</span>
</pre></div>
</div>

<div class="code-frame" data-lang="js"><div class="highlight"><pre><span class="kd">class</span> <span class="nx">ClassName</span><span class="p">{</span>
  <span class="c1">//...</span>
  <span class="nx">FunctionName</span><span class="p">([</span>
    <span class="nx">Parameter</span> <span class="cm">/* PropertyFlag+ParamType */</span><span class="p">,</span>
    <span class="nx">Parameter</span> <span class="cm">/* PropertyFlag+ParamType */</span><span class="p">,</span>
     <span class="p">...</span> 
  <span class="p">])</span> <span class="cm">/* specifier+ReturnType */</span>
<span class="p">}</span>
</pre></div></div>

前提として<code>UCLASS</code>と同時に定義する必要がある（JS的には必ずクラスのメソッド）。

<code>関数名(引数名 /* UPROPERTYのフラグ+引数の型 */) /* UFUNCIONのフラグ+返り値の型 */</code>という形で定義する。「UFUNCIONのフラグ」は<a href="https://docs.unrealengine.com/latest/JPN/Programming/UnrealArchitecture/Reference/Functions/Specifiers/index.html" rel="nofollow noopener" >関数指定子</a>ということで調べられるが、Unreal.jsのWikiには言及がないのですべて使えるかどうかは不明。

<ul>
<li>参考：<a href="https://docs.unrealengine.com/latest/JPN/Programming/UnrealArchitecture/Reference/Functions/Specifiers/index.html" rel="nofollow noopener" >関数指定子</a>
</li>
<li>参考：<a href="https://github.com/ncsoft/Unreal.js/wiki/USTRUCT-and-UCLASS" rel="nofollow noopener" >USTRUCT and UCLASS</a>
</li>
<li>参考：<a href="https://github.com/ncsoft/Unreal.js/wiki/UPROPERTY" rel="nofollow noopener" >UPROPERTY</a>
</li>
</ul>

<h2><span id="toc3">
UPROPERTY</span></h2>

<div class="code-frame" data-lang="cpp">
<div class="code-lang"><span class="bold">unreal_c++</span></div>
<div class="highlight"><pre><span class="n">UPROPERTY</span><span class="p">([</span><span class="n">specifier</span><span class="p">,</span> <span class="n">specifier</span><span class="p">,</span> <span class="p">...],</span> <span class="p">[</span><span class="n">meta</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">value</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">value</span><span class="p">,</span> <span class="p">...)])</span>
<span class="n">Type</span> <span class="n">VariableName</span><span class="p">;</span>
</pre></div>
</div>

<div class="code-frame" data-lang="js">
<div class="code-lang"><span class="bold">Unreal.js</span></div>
<div class="highlight"><pre><span class="kd">class</span> <span class="nx">MyClassName</span><span class="p">{</span>
  <span class="c1">//...</span>
  <span class="nx">properties</span><span class="p">(){</span>
    <span class="k">this</span><span class="p">.</span><span class="nx">VariableName</span> <span class="cm">/* specifier+specifier+...+Type */</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>

前提として<code>USTRUCT</code>か<code>UCLASS</code>と同時に定義する必要がある。

<code>UPROPERTY</code>マクロは変数プロパティをエディタ上やBlueprint上から扱えるように設定するため設定する頻度が高い。JSで同様にするためには<code>properties()</code>メソッドの中で次のように定義する。<code>properties()</code>メソッド以外では定義できないので注意。

<code>this.プロパティ名 /* フラグ1+フラグ2+...+型 */;</code>

<ul>
<li>参考：<a href="https://github.com/ncsoft/Unreal.js/wiki/UPROPERTY" rel="nofollow noopener" >UPROPERTY</a>
</li>
<li>参考２：<a href="http://qiita.com/bigengelt/items/b17545fffe7b8d69e5e8" id="reference-8ec74c2ee5b4fe256fd5">UE4 よく使うUPROPERTYメモ</a>
</li>
</ul>

なお、ドキュメントには明記されていないが<code>EditCondition</code>などの<a href="https://wiki.unrealengine.com/UPROPERTY#Valid_Meta_Properties" rel="nofollow noopener" >メタプロパティ</a>も次のような書き方で有効になった。

<div class="code-frame" data-lang="js">
<div class="code-lang"><span class="bold">metaの書き方</span></div>
<div class="highlight"><pre><span class="nx">properties</span><span class="p">()</span> <span class="p">{</span>
  <span class="c1">//bEditConditionが有効ならエディタ上で編集可能に</span>
  <span class="k">this</span><span class="p">.</span><span class="nx">EditConditionVariable</span> <span class="cm">/* EditAnywhere+Category:condition+EditCondition:bEditCondition+int32*/</span>
  <span class="c1">//エディタ上で普段は隠しておく</span>
  <span class="k">this</span><span class="p">.</span><span class="nx">bEditCondition</span> <span class="cm">/* EditAnywhere+Category:condition+AdvancedDisplay+bool */</span><span class="p">;</span>  
<span class="p">}</span>
</pre></div>
</div>

<a href="https://camo.qiitausercontent.com/d9903f7383b69ad6a3b8e4012e6132fff55b46c3/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f62653165363431382d366532322d633035332d643066302d6234383961356637373163642e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/d9903f7383b69ad6a3b8e4012e6132fff55b46c3/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f62653165363431382d366532322d633035332d643066302d6234383961356637373163642e706e67" alt="MetaEditCondition1.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/be1e6418-6e22-c053-d0f0-b489a5f771cd.png"></a><br>
↓<br>
<a href="https://camo.qiitausercontent.com/417d7b4ea46a08dcd91fb3d5d53310e05bba2ea1/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f33323530353937392d326561322d386436382d623161362d3263303735303530376362652e706e67"  rel="nofollow noopener"><img src="https://camo.qiitausercontent.com/417d7b4ea46a08dcd91fb3d5d53310e05bba2ea1/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343736342f33323530353937392d326561322d386436382d623161362d3263303735303530376362652e706e67" alt="MetaEditCondition2.png" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/54764/32505979-2ea2-8d68-b1a6-2c0750507cbe.png"></a>

<h2><span id="toc4">
USTRUCT</span></h2>

<div class="code-frame" data-lang="cpp">
<div class="code-lang"><span class="bold">unreal_c++</span></div>
<div class="highlight"><pre>
<span class="n">USTRUCT</span><span class="p">([</span><span class="n">Specifier</span><span class="p">,</span> <span class="n">Specifier</span><span class="p">,</span> <span class="p">...])</span>
<span class="k">struct</span> <span class="n">StructName</span>
<span class="p">{</span>
    <span class="n">GENERATED_USTRUCT_BODY</span><span class="p">()</span>
<span class="p">};</span>
</pre></div>
</div>

<ul>
<li><a href="https://docs.unrealengine.com/latest/JPN/Programming/UnrealArchitecture/Reference/Structs/index.html" rel="nofollow noopener" >公式doc</a></li>
</ul>

<div class="code-frame" data-lang="js"><div class="highlight"><pre><span class="kd">class</span> <span class="nx">StructName</span> <span class="cm">/* Struct+Specifier+Specifier+... */</span><span class="p">{</span>
   <span class="nx">properties</span><span class="p">()</span> <span class="p">{</span>
     <span class="c1">//property-declarations</span>
   <span class="p">}</span>
<span class="p">}</span>
</pre></div></div>

<code>UStruct</code>はJSのクラスを作成したうえで、<code>Struct</code>とコメントの最初に記述する。

参考：<a href="https://github.com/ncsoft/Unreal.js/wiki/USTRUCT-and-UCLASS" rel="nofollow noopener" >USTRUCT and UCLASS</a>

<h1>
<span id="補足情報" class="fragment"></span><a href="https://qiita.com/ConquestArrow/items/6c1eac9226aeb5ce2794#%E8%A3%9C%E8%B6%B3%E6%83%85%E5%A0%B1"><i class="fa fa-link"></i></a>補足情報</h1>

<ul>
<li>uclass.jsの中では正規表現で文字列解析して変換している

<ul>
<li>
<code>Function.toString()</code>でソース文字列を引っ張って解析（コメントも取得できる）</li>
<li>なのでここのコードを書き換えるか同様の処理を別のJSでやれば別の記法で型とフラグ情報を付与できる</li>
</ul>
</li>
<li>
<code>UINTERFACE</code>マクロに相当するものはないっぽい？</li>
</ul>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
