<?xml version="1.0" encoding="UTF-8" ?>
<feed xml:lang="ja" xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:thr="http://purl.org/syndication/thread/1.0">
  <title type="text">非現実的な話</title>
  <subtitle type="html">ゲーム、UnrealEngine4などの話題を取り扱います。取り扱う内容は個人の範囲で調べたものなのでご利用は自己責任でお願いします。</subtitle>
  <link rel="self" type="application/atom+xml" href="https://meganeo.blog.shinobi.jp/atom"/>
  <link rel="alternate" type="text/html" href="https://meganeo.blog.shinobi.jp/"/>
  <updated>2014-11-09T15:08:47+09:00</updated>
  <author><name> どんぶつ</name></author>
  <generator uri="//www.ninja.co.jp/blog/" version="0.9">忍者ブログ</generator>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" />
  <entry>
    <id>meganeo.blog.shinobi.jp://entry/70</id>
    <link rel="alternate" type="text/html" href="https://meganeo.blog.shinobi.jp/ue4/%E3%80%90ue4%E3%80%91navmesh%20-%20navsystem" />
    <published>2017-12-24T16:23:45+09:00</published> 
    <updated>2017-12-24T16:23:45+09:00</updated> 
    <category term="UE4" label="UE4" />
    <title>【UE4】NavMesh / NavSystem</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<div>この記事はUnreal Engine 4 (UE4) その2 Advent Calendar 2017の24日目の記事です。</div>
<div></div>
<div><a href="https://qiita.com/advent-calendar/2017/ue4second" title="">Unreal Engine 4 (UE4) その2 Advent Calendar 2017 - Qiita</a></div>
<br />
--------------------------------------------------------------<br />
<br />
UE4のNavigationMeshやNavigationSystemについて調べてみました。<br />
基本的なActorや各種設定、テストの方法などをざっくり纏めています。<br />
以下、ダイジェスト...<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/2017-12-24_16h03_56.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1514099818/" alt="" /></a> <br />
<br />
こんな感じで説明したり...<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/2017-12-24_16h02_11.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1514099823/" alt="" /></a> <br />
<br />
こんな感じで各項目の使い方を見ています。<br />
<br />
<br />
成果物は容量の都合pdfにしました、<a href="https://drive.google.com/file/d/1oJRUrBMw_72_qCwYnJB_14hCFHPBTOdC/view?usp=sharing" title="">こちら</a>からDLできます。<br />
Navigationに興味のある方はどうぞ。<br />
個人で検証したものなので間違ったらこっそり教えてください、、<br />
それではまた来年！<br />
<br />
--------------------------------------------------------------<br />
<br />
明日は最終日、<a href="https://twitter.com/YuukiOgino" title="">@YuukiOgino</a>さんの「The Phantom Knowledge Project for UE4」です。<br />
よろしくお願いします。]]> 
    </content>
    <author>
            <name> どんぶつ</name>
        </author>
  </entry>
  <entry>
    <id>meganeo.blog.shinobi.jp://entry/69</id>
    <link rel="alternate" type="text/html" href="https://meganeo.blog.shinobi.jp/ue4/%E3%80%90ue4%E3%80%91umg%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9Fui%E3%81%AE%E5%AE%9F%E8%A3%85%EF%BC%8B%20-%E3%81%9D%E3%81%AE3-" />
    <published>2015-12-24T02:00:00+09:00</published> 
    <updated>2015-12-24T02:00:00+09:00</updated> 
    <category term="UE4" label="UE4" />
    <title>【UE4】UMGを使ったUIの実装＋ (その3)</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[この記事はUnreal Engine 4 (UE4) Advent Calendar 2015 24日目の記事です。<br />
<br />
-------------------------------------------------------------------------------<br />
<br />
４．Tips<br />
その他、UMGに関して調べたり試したことを適当に乗っけておきます。超雑多。<br />
<br />
４．１．ポーズ<br />
ゲームをポーズしたとき、Actor継承のクラスではTickが停止する。<br />
しかしUserWidgetでは停止しないため更新イベントが走り続ける。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/b9d8ddfb.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450888202/" alt="" /></a> <br />
<br />
こまった...。<br />
<br />
ちょっと回避策を練る。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/183ea9f6.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450888212/" alt="" /></a> <br />
親Widgetを作り、変数にフレーム時間をつっこむ。<br />
ポーズかかってたら0.0を入れておく。<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/ff361d56.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450888221/" alt="" /></a> <br />
以降、作成するWidgetは上記のWidgetを継承し、変数からフレーム時間を取得する。<br />
これでタイマなどDeltaTimeを使用する機能は抑止できる。<br />
ただこれだと毎フレーム呼ばれる問題は残っている。<br />
また、アニメーションも停止できない。<br />
Widgetを量産することを考えると、全WidgetにActorのTick更新制御できる機能が欲しいかな...<br />
<br />
<br />
４．２．Widget<br />
テキストなどを複数配置する時など、以下のように親に貼り付けすると属性や詳細の内容を複製できる。ただそれだけだけど、テキストの複製とか面倒だからね。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/0.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450889236/" alt="" /></a> <br />
<br />
４．３．Invalidiation Box<br />
更新を行わないWidgetに対してキャッシュを使用しない描画をするかどうか。<br />
実験中だけどパフォーマンスは果たして改善するのか。<br />
クラス設定から以下のチェックボックスをチェック。<br />
また、適応するWidgetにもチェックを入れる。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/172296e0.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450889881/" alt="" /></a> <br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/c72728b7.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450890176/" alt="" /></a> <br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/9ba29618.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450889869/" alt="" /></a> <br />
使用前（80fps前後）。<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/443ad317.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450889895/" alt="" /></a> <br />
使用後（110fps前後）。<br />
<br />
確かに効果があった。<br />
ただしこの設定を行った状態で更新を行うWidgetがあると（例えばfpsを表示するテキストを追加したりすると）40fps前後まで下がった。<br />
<br />
<br />
４．４．サウンド<br />
Widget内でサウンドを再生する場合、以下のノードから再生できる。<br />
ただし、以下のノードは単発再生のみなので途中で停止できない。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/c2d73424.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450891082/" alt="" /></a> <br />
<br />
また、User WidgetクラスはComponentを設定することができないのでAudioComponentも配置できない。<br />
<br />
回避策<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/977832a7.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450891303/" alt="" /></a> <br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/838a9381.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450891341/" alt="" /></a> <br />
AudioComponentを変数として用意し、Widget生成時に渡す。<br />
こうすることでWidget内で再生、停止はできるようになった。<br />
実際にサウンドを制御するWidgetが音源データを持っていないのは違和感があるけどとりあえず。<br />
<br />
４．４．描画優先<br />
描画優先順（ZOrder）を整理。<br />

<div>&nbsp;</div>
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/529215a4.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450874283/" alt="" /></a> <br />

<div>・同一Slot内</div>
<div>&nbsp; &nbsp; 異なるZOrder：ZOrder準拠</div>
<div>&nbsp; &nbsp; 同一ZOrder：後優先<br />
<br />
</div>
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/4c0482af.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450874291/" alt="" /></a> <br />

<div>・同一Widget内</div>
<div>&nbsp; &nbsp; 異なるZOrder：ZOrder準拠</div>
<div>&nbsp; &nbsp; 同一ZOrder：後優先<br />
<br />
</div>
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/3585b323.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450874305/" alt="" /></a> <br />

<div>・同一Viewport内</div>
<div>&nbsp; &nbsp; 異なるZOrder：ZOrder準拠</div>
<div>&nbsp; &nbsp; 同一ZOrder：後優先 (Create順)<br />
<br />
</div>
<br />
５．１．参考<br />
５．１．１．参考サイト<br />
その他、更新の新しい公式ドキュメント<br />
<br />
<a href="https://docs.unrealengine.com/latest/JPN/Engine/UMG/UserGuide/WidgetTypeReference/Invalidation/index.html" title="">Invalidiation Box(公式ドキュメント)</a><br />
　UMGのパフォーマンス向上に関して<br />
<a href="https://docs.unrealengine.com/latest/JPN/Engine/UMG/HowTo/EventBasedUI/index.html" title="">イベントでUIの更新を操作する(公式ドキュメント)</a><br />
　UMGを使用したWidgetの更新に関する記載など<br />
<a href="https://docs.unrealengine.com/latest/JPN/Engine/UMG/UserGuide/BestPractices/index.html" title="">UMGのベストプラクティス(公式ドキュメント)</a><br />
　スケーリングや最適化のコツなど<br />
<a href="https://docs.unrealengine.com/latest/INT/Resources/SampleGames/UnrealMatch3/" title="">Unreal Match 3(公式ドキュメント)<br />
</a>　サンプルプロジェクトUnreal Match 3について<br />
<br />
<br />
５．１．２．参考プロジェクト<br />
UMGを使用するにあたって参考になりそうなサンプルプロジェクト<br />
　・ContentExamples<br />
　・Unreal Match 3<br />
<br />
サンプルは全部見れていないのでなんとも言えないのですが、<br />
UMGはVer4.4以降からだったので基本的には初期に出たプロジェクトのUIをUMGで作成しなおすことはされていません（ってどっかのスレで見た気がする）。<br />
<br />
<br />
<br />
以上、2015年UE4アドカレの記事についてでした。<br />
少しでもゲーム制作の参考になれば！]]> 
    </content>
    <author>
            <name> どんぶつ</name>
        </author>
  </entry>
  <entry>
    <id>meganeo.blog.shinobi.jp://entry/68</id>
    <link rel="alternate" type="text/html" href="https://meganeo.blog.shinobi.jp/ue4/%E3%80%90ue4%E3%80%91umg%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9Fui%E3%81%AE%E5%AE%9F%E8%A3%85%EF%BC%8B%20-%E3%81%9D%E3%81%AE2-" />
    <published>2015-12-24T01:00:00+09:00</published> 
    <updated>2015-12-24T01:00:00+09:00</updated> 
    <category term="UE4" label="UE4" />
    <title>【UE4】UMGを使ったUIの実装＋ (その2)</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[この記事は<a href="http://qiita.com/advent-calendar/2015/ue4" title="">Unreal Engine 4 (UE4) Advent Calendar 2015</a> 24日目の記事です。<br />
<br />
-------------------------------------------------------------------------------<br />
<br />
３．３．Widgetの制御<br />
３．３．１．ゲームロジックへの繋ぎこみ<br />
UIの大枠ができたのでゲームロジックに繋ぎこんでいきます。<br />
先程作成したバトル関連情報のWidgetをバトル開始時にCreate、AddtoViewportノードで表示します。バトル開始前の演出として黒フェードも併せて表示する必要があるのでここで同じく生成しておきます。生成元は敵とのエンカウントを検知するPlayerControllerクラスで行います。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/c4f32bf0.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450870927/" alt="" /></a> &nbsp;<br />
<br />
フェード部分はバトル情報よりも上に表示する必要があるため、ZOrder（描画優先度）を予め上げています。<br />
<img src="//meganeo.blog.shinobi.jp/Img/1450871319/" alt="" /><br />
<br />
黒フェードのマスク用WidgetもFullscreenサイズで作成、バトルWidgetと同様に画面上部と画面下部で分けて子Widgetを作成し、フェードが終わったら自分でRemoveしています。<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/28caebea.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450875162/" alt="" /></a> <br />
このWidgetはバトル開始前にしか使わないため、役目を果したら自分でRemoveするようになっています。<br />
<br />
フェード部のマテリアルは以下のようにScalarParameterで制御しています。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/062f30f9.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450875388/" alt="" /></a> <br />
画面上部のフェード部<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/05b20d54.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450875401/" alt="" /></a> <br />
画面下部のフェード部<br />
<br />
フェード演出が終了したらバトル関連情報はプレイヤの情報を更新するだけなので、バトル開始時の処理はこれで完了となります。<br />
<br />
３．３．２．アニメーションとの連携<br />
①シーケンス連動アニメーション<br />
バトル終了後、リザルト画面を表示してリザルトのオープニングアニメーションを行います。このケースではバトル終了を検知したPlayerControllerクラスからリザルト用のWidgetを生成、アニメーション開始制御行っています。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/2969dcf9.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450879621/" alt="" /></a> <br />
ここまで処理が長いとUI制御用のサブレベルを用意して処理はそちらに書いてしまっても良いかもしれません...<br />
リザルトのオープニングアニメーションはこんな感じ。<br />
<iframe width="400" height="225" src="http://www.youtube.com/embed/4CgzJsUp77o" frameborder="0" allowfullscreen=""></iframe><br />
<br />
UMGのデザイナ部にあるタイムライントラックを使うことで簡単にアニメーションを作成することができます。オープニングアニメーションは平行移動だけの単純なアニメーションのため、以下のようにCanvasPanelをそれぞれのWidgetの中央に配置し、平行移動させるだけで実現できます。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/3dc0f536.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450880627/" alt="" /></a> <br />
<br />
また、アニメーション開始&rarr;アニメーション再生&rarr;アニメーション終了&rarr;キー入力許可、とシーケンシャルに動かすため、以下のようにOnAnimationFinishedを使用してアニメーションの終了を通知します（ただしこのイベント、アニメーション終了以外にもアニメーション停止イベント(StopAnimation)でも反応してしまうので注意）。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/ad48e50b.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450881731/" alt="" /></a> <br />
<br />
②単独アニメーション<br />
敵にダメージを与えたときなどに表示するダメージUIなど、シーケンシャルに動かす必要のない独立したUIのアニメーションに関する内容です。こんな感じ&darr;。<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/1feb230b.gif" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450878477/" alt="" /></a> <br />
（gifファイルって結構重いなぁ）<br />
<br />
もちろん表示のトリガイベントは必要なのでそちらは準備します。<br />
このケースではダメージ発生イベントをコントロールするクラス（ATBManagerクラス）からダメージ表示用Widgetを生成しています。被ダメージキャラの中心に表示したいので、キャラクターのケツの位置（SkeltalMeshからBone"Hips"のワールド座標を取得）をスクリーン座標に変換し、Widgetの表示位置を設定しています。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/eaf42a40.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450882510/" alt="" /></a> <br />
<br />
先程と同様にアニメーションの終了をとりますが、ダメージ表示が終わったら用済みとなるためRemove from Parentで消えてもらいます。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/ec3c997c.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450882489/" alt="" /></a> <br />
<br />
アニメーションとの連携の一例を載せてみました。<br />
UIにアニメーションを付けるとよりゲームっぽくなりますね。<br />
<br />
（その3）に続く&rarr;]]> 
    </content>
    <author>
            <name> どんぶつ</name>
        </author>
  </entry>
  <entry>
    <id>meganeo.blog.shinobi.jp://entry/67</id>
    <link rel="alternate" type="text/html" href="https://meganeo.blog.shinobi.jp/ue4/%E3%80%90ue4%E3%80%91umg%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9Fui%E3%81%AE%E5%AE%9F%E8%A3%85%EF%BC%8B%20-%E5%AE%9F%E8%A3%85%E7%B7%A8-" />
    <published>2015-12-24T00:00:00+09:00</published> 
    <updated>2015-12-24T00:00:00+09:00</updated> 
    <category term="UE4" label="UE4" />
    <title>【UE4】UMGを使ったUIの実装＋ (その1)</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<br />
この記事は<a href="http://qiita.com/advent-calendar/2015/ue4" title="">Unreal Engine 4 (UE4) Advent Calendar 2015</a> 24日目の記事です。<br />
<br />
-------------------------------------------------------------------------------<br />
<br />
１．はじめに<br />
「UE4使ってみたけどUIってどう作るんだろう」「サンプルあるけどちょっと足りないなぁ」<br />
そんなことからこの記事を書いてみました。<br />
UE4にはUIを簡単に構築できる<a href="https://docs.unrealengine.com/latest/INT/Engine/UMG/" title="">UMG</a>という機能があります。<br />
そこで今回はUMGの機能、UMGを使用したUIの実装に関してざっくばらんに紹介します。<br />
<br />
<br />
今回はサンプルとして某ゲームのUIを作成してみました。<br />
こんな感じ&darr;のUIを作ってみます。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/14.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450717721/" alt="" /></a> <br />
（FinalFantasy7です。以降、FF7のキーワードが出てきます。未プレイの方はごめんなさい...）<br />
<br />
<br />
-------------------------------------------------------------------------------<br />
２．ワークフロー<br />
実装に入る前にUI作成のワークフローについて少し。私がUIを実装する時は以下のような手順で作成します。この方法が正しいとも限りませんし、もっと効率の良い方法があるかもしれませんので、そこら辺はご了承下さいませ。<br />
<br />
----------------------------------------------------------------<br />
【UI実装の手順】<br />
①：大枠を作りアタリをつける<br />
　　　　&darr;<br />
②：パーツ化する部分を決める<br />
　　　　&darr;<br />
③：②でパーツ化した部分を細分化、実装<br />
　　　　&darr;<br />
④：③で生成したWidgetを組み合わせて②を構築<br />
　　　　&darr;<br />
⑤：④で生成したWidgetを組み合わせて①を構築<br />
　　　　&darr;<br />
⑥：ロジックへの接続<br />
----------------------------------------------------------------<br />
<br />
<br />
①：大枠を作りアタリをつける<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/701a24cd.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450806076/" alt="" /></a> <br />
全体のイメージを掴むため、パレット内のオプションを使って適当に配置していきます。<br />
この段階ではアンカー（Widgetの基準位置）や細かいスケールは気にせず気楽に配置します。<br />
作業自体はアーティストなどの手を要さずにでき、下手に絵コンテなどを作成するよりもスピードが速く効率的かと思います。<br />
<br />
<br />
②：パーツ化する部分を決める<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/d5c5c286.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450807118/" alt="" /></a> <br />
①で作成した全体概要を元にパーツ化する部分を決めます（構想だけ）。<br />
色互いに枠で囲まれている部分がパーツ化する部分です。<br />
<br />
<br />
③：②でパーツ化した部分を細分化<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/aac510cc.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450807147/" alt="" /></a> <br />
②でパーツ化した箇所を、緑枠のようにさらに細分化します（構想だけ）。<br />
ここでは他のUIで使い回すことを意識して細分化します。<br />
例えばHPのテキストやリミットゲージなどは、バトルメニュー以外にもフィールドメニュー等で使い回すので、ここでは細分化の対象としておきます。<br />
<br />
<br />
④：③で生成したWidgetを組み合わせて②を構築<br />
⑤：④で生成したWidgetを組み合わせて①を構築<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/27.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450851450/" alt="" /></a> <br />
パーツ化したWidgetを組み合わせて親Widgetを作成します。<br />
また親側から子に対する制御、参照部を作成します。<br />
　　　　&darr;<br />
⑥：ロジックへの接続<br />
UIを制御するきっかけとなる処理（トリガイベント、キー入力など）を作成します。<br />
<br />
<br />
ウォーターフォールモデル開発と同じような手順ですが、<br />
UI自身の役割、機能を明確にしたり、作業を分業化するのに向いているかと思います。<br />
-------------------------------------------------------------------------------<br />
<br />
３．実装<br />
３．１．パーツ部の実装<br />
３．１．１．Timeゲージ<br />
既に実装手順の①～③は上の方で作成したので早速パーツ部分を実装してみます。<br />
ここではActiveTimeBattleの肝である、プレイヤーの時間を管理するTimeゲージを実装します。<br />
ゲージは待機中、行動待ち、行動中の3色が存在し、時間と共に増加します。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/f40a5288.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450810327/" alt="" /></a> <br />
<br />
<img src="//meganeo.blog.shinobi.jp/File/f8416831.png" alt="" /> &nbsp;<br />
今回は背景のテクスチャ、ゲージ用マテリアルで構築してみました。<br />
<br />
①背景テクスチャ<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/1bbe94b9.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450809764/" alt="" /></a> <br />
アンカーをX:0.5、Y:0.5に設定し、キャンバスの中央にテクスチャを配置しています。<br />
サイズはViewportサイズ基準で適当な数値を設定します。<br />
Imageにテクスチャを指定し、テクスチャ設定を"UI"に設定しておきます。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/61a2dc09.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450810366/" alt="" /></a> <br />
<br />
②ゲージ部マテリアル<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/17bbccd6.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450809786/" alt="" /></a> <br />
ゲージ部は動的に変化させる必要があるため、マテリアルを設定します。<br />
サイズ、アンカーは①と同様な設定、表示上の微調整が必要な部分はMarginで補正します。Marginの内容に関しては以下のサイトで詳しく解説されており、UI設計でテクスチャ、マテリアルを頻繁に使い回す場合など良く使います。<br />
<br />
<a href=" http://historia.co.jp/archives/3864" title="">[UE4] 枠線の太さはそのままで拡大縮小できるUIの作り方 (株式会社ヒストリア様 ブログ)</a><br />
<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/4e025e88.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450811490/" alt="" /></a> <br />
<br />
ゲージ部分のマテリアルは上記のように（ContentExampleのサンプルを流用）作成し、<br />
ゲージの割合をScalarParameter、ゲージのActive/Deactiveな部分のカラーをVectorParameterで外部から指定できるようにしています。<br />
<br />
さらにUIでマテリアルを使用する場合はマテリアル属性を変更しておく必要があります。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/13.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450812900/" alt="" /></a> <br />
ここまでがデザイナ部分の設定となります。<br />
次にグラフ部分の実装を行います。<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/53ae8e17.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450815877/" alt="" /></a> <br />
パーツ化したWidgetの機能はそのWidget内で機能を完結させることを目的とし、ゲージ部に必要な情報を変数として用意します。更新フラグ、ゲージ割合、状態、カラー情報などを一通り用意し、Construct（Widget生成時に呼ばれる箇所）でゲージ部分のマテリアルを生成します。<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/a949751b.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450816633/" alt="" /></a> <br />
次にゲージ割合を更新する関数（UpdateGauge）を作成します。<br />
ゲージ割合を更新したタイミングでマテリアルをWidgetに反映し、さらにステートが変化したら色を更新する流れとなっています。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/17.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450817241/" alt="" /><br />
</a>現在の状態取得<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/16.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450816973/" alt="" /></a> <br />
状態に応じた色の更新<br />
これでゲージの割合とゲージの色更新部分はできました。<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/3a856a4c.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450817609/" alt="" /></a> <br />
あとは任意のタイミング（プレイヤのターンが回ってきた時に）で上記の関数を呼び出せば、ゲージを水色&rarr;黄色&rarr;橙色に更新することができます。バトルでは複数プレイヤのTimeゲージが100%になることがあるため、ゲージをActiveにするタイミングはプレイヤの時間を管理するクラスから一番早くATBバーが貯まったプレイヤに対してSetActive関数にアクセスしてActive状態とします。<br />
<br />
<br />
<br />
３．１．２．名前テキスト<br />
次に名前のテキストに関する実装を行います。<br />
名前も同様に状態によってテキストの色が変わる動作となり、プレイヤに行動が回ってくると1番目(白色)と2番目(灰色)のブリンク表示となります。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/19.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450818935/" alt="" /></a> <br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/22.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450821603/" alt="" /></a> <br />
<br />
上記の動作から、名前テキスト用Widgetで変更が必要なのは「テキスト内容」と「テキストColor」となります。これらはBind機能を使用して更新します。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/21.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450820548/" alt="" /></a> <br />
<br />
<a href="https://docs.unrealengine.com/latest/JPN/Engine/UMG/UserGuide/PropertyBinding/index.html" title="">プロパティのバインディング（公式ドキュメント）</a>&nbsp;<br />
今回のケースでは変数Bindと関数Bindで分けて使用していますが、変数BindはWidget内に同型の変数が存在すればアクセスできます（候補として出てくる）。本ケースでは変数"Text"に"グレーマン"とSetすることでテキスト内容に反映することができます。<br />
また、関数Bindに関しては同型の出力を持ち、かつ入力が存在しない関数であればアクセスできます。Widget更新に関しては、Bindアクセス以外にも、上記Timeゲージで使用したイベント駆動アクセスがありますが、処理負荷などの面で使い分けを行う必要があります。詳細は後述で触れます。<br />
<br />
次にテキストColor部分の実装です。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/20.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450820558/" alt="" /></a> <br />
<br />
はじめにfloat型変数"HP Rate"で残HPの割合をチェックしており、残HPが0の場合はColor：Red、被Active状態ではColor：White、Active状態ではタイマとして用意している変数の値に応じてColor：White、Color：Grayを設定しています。ここでColor情報はPure関数から取得していますが、テキストのカラーはシステム共通だったりすることを考慮して（他のテキストでColor情報を設定する際にそれぞれでRGBを指定するのが面倒なので共通化してしまいました...）BlueprintFunctionLibrary経由でMaterialParameterCollectionから取得しています。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/23.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450823117/" alt="" /></a> <br />
<br />
あとは準備した変数に対して適切な値を設定してあげれば名前テキストの実装は完了となります。<br />
<br />
<br />
<br />
３．２．パーツを組み合わせ<br />
３．１．でパーツ部分をいそいそと作ったら、ワークフローを逆になぞるようにWidgetを組み合わせて集約していきます。パーツ化したWidgetは他のWidgetで使用することができ、親子関係を作ることができます。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/24.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450823879/" alt="" /></a> <br />
上記はパーツ化したTimeゲージや名前テキストを組み合わせたWidgetです。<br />
以下のように１人のプレイヤーの情報として纏めてしまい、子Widget側では自分の機能だけを果たすようにしてしまいます。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/26.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450824861/" alt="" /></a> <br />
<br />
さらにパーツ化したWidgetを組み合わせると以下のように全体像が見えるようになりました。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/25.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1450823891/" alt="" /></a> <br />
<br />
以上、UIの作成に関する一例を挙げてみました。<br />
これでUIの大枠が完成しました。<br />
<br />
（その2）に続く&rarr;]]> 
    </content>
    <author>
            <name> どんぶつ</name>
        </author>
  </entry>
  <entry>
    <id>meganeo.blog.shinobi.jp://entry/65</id>
    <link rel="alternate" type="text/html" href="https://meganeo.blog.shinobi.jp/ue4%E5%BF%98%E5%82%99%E9%8C%B2/localmapoptions%20%E3%82%92%E4%BD%BF%E3%81%86" />
    <published>2015-10-13T01:24:11+09:00</published> 
    <updated>2015-10-13T01:24:11+09:00</updated> 
    <category term="UE4忘備録" label="UE4忘備録" />
    <title>【UE4】LocalMapOptions を使う</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<br />
デバッグ機能？<br />
Project設定にある「LocalMapOptions」について。<br />
<br />
<img src="//meganeo.blog.shinobi.jp/Img/1444665867/" alt="" /><br />
<br />
Name型の値を入力できる。<br />
ここで入力した値は、DefaultMapで指定したMap名に＋してロードされる。<br />
<br />
例えば、以下の場合<br />
GameDefaultMap：/Game/Maps/Level_P<br />
LocalMapOptions：_test<br />
<br />
初回でロードされるMapは、<br />
「/Game/Maps/Level_P_test」となる。<br />
<br />
ちなみに、Editorからのゲーム開始時には影響を及ぼさず、<br />
DevelopやShipping起動時には有効となる。<br />
コンソール系のコマンドとして活用できるかとも思ったがNG。<br />
<br />
<br />
使い道は・・・<br />
「起動時のロードレベルを容易に切り替えできる」ということぐらいでしょうかね。<br />
例えば、Packageしたゲームの動作確認をする際に、<br />
本流用MapとDebug用Mapを用意して動作の違いを検証できる、とか。<br />
<br />
一例として、以下のLevelを用意する<br />
本流用Map　：Level_P<br />
Debug用Map：Level_P_test<br />
<br />
Project設定なので、Config（DefaultEngine.ini）設定によって<br />
「LocalMapOption=」と「LocalMapOption=_test」を切り替えればOK。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/c06c0816.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1444666617/" alt="" /></a> <br />
<br />
ソース見る限りだと使いどころはこのくらいかな。<br />
という覚え書きでした。<br />
]]> 
    </content>
    <author>
            <name> どんぶつ</name>
        </author>
  </entry>
  <entry>
    <id>meganeo.blog.shinobi.jp://entry/63</id>
    <link rel="alternate" type="text/html" href="https://meganeo.blog.shinobi.jp/ue4/%E3%80%90ue4%E3%80%91profile%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" />
    <published>2015-08-18T22:48:16+09:00</published> 
    <updated>2015-08-18T22:48:16+09:00</updated> 
    <category term="UE4" label="UE4" />
    <title>【UE4】profileについて</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[profileの方法について。<br />
<br />
・コンソールコマンド &rdquo;stat unitgraph&rdquo;&nbsp;<br />
　&rArr;CPU、GPUの使用状況をグラフ化<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/ca4d17e9.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1439931297/" alt="" /></a> <br />
<br />
------------------------------------------------------------------------<br />
<br />
・SessionFrontend<br />
　コンソールコマンド &rdquo;stat startfile&rdquo;：profile開始&nbsp;<br />
　コンソールコマンド &rdquo;stat stopfile&rdquo;：profile終了&nbsp;<br />
<br />
【使い方】<br />
ゲーム開始前に"stat startfile"を入力<br />
ゲーム終了時に"stat stopfile"を入力<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/b9939ca5.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1439930944/" alt="" /></a> <br />
<br />
[ウィンドウ]-&gt;[デベロッパーツール]-&gt;[セッションフロントエンド]を選択<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/af67fe5d.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1439930957/" alt="" /></a> <br />
<br />
[プロファイラ]タブを選択、メニューの[ロード]から.ue4statusファイルを選択<br />
（キャプチャに成功していたらファイルが生成される）<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/198f8234.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1439930968/" alt="" /></a> <br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/3a70431d.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1439930991/" alt="" /></a> <br />
<br />
ロードに成功したら処理負荷の高そうな箇所にポイントを当て、<br />
ゲーム内処理の負荷を確認する場合は、[GameThred]から階層を降りていくことで処理負荷の掛かっている箇所を特定。<br />
&nbsp;<a target="_blank" href="//meganeo.blog.shinobi.jp/File/5a65507d.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1439932407/" alt="" /></a> <br />
<br />
------------------------------------------------------------------------<br />
この２つがあれば、大抵は何とかなる？<br />
手持ちのカードが少ないので、まだまだ調べる必要がありそう。<br />
profileとこの前のExitCodeに関してはVerup毎に更新したいと思っています。]]> 
    </content>
    <author>
            <name> どんぶつ</name>
        </author>
  </entry>
  <entry>
    <id>meganeo.blog.shinobi.jp://entry/62</id>
    <link rel="alternate" type="text/html" href="https://meganeo.blog.shinobi.jp/ue4%E5%BF%98%E5%82%99%E9%8C%B2/%E3%80%90ue4%E3%80%91purecast%E3%81%AE%E8%A8%AD%E5%AE%9A" />
    <published>2015-08-17T23:50:11+09:00</published> 
    <updated>2015-08-17T23:50:11+09:00</updated> 
    <category term="UE4忘備録" label="UE4忘備録" />
    <title>【UE4】PureCastの設定</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[小ネタをちょくちょく入れる昨今です。<br />
（世間一般的には「手抜き」と呼ばれ敬遠されます。）<br />
<br />
<br />
さて、お手元に『UnrealEngine4で極めるゲーム開発』はありますでしょうか。<br />
こちらのp320-321に記載のある通り、Castについては純粋化を推奨されております。<br />
何故かはp321のColumnを読んで下さい。<br />
お手元に無い人は買いましょう！<br />
<br />
購入はこちらから&darr;<br />
<a href="http://www.amazon.co.jp/gp/product/4862462553/ref=s9_simh_gw_p14_d8_i2?pf_rd_m=AN1VRQENFRJN5&amp;pf_rd_s=desktop-1&amp;pf_rd_r=178CJXAS4671JT4T7ZZH&amp;pf_rd_t=36701&amp;pf_rd_p=207655209&amp;pf_rd_i=desktop" title="">Amazonのページ</a><br />
<br />
<br />
さて、以下はCastの純粋化していないもの（上）と、純粋化したもの（下）です。<br />
（このノードではCastする必要ないのですがあくまで一例）<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/2b582313.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1439833294/" alt="" /></a> <br />
<br />
純粋化する前のノードを純粋化するには、右クリックで[純粋キャストに変更]を選択する必要があります。下の図がそれ。デフォルトでCastを検索すると純粋化されていないものが出てきます。<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/5714a9af.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1439833854/" alt="" /></a> <br />
<br />
右クリック、マウス選択と、２手間かかってます。<br />
Castを使用する度に2手動かすの大変じゃないですか？<br />
※私は大変な面倒くさがりなのでこの手間も惜しくて仕方ありませんが、面倒くささには個人差があります<br />
<br />
<br />
でですね、探していたものありました。<br />
<br />
<br />
ツールバー[編集]&rarr;[エディタの環境設定]&rarr;[ブループリントエディタ]&rarr;[Experimental]&rarr;[純粋キャストノードの使用をデフォルトにする]<br />
<br />
これにチェックを入れましょう。<br />
デフォルトで純粋Castが出てきます。<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/d7e4ffc6.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1439833303/" alt="" /></a> <br />
<br />
１点だけ、「Experimental」になってるのでご利用は計画的に。]]> 
    </content>
    <author>
            <name> どんぶつ</name>
        </author>
  </entry>
  <entry>
    <id>meganeo.blog.shinobi.jp://entry/61</id>
    <link rel="alternate" type="text/html" href="https://meganeo.blog.shinobi.jp/ue4/%E3%80%90ue4%E3%80%91gameinstance%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" />
    <published>2015-08-16T07:24:21+09:00</published> 
    <updated>2015-08-16T07:24:21+09:00</updated> 
    <category term="UE4" label="UE4" />
    <title>【UE4】GameInstanceについて</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<h2>GameInstanceとは</h2>
レベルを跨いで値を保持することができるクラスです。<br />
以下の場所からGameInstanceクラスを設定します。<br />
ここに設定しないと個別で作成したクラスは動作しません。<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/d70e0d1e.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1439647689/" alt="" /></a> <br />

<h2>なぜGameInstanceが存在するか</h2>
　「レベルを跨いで値を保持することができる」の意味が分かる方はすっ飛ばして下さい。<br />
　UE4の場合、Level上に存在するActorを制御することでゲームを構築していますが、Levelが切り替わって別のLevelに遷移した場合、遷移前のLevel、Actorの情報は全てクリアされてしまうため、ゲーム共通の情報を持つ場合はどこかで値を保持しておく受け皿が必要になってきます。<br />
（上記のLevelはPersistentLevelを指します）<br />
　例えば、オプション画面（オプション画面用Level）でゲーム内音量設定をした場合、その設定情報はゲーム内の音量に連動させなくてはならないため、ゲーム中画面（ゲーム用Level）に移行するまで保持しておかなくてはなりません。GameInstanceを使用して設定情報をオプション画面でSet、ゲーム画面でGetすることで、ゲーム内の共通の情報を扱うことができます（グローバル変数のような扱い）。<br />
<br />
<br />
<span style="font-size: 21px; font-weight: bold;">値保持だけが役割？</span><br />
<br />
　ここからが本題。<br />
GameInstanceといえば「値を保持できる」ことは結構知られていますが、他には何かないものでしょうか。GameInstanceに関するドキュメントはAPIくらいしか見当たらなかったのでソースも含めて調べてみました。Verは4.8.3です。<br />
<br />
<a href="https://docs.unrealengine.com/latest/INT/API/Runtime/Engine/Engine/UGameInstance/index.html" title="">UGameInstance(公式ドキュメント)<br />
</a><br />
<br />
<span style="font-size: 21px; font-weight: bold;">先に結論</span><br />
　GameInstanceの機能に関して簡潔にまとめると以下の３点です。<br />
<br />
　・レベルを跨いだ値の保持<br />
　・ゲーム中のプレイヤー管理<br />
　・ネットワークリプレイの管理<br />
<br />
<span style="font-size: 21px; font-weight: bold;"></span>　ゲーム中のプレイヤー管理に関しては、マルチプレイ時などのクライアント側プレイヤーのことを示します。ネットワークリプレイに関しては、<a href="http://meganeo.blog.shinobi.jp/ue4/%E3%80%90ue4%E3%80%91ver4.8%E3%81%AE%E6%96%B0%E6%A9%9F%E8%83%BD%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B%EF%BC%88netw" title="">先の記事</a>でも触れていますが、Ver4.8で追加された録画機能のことを示します。オフラインでも録画できますが。<br />
以上、GameInstanceの機能についてです。これ以降は、上記の補足です。<br />
<br />
<br />
<span style="font-size: 21px; font-weight: bold;">１．Blueprint</span><br />
<br />
Blueprint(以下、BP)に公開されているイベントは以下の4種です。いずれも"BlueprintImplementable"なので、C++側で検出したイベントをBPで受信して駆動します。<br />
これ以外のイベントに関してはBPへ公開されていないため使用できません。<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/ced95514.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1439644185/" alt="" /></a> <br />
<br />
① Event Init<br />
名前の通りGameInstance初期化時に呼ばれます。<br />
<br />
② Event Shutdown<br />
名前の通りゲーム終了時に呼ばれます。<br />
<br />
③ Event TravelFailure<br />
マルチプレイなどクライアント－サーバ間のエラー発生時、レベル遷移時などに呼ばれます。<br />
オプションとして障害要因(以下参照)がついてきます。<br />
<br />
<a href="https://docs.unrealengine.com/latest/INT/API/Runtime/Engine/Engine/ETravelFailure__Type/index.html" title="">障害要因：ETravelFailure::Type（公式ドキュメント）</a><br />
<br />
④ Event NetworkError<br />
オンラインゲームなどネットワークエラーの発生時に呼ばれます。<br />
オプションとして障害要因がついてきます。<br />
こっちはドキュメント無かったので割愛。<br />
<br />
以上、できることは少ないですが、セーブデータの展開や強制終了時の割り込み処理などはここで実装できなくもなさそうです。<br />
<br />

<h3><span style="font-size: 21px; font-weight: bold;">余談</span></h3>
　ちょっと余談なのですが、GameInstanceはPIE実行時とStandalone実行時で振る舞いが異なります。ここで言う振る舞いとは、「GameInstanceの生成／解放」のことなのですが、以下の違いがあります。<br />
<br />
・PIE実行<br />
　実行の度にGameInstanceを作成<br />
　終了の度にGameInstanceを解放<br />
<br />
・Standalone実行<br />
　実行時にGameInstanceを作成<br />
　終了時にGameInstanceを解放<br />
<br />
　殆ど違いはありませんが、PIEだと実行する度に作成しており、ソース上でもGameInstanceの生成処理はPIE用とStandalone用で明確に分かれています。何故このような違いがあるかというと、「PIEだとEditor上でGameInstanceクラスを変更できるのに対し、Standaloneだと決まったGameInstanceを使うということが分かっているから」と勝手に解釈していますが、本当の理由までは分かりません。ニュアンス的には合ってそうだと思いますが...<br />
<br />
　また、これ利用すればゲーム起動時の不具合の切り分けにも使えそうです。<br />
「Editorだと正常に動くんだけど、Packageだとクラッシュする」なんて時にログから追おうとします。GameInstanceの生成が完了した時に以下のように「Game Engine Initialized.」とログが出力されます。これより以前であればデバイス、Pluginの設定、Engineの問題？などが考えられます。StandaloneだとEngineの初期化処理の最後にGameInstanceを生成するため、このログが出力された後にCrashしたりしていればゲーム側に問題がありそうです。<br />
（実際にはクラッシュレポートやエラーログが出るので、あくまで切り分け程度に）<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/b58e51d1.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1439648135/" alt="" /></a> <br />
※ゲームログは[Saved]-&gt;[Logs]の中に.logファイルがあります<br />
<br />
<br />
<span style="font-size: 21px; font-weight: bold;">２．C++</span><br />
<br />
　C++からの操作だとプレイヤー管理、ネットワークリプレイに関する色んなことができます。と、詳しくは一番上のAPIドキュメント参照なのですが、サンプルプロジェクトのShooterGameが非常に参考になります（寧ろShooterGame以外のプロジェクトだとGameInstanceを使用していないケースしか見当たらない...）。<br />
　サンプルとは言えソースは出せなさそうなので、内容に関しては、サンプルプロジェクトから参照下さい。Slateを使ったネットワークリプレイ機能の実装、ネットワークを利用したマルチプレイ機能の実装が参考になりそうです。<br />
<br />

<h3><span style="font-size: 21px; font-weight: bold;">その他</span></h3>
・Exc<br />
　コンソールコマンドの入力はFExcクラスで受信した後、入力の内容に応じて各クラスに処理を委譲します。GameInstanceクラスでは"Open [Level名]"のコマンドのみ、処理を行います。<br />
　"Open [Level名]"は指定したLevelに遷移するコンソールコマンドで、[Level名]が存在していれば正常に遷移します。注意したいのが[Level名]が存在しない時（失敗時）の振る舞いがVer4.7と4.8で異なることです。Ver4.7では失敗時、特に何も起きず現在の状態を継続します。Ver4.8では失敗時、PIE起動だとPIEを強制終了、Standalone起動だと現在のLevelを再起動する動作となります。これが仕様変更によるものなのか、不具合によるものなのか分かりませんが動作が変わっている点では注意が必要です。以下の図は、Ver4.8 PIE実行時にコマンド失敗した時のログです。強制終了していることが出力されています。<br />
<br />
<img src="//meganeo.blog.shinobi.jp/Img/1439671576/" alt="" /> <br />
<br />
<span style="font-size: 21px; font-weight: bold;">まとめ</span><br />
<br />
マルチプレイなし、オンライン対応なしのゲームであれば、<br />
値の保持にしか使わなそうですね！！]]> 
    </content>
    <author>
            <name> どんぶつ</name>
        </author>
  </entry>
  <entry>
    <id>meganeo.blog.shinobi.jp://entry/60</id>
    <link rel="alternate" type="text/html" href="https://meganeo.blog.shinobi.jp/ue4/%E3%80%90ue4%E3%80%91animationblueprint%E3%81%AE%E8%A4%87%E8%A3%BD" />
    <published>2015-08-15T23:30:12+09:00</published> 
    <updated>2015-08-15T23:30:12+09:00</updated> 
    <category term="UE4" label="UE4" />
    <title>【UE4】AnimationBlueprintの複製</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<h2><span style="font-size: 14px; font-weight: normal;" data-mce-mark="1">Tips系記事。</span><br />
<br />
目的</h2>
<div>　同一処理、アニメーションシーケンスを有するAnimationBlueprintを作成します。<br />
以下、AnimationBlueprint表記を"ABP"と省略します。<br />
検証バージョンは4.8.3です。<br />

<h2>ドキュメント</h2>
<div>以下、公式ドキュメントでアニメーションのリターゲットに触れられています。<br />
<br />
・<a href="https://docs.unrealengine.com/latest/JPN/Engine/Animation/AnimationRetargeting/index.html" title="">１．アニメーション リターゲット（同じスケルトン）</a><br />
・<a href="https://docs.unrealengine.com/latest/JPN/Engine/Animation/RetargetingDifferentSkeletons/index.html" title="">２．アニメーション リターゲット（異なるスケルトン）</a><br />
<br />
上記ドキュメントでは<br />
　１．同一スケルトンでアニメーションをリターゲットする方法<br />
　２．異なるスケルトン同士のアニメーションをリターゲットする方法<br />
について書かれています。<br />
<br />

<h2>違う、そうじゃない！</h2>
やりたいのは<br />
『異なるスケルトン、異なるアニメーションを持つ複数アセットを同一処理、アニメーションシーケンスで動かす』こと。<br />
例えば、村人A、Bがいるとして、それぞれ「話しかけた時」「攻撃した時」に以下の動作を行うとします。<br />
<br />
村人Ａ：　話しかける&rArr;こちらを向く　、攻撃する&rArr;驚く<br />
村人Ｂ：　話しかける&rArr;攻撃する　　　、攻撃する&rArr;反撃する<br />
<br />
　村人Ｂの人間性については一先ずおいといて、「話しかける」、「攻撃する」というプレイヤーのアクションに対して、双方何らかのリアクションを行います。なので、ABPの処理としてはプレイヤーのアクションに対して、双方とも対応するアニメーションを再生するだけで良いのです。スケルトンが同一の場合、かつ同じリアクションをとるケースであればABPは１つで済むのですが、スケルトンが異なり、かつリアクションが異なる上記のケースではABPを2つ用意する必要があります。<br />
<br />

<h2>2つ分ABPを新規作成すればいいのでは？</h2>
　手間がかかる。<br />
変数作成して、アニメーションブレンドして、ステータス作って・・・など、アクションが増えるほど新規作成は手間なので類似するものはサクッと複製しましょ。<br />
<br />

<h2>概要</h2>
【前提】<br />
村人Ａ、Ｂのスケルトン、メッシュ、再生するアニメーションアセットがあるものとします<br />
<br />
【手順】<br />
①：とりあえず村人Ａ用のABPを用意する<br />
②：①で作成したABPのリターゲットを行いABPを複製する<br />
③：②で複製した（新規作成した）ABPのアニメーションを置き換える<br />
<br />
上記３つの手順でサクッとできます。<br />
<br />

<h2>詳細</h2>
　例としてマーケットプレイスのアニメーションスターターパックを使用します。<br />
既にアニメーションやらABPが色々入ってますが、今回はAdamのABPをAlphaに適用することで<br />
Alphaに同じ動きをさせることを実現します。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/de24ce8e.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1439590281/" alt="" /></a> <br />
<br />
<br />
①：村人Ａ用のABPを用意する<br />
　アニメーションスターターパックは最初からABPも入っているので特に何もする必要はありません。下記赤枠のABPを複製していきます。<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/d64a03fa.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1439590517/" alt="" /></a> <br />
<br />
<br />
②：①で作成したABPのリターゲットを行いABPを複製する<br />
　複製元ABPを右クリック、[Animブループリントをリターゲットする]&rarr;[Animブループリントとリターゲットを複製]を選択します。<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/e9799fee.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1439590964/" alt="" /></a> <br />
<br />
　リターゲットViewerが表示されるので、「リファレンスアセットを再マップする」、「互換性のあるスケルトンのみを表示」のチェックを外し、一覧に表示するアセット一覧から複製先のスケルトンを選択します。今回はAlphaに移植するため[Mixamo_Alpha_Skeleton]を選択します。<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/154a0c78.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1439590975/" alt="" /></a> <br />
<br />
<br />
③：②で複製した（新規作成した）ABPのアニメーションを置き換える<br />
　②の操作を行った時点で複製先のSkeletonと同一フォルダ内にABPが複製されます。複製元ファイル名+"_Copy"というファイル名で複製されるため、とりあえずファイル名を変更して保存します。<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/e797c131.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1439592535/" alt="" /></a> <br />
<br />
　上記で保存したファイルを開くとコンパイルエラーが出ているかと思います。<br />
一度[コンパイル]を選択してエラーとなっている箇所を修正します。<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/e83d4f64.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1439592536/" alt="" /></a> <br />
<br />
　ここで表示されるエラーは「アニメーションの設定が外れている」エラーだけなので、対象のキャラに合ったアニメーションを再設定していくだけで解決できます。別スケルトンの情報を複製してきているので、複製先のスケルトンに設定されていないアニメーション（複製元のアニメーション）はエラーとなります。このエラーを全て修正できれば複製作業は完了です。<br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/f3792891.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1439592537/" alt="" /></a> <br />
<br />
<br />
<span style="font-size: 21px; font-weight: bold;">まとめ</span><br />
<br />
一から新規作成するよりはずっと簡単に複製できるはずです。<br />
どんどん楽をしましょー。</div>
</div>]]> 
    </content>
    <author>
            <name> どんぶつ</name>
        </author>
  </entry>
  <entry>
    <id>meganeo.blog.shinobi.jp://entry/59</id>
    <link rel="alternate" type="text/html" href="https://meganeo.blog.shinobi.jp/ue4%E5%BF%98%E5%82%99%E9%8C%B2/%E3%80%90ue4%E3%80%91lightrebuilderror%EF%BC%88%E3%81%9D%E3%81%AE%EF%BC%91%EF%BC%89" />
    <published>2015-08-07T03:27:53+09:00</published> 
    <updated>2015-08-07T03:27:53+09:00</updated> 
    <category term="UE4忘備録" label="UE4忘備録" />
    <title>【UE4】LightRebuildErrorについて</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<h2><br style="font-size: 14px; font-weight: normal;" /><span style="font-size: 14px; font-weight: normal;" data-mce-mark="1">メモメモ。<br />
</span><br />
これなんで出るん？</h2>
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/build.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1438882399/" alt="" /></a> <br />
<br />
ライトビルド時間掛かるからできるだけやりたくない。<br />
コンソールコマンドで消せるけど正しい状態を維持したい。<br />
&rArr;正しいお作法を学べば回避できるじゃないか！<br />
<br />

<h2>エラー条件</h2>
このエラーが出る操作は以下の通り。<br />
<br />

<div>・DirectionalLightのRotationが可変時</div>
<div>・SpotLight、PointLightのLocationが可変時</div>
<div>・SkyLightは影響しない</div>
<div>　&rArr;SkyLightはLightだけど扱いが他Lightと異なる<br />
<br />

<div>・DirectionalLight、SpotLight、PointLightは "ALight" 継承のActor<br />
・SkyLightは"AInfo"継承のActor<br />
　&rArr;"AInfo"は設定情報を持つだけのActor、GameModeやWorldSettingも"AInfo"継承<br />
　&rArr;全く別物のためSkyLightはエラー検出の対象外として考える</div>
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/28abb021.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1438883220/" alt="" /></a> <br />
<br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/83ca5e8f.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1438883234/" alt="" /></a> <br />
<br />
<br />

<h2>もうちょい突っ込むと</h2>
・エディタ起動だと出る<br />
・Shipping、DebugTestでは出ない<br />
・ライトの情報はレンダリングスレッドで常に更新<br />
　&rArr;PIE実行中でなくともチェック<br />
・コンソールコマンド「DumpUnbuiltLightInterractions」でどのライトがエラーとなっているかを表示することができる。以下の例だと、"SpotLight 2"がエラー対象。Viewportには出ない。OutputLogに出る。</div>
<div><br />
<a target="_blank" href="//meganeo.blog.shinobi.jp/File/1eae3fae.png" title=""><img src="//meganeo.blog.shinobi.jp/Img/1438885327/" alt="" /></a> <br />
<br />
・コンソールコマンド「DisableAllScreenMessages」でエラー表示を消せる。<br />
　&rArr;全部消える＆ライト異常には変わりないので意味がない！<br />
<br />

<h2>ちょっとまとめ</h2>
・影に変更があった時ではなく、影を生成するものに変化があった時に出る<br />
&rArr;正確にはライトの持つStaticShadowの情報、もしくはDynamicShadowの情報のいずれかに変化があった時<br />
&rArr;それはそうだ。<br />
<br />
=================================================<br />
<br />
＜追記＞<br />
<br />
レンダリング関連の情報は以下のドキュメントが参考になった。<br />
https://docs.unrealengine.com/latest/INT/Programming/Rendering/index.html<br />
<br />
　上記にも記載のある通り、ワールド上に存在する物体のレンダリング情報は、プレイヤーの動作などの制御とは別のクラスで行われ、UWorldに対応するレンダリングはFSceneクラスで行われる。エラー判定の基準となるLighting情報は、FPrimitiveSceneInfo、FPrimitiveSceneProxyクラスが持ち、これらの情報を元に判定が行われる(StaticLightか？とかDynamicLightを落としているか？など)。<br />
　ただし、判定基準はLighting情報だけでなくWorld上に配置されたComponent（影を生成する物体）にも及び、これを全て正確に追うのはかなり膨大な作業である（Component毎に影の生成条件などが異なる）ため割愛。</div>
<div><br />
結論：Lightを動かすとリビルドが求められる<br />
<br />
「Lightを動かさなくともエラー」が出るという報告がAH上に幾つか見られたが、Ver4.7系だとそういった既知の不具合があるようだ。基本的には上記の内容で問題ないと思われる。<br />
<br />
以上、覚え書き。</div>]]> 
    </content>
    <author>
            <name> どんぶつ</name>
        </author>
  </entry>
</feed>