読者です 読者をやめる 読者になる 読者になる

てんちょーの技術日誌

自分がつまづいたこととかメモ

【UE4】SaveとLoad時のUserIndexについて

UE4

はじめに

時々SaveとLoadに苦戦するのでよくお世話になっているほげたつさんのサイトです。

hogetatu.hatenablog.com

ここには

セーブデータにはスロット名とユーザーインデックスが指定できます。 スロット名はセーブデータの名前、ユーザーインデックスはその中でのIDみたいなものですね。 ドラクエ冒険の書1とか冒険の書2とかそんなイメージです。

とあります。

もちろんこちらにも。

docs.unrealengine.com

For some platforms, master user index to identify the user doing the saving.

ただ実際に実装してみると、なにやら動作がおかしいので調べてみました。

ソースコード

ということで、Engineのソースコードを追います。UE4.13です。 ctrl+FとかでUserIndexをハイライトしておくと、見やすいかもしれません。

Runtime/Engine/Private/GameplayStatics.cpp

USaveGame* UGameplayStatics::LoadGameFromSlot(const FString& SlotName, const int32 UserIndex)
{
    USaveGame* OutSaveGameObject = NULL;

    ISaveGameSystem* SaveSystem = IPlatformFeaturesModule::Get().GetSaveGameSystem();
    // If we have a save system and a valid name..
    if(SaveSystem && (SlotName.Len() > 0))
    {
        // Load raw data from slot
        TArray<uint8> ObjectBytes;
        bool bSuccess = SaveSystem->LoadGame(false, *SlotName, UserIndex, ObjectBytes);
        if(bSuccess)
        {
                   (省略)
bool UGameplayStatics::SaveGameToSlot(USaveGame* SaveGameObject, const FString& SlotName, const int32 UserIndex)
{
    ISaveGameSystem* SaveSystem = IPlatformFeaturesModule::Get().GetSaveGameSystem();
    // If we have a system and an object to save and a save name...
    if(SaveSystem && SaveGameObject && (SlotName.Len() > 0))
    {
        (省略)
        // Stuff that data into the save system with the desired file name
        return SaveSystem->SaveGame(false, *SlotName, UserIndex, ObjectBytes);
    }
    return false;
}

とSaveもLoadもUserIndexに関わる処理はSaveGame、LoadGameを呼び出しているのでそちらへ。

Runtime/Engine/Public/SaveGameSystem.h

virtual bool SaveGame(bool bAttemptToUseUI, const TCHAR* Name, const int32 UserIndex, const TArray<uint8>& Data) override
    {
#if PLATFORM_HTML5_BROWSER
        return UE_SaveGame(TCHAR_TO_ANSI(Name),UserIndex,(char*)Data.GetData(),Data.Num());
#elif PLATFORM_HTML5_WIN32
        FILE *fp;
        fp=fopen("c:\\test.sav", "wb");
        fwrite((char*)Data.GetData(), sizeof(char), Data.Num(), fp);
        fclose(fp);
        return true;
#else
        return FFileHelper::SaveArrayToFile(Data, *GetSaveGamePath(Name));
#endif
    }
 virtual bool LoadGame(bool bAttemptToUseUI, const TCHAR* Name, const int32 UserIndex, TArray<uint8>& Data) override
    {
#if PLATFORM_HTML5_BROWSER
        char*  OutData;
        int        Size;
        bool Result = UE_LoadGame(TCHAR_TO_ANSI(Name),UserIndex,&OutData,&Size);
        if (!Result)
            return false; 
        Data.Append((uint8*)OutData,Size);
        ::free (OutData);
        return true;
#elif PLATFORM_HTML5_WIN32
        FILE *fp;
        fp=fopen("c:\\test.sav","rb");
        if (!fp)
            return false;
            // obtain file size:
        fseek (fp, 0 , SEEK_END);
        int size = ftell (fp);
        fseek (fp, 0 , SEEK_SET);
        Data.AddUninitialized(size);
        int result = fread (Data.GetData(),1,size,fp);
        fclose(fp);
        return true;
#else
        return FFileHelper::LoadFileToArray(Data, *GetSaveGamePath(Name));
#endif
    }

えーっとPlatformがHTML5のブラウザだけUserIndexを使っているように思います。

そしてこのUE_SaveGameとUE_LoadGameはこちらに。

Runtime/HTML5/HTML5JS/Private/HTML5JavaScriptFx.js

UE_SaveGame: function (name, userIndex, indata, insize) {
    // user index is not used.
    var _name = Pointer_stringify(name);
    var gamedata = Module.HEAPU8.subarray(indata, indata + insize);
    // local storage only takes strings, we need to convert string to base64 before storing.
    var b64encoded = base64EncArr(gamedata);
    $.jStorage.set(_name, b64encoded);
    return true;
  },

  UE_LoadGame: function (name, userIndex, outdataptr, outsizeptr) {
    var _name = Pointer_stringify(name);
    // local storage only takes strings, we need to convert string to base64 before storing.
    var b64encoded = $.jStorage.get(_name);
    if (b64encoded === null)
      return false;
    var decodedArray = base64DecToArr(b64encoded);
    // copy back the decoded array.
    var outdata = Module._malloc(decodedArray.length);
    // view the allocated data as a HEAP8.
    var dest = Module.HEAPU8.subarray(outdata, outdata + decodedArray.length);
    // copy back.
    for (var i = 0; i < decodedArray.length; ++i) {
      dest[i] = decodedArray[i];
    }
    Module.HEAP32[outsizeptr >> 2] = decodedArray.length;
    Module.HEAP32[outdataptr >> 2] = outdata;
    return true;
  },

いやあのこれ、UserIndex出番なくないですか…(引数として呼ばれているだけで未使用)

まとめ

現状だとUserIndexは出番がないようです。ちゃんと(?)設定していないはずのUserIndexでLoadしてもエラーが出ませんでした。

Forum等も漁りましたが、良さげな解答が見つからなかったので追ってみました。

どこか間違ってたり、新たに何か分かった時にはぜひ@shop_0761までお知らせください(更新します)

【UE4】自作アクションゲームにAutoPlayを仕込んでみた

UE4 ぷちコン

はじめに

ぷちコンで作ったもろもろ紹介編2です。

元記事

shop-0761.hatenablog.com

今回はCEDECに行った際に聞いたAutoPlayのお話をもとに作ってみました。

講演はこちら。

cedec.cesa.or.jp

資料はCEDiLにあります。

cedil.cesa.or.jp

実際にAutoPlayしたものがこちら。

youtu.be

考え方

講演の内容をもとに(正確な内容はあやふやですが)AutoPlayの実装方法を簡単に説明します。

f:id:shop_0761:20160922233931p:plain

-------事前準備-------

  1. マップにConeを置く

  2. そのConeにはいくつかActionを登録しておく

-------実行時---------

  1. ConeのActionを実行する

  2. 次のConeについたら上へ戻る

これだけです。AIは使わなくても実装できます。

Actionというのは絵に描いてあるような移動だったり、ジャンプだったりと なんでもいいわけです。

管理、保守など調整しやすいように難しいことはしません。

実装

実際に実装してみると、このConeのBPだけで大部分はまかなえてしまいました。

(あとはループ処理のためのConeManagerを作ったりしたくらい)

方針

ポイントを整理しておきます。

  • 今回は予めConeを配置したあとにNextConeとして次のConeを登録しておく

  • 今ActionをしているConeとNextConeのみCollisionを有効にする(例外あり)

くらいだと思います。

一つ目はConeと同じ型の変数を公開しておき、レベル上で設定していきます。

こんな感じ。

f:id:shop_0761:20160922235034p:plain

二つ目はそのほうが安全だよねってくらいです。

そして"例外あり"とは、スタート地点はCollisionを有効にしておかなきゃそもそも動かないのでという意味だったり、不具合対処の意味が大きいです。

この辺はまたあとで触れます。(※)

実際のBPはこちら(1-2日で作ったので一応整理したけど散らかっている感)

ConstractionScript

一応確実にジャンプして欲しい場面(大きな穴とか)があるので

f:id:shop_0761:20160922235517p:plain

全体像

f:id:shop_0761:20160922235538p:plain

BeginPlay

ここでCollisionの設定をしています。

f:id:shop_0761:20160922235553p:plain

BeginOverlap

NextConeのCollisionをEnableにしたあと、Wait秒待ちます。

落ち着いてジャンプしてもらうためです。

f:id:shop_0761:20160922235611p:plain

Debug用にPrintStringしてるだけです。Duration0は便利ですね。

f:id:shop_0761:20160922235629p:plain

到着判定

NextConeにたどり着いたかどうかをチェックします。

今回はVecLengthでやりましたが、2点間の距離でもいいと思います。

そして、先程の※のお話(ポイントの2つ目)がここで出てきます。

後述するRandomJumpを使っていたりすると、偶然Coneをスキップされてしまい、 Gateが開いたまま移動処理が残ったりする場面が多々ありました。

実装方法に問題があるのは分かっていますが、今回は一定距離が離れたりした場合でも到達したとみなして、処理を打ち切ることにしました。

f:id:shop_0761:20160922235644p:plain

Move

一応Axisの向きも内積でなんとなく求めておきます。

このMoveActionはキー入力の移動と同じ処理をするだけです。そのために追加したイベントです。

f:id:shop_0761:20160922235657p:plain

Jump

こちらのJumpは一度だけ確実にジャンプする必要があるときに使います。

JumpActionも先程のMoveActionと同じです。

f:id:shop_0761:20160922235721p:plain

RandomJump

適当なタイミングで適当に長押し(したフリをして)ジャンプします。

f:id:shop_0761:20160923001012p:plain

Reset

今回はループさせたかったので、Reset処理を追加しました。

ループさせる必要がないならDestroyしてしまってもいいかもしれません。

(そうするとさっきの※のお話はなくなるはず)

f:id:shop_0761:20160922235738p:plain

AutoPlayのメリット

最初は なんかすげぇでも作れそう とおもったので勉強がてら作りました。

何がいいかというとテストプレイ(周回系)が楽です。

  • 実装に疲れたから、眺めて確認したい
  • どうせちゃんと動くだろうから、操作したくない
  • Twitterを見たい

などAutoPlayにしておけばこんなに便利です。

あとプレイ動画を撮るのも楽ですね。コミケ等の展示時に流していると面白いかもです。

まとめ

このくらいのスピード感で作ってました。

意外にあっさりできましたね。

ちなみに途中で操作介入できます。(意図的にジャンプさせたり)

なにかわからないことがあれば@shop_0761までお願いします。

【UE4】ParallaxOcclusionMappingで背景アセットを作ったお話【小ネタ】

UE4 ぷちコン

はじめに

ぷちコンで作ったもろもろ紹介編1です。

元記事

shop-0761.hatenablog.com

HeightMapの描き方が分かりません。

けど、いい感じの背景アセットを手抜きで作りたい。

そんなこんなで出来たのが、これ。

f:id:shop_0761:20160921004208p:plain

f:id:shop_0761:20160921004225p:plain

意外に良くないですか 手抜きの割には。

作り方

Heightmapは描きました。手描き出来ます。

f:id:shop_0761:20160921004449p:plain

f:id:shop_0761:20160921004432p:plain

引っ込ませたい方を黒で塗ればいいんです。おわり。

あとはMaterialですが、ContentExampleにあったものを拝借してきただけです。

f:id:shop_0761:20160921004911p:plain

f:id:shop_0761:20160921004922p:plain

超お手軽ですね!!

深いことを考えなければ、パラメータはSampleそのまま使っていい気がします。

最初はalphaで抜こうか、なんて思ってた時期もありました。

f:id:shop_0761:20160921004420p:plain

ですが、シェーダ複雑度が真っ赤になったのでやめました。

これなら実質箱だけなので、描画負荷はalpha抜きに比べると軽いです。(上手くやれば赤いとこもなくなるはず)

f:id:shop_0761:20160921010135p:plain

試しにalpha抜きしてみました。(見栄えはおいておくとして

f:id:shop_0761:20160921010433p:plain

f:id:shop_0761:20160921010443p:plain

そりゃそうですねって感じです。

まとめ

ぱららっくすおくるーじょんまっぴんぐ ってカッコよかったので使いたかっただけです。

ContentExampleのは出来が良すぎて意味が分からなかったですが こんな手抜きの白黒絵を描いても使えるよ ということが言いたいだけです。

賞味20分くらい?だった気がします。

誰かもうちょっとまともな使い方の記事を書いて欲しいところですね。

【UE4】第6回ぷちコンに応募しました 【概要編】

#VR UE4 Vive ぷちコン

はじめに

今回も2作品応募しました。

ぷちコンのページ

historia.co.jp

月にかえりたい

www.youtube.com

実行ファイル

www.dropbox.com

Android

www.dropbox.com

カノトンボ

www.youtube.com

今回もまた作品概要だけをここで紹介してUE4の技術的なお話とかはまた別記事にします。(後々検索しやすくするため

月にかえりたい

この作品は某CMとか某映画が元ネタとなってます。知ってるとより楽しめるかと思います。(知らなかったら連絡ください こっそりお教えします)

今回はちゃんとコンセプトアートを書き、グレーボクシングをし、比較的ちゃんとまとまってから作り始めたので心に余裕がありました。(毎回すべきことなのに)

f:id:shop_0761:20160919232416p:plain

ちょくちょくコンセプトとずれそうになったりしました。(得点をScoreと英語にしてたり、小判ではなく札束にしようとしてたり)

ですがふとコンセプトアートを思い出して修正できました。描いておいてよかったです。

最終的にこの敵キャラのマスクも作れたのでよかったです。

f:id:shop_0761:20160919232552p:plain

絵作りの方は当初水彩っぽくしたかったんですが、調整してるうちに今のに落ち着きました。

これを使って調整しただけです。

qiita.com

今回のBGMはMusycというiOSのアプリで作りました。作ったといってもおもちゃみたいな感じなのでガチではありません。

すごい地味ですが、残り日数が短くなると徐々に早くなったりしてます。

プレイする人によって借金を返すのか、踏み倒すのかに差が出そうですね。

カノトンボ

こちらは完全に思いつきと勢いです。VR用になにか作ろうと思ってた時にやってきたアイディアです。

虫かごのフタだけモデリングしました。

f:id:shop_0761:20160919233559p:plain

ちょうどMMD版の中野シスターズが公開されて、目の構造が変わったらしかったので大抜擢です。

参考:

qiita.com

あとはこれでカノちゃんのアニメーション、graymanのポーズを作りました。

shop-0761.hatenablog.com

スケール感的にはこのくらいです。(graymanは60倍くらい

f:id:shop_0761:20160919234526p:plain

UE4.13からのVRTemplateを使ったので他に変わったことはしてません。お手軽です。

まとめ

なぜか締切が一日早い方に勘違いしていたので、はやく終わりました。

気持ちが楽になりました。チキンレース勢もいいですが、こっちはココロにやさしいです。

近々 月にかえりたい の方は実行ファイルを公開します。

【UE4】MayaLT2017でphysXを使って服を揺らす

UE4

はじめに

第6回ぷちコンにあわせて頓挫中だった3Dモデルを作りました。 その話は、また別の機会にするとして今回はワンピースをApexClothで揺らしてみたいと思います。

結論から言えば、微妙です。

あまり期待しないでください。

MayaLTも初心者ですのであしからず。

やるなら一通り読んでからのほうがいい気がします。

テスト環境

  • MayaLT 2017
  • UE4.13
  • PhysX: Maya DCC plug-in for PhysX 3-3-3

Maxでも出来ると思います。(未確認

手順

ApexCloth自体は最後にある参考サイトの@com04さんのサイトを見るといいかと思います。 以降はある程度知ってるものとして色々省略します。

基本的に参考を最後につけているのでそちらの動画(英語)を見ていただければ実際済むお話ですが、

つらい目にあったよってところも織り交ぜながら書いておきます。

それと、服のマテリアルは別にしておきましょう。そのほうが多分安全。

分けてなかった時

服だけになりました。

ちなみに服には一切ボーンは入ってません。

プラグインを入れる

nvideaにログイン後、こちらのDownloadCenterからダウンロード出来ます。

手元のMayaのバージョン等に合わせてください。

Download Center | NVIDIA Developer

.msi形式なので、実行すれば導入自体は出来るかと。

そして、MayaLT上で言うとウィンドウ → 設定/プリファレンス →プラグインマネージャー からphysx.mllをロードすると

f:id:shop_0761:20160914000609p:plain

このように追加されます。

physX Clothingを作る

これを作るときにはジョイント(ボーン)が必要になるはずなので、準備しておきましょう。

対象のメッシュを選択して(今回はワンピース)、右から6つ目のスカートみたいなアイコンをクリックするか、上のメニューからphysXphysX Clothing → Create Clothingで作れます。

これを色々調整していく感じです。

ペイントする

スパナみたいなアイコンをクリックすると、このようにメニューが出ると思うのでPaintを選べば塗れます。

f:id:shop_0761:20160914001216p:plain

この時、マテリアルを設定していればこのように紫色になるかと思います。ならなかったら確認してみてください。

ちなみに僕は一旦ここでハマりました。

はい、原因不明ですが乗り切りました。

こんな感じで色々設定できます。

f:id:shop_0761:20160914002529p:plain

Attribute

4種類塗れます。

  • maxDistances これがきっとメインになる塗り
  • latchToNearest 動画だと服の裏地に塗ってました

あとのBackstop系はよくわからなかったです()

とりあえずmaxDistanceを揺らしたいところに強弱をつけて塗るみたいです。

参考までにこんな感じしたり。

f:id:shop_0761:20160914003020p:plain

裏も塗りました。

f:id:shop_0761:20160914003026p:plain

シュミレート自体は再生ボタンを押せば勝手にやってくれます。

ちなみにlatchToNearestを塗ると表と裏の生地が貫通したのでやめました。

RagDoll

服と体のコリジョンを作れます。

Bodyになるメッシュを選択後、藁人形みたいなアイコンをクリックしてCreate Kinematic RagDollで作成できます。

つよそう

f:id:shop_0761:20160914003620p:plain

でこのように選択して、不要なジョイントのところのコリジョンをRemoveできたりします。

f:id:shop_0761:20160914003821p:plain

個々のコリジョンを編集するには、上でジョイントを選択した後に下のshapeSetUpから目的のコリジョンを選択して、Selectすれば編集メニューがでます。

f:id:shop_0761:20160914003955p:plain

f:id:shop_0761:20160914004212p:plain

と普通に移動、回転、スケールができるみたいです。

なお

こんな目に遭っているので様子見ながら調整しましょう。

出力する

一通りおわった(ことにした)ので、UE4用に出力します。

Create Clothingしたメッシュを選択して出力するだけです。

ポイントは

ファイルの種類をphysXにした後、ここを確認しましょう。

f:id:shop_0761:20160914004651p:plain

特にunitを間違えるとおかしなことになります。

あとは.apxファイルが生成されるので適用するだけですね。

この辺はスクショでも貼って終了にします。

f:id:shop_0761:20160914005550p:plain

結果

はい すごい微妙に変わります。

まとめ

ここまでやってこれだけ…しかも微妙って…

なので、現状はボーンを入れて、Anim Dynamicsで揺らすか手付けアニメーションにするかが最適解かもしれません。(けど面倒なのでやりたくない

余裕があれば髪もやります。

AnimDynamics

unrealengine.hatenablog.com

参考

www.youtube.com

www.youtube.com

www.youtube.com

docs.unrealengine.com

物理-布シミュレーション - UE4 Document@com04

CEDEC2016に行ってきた

UE4

はじめに

今回は特に行く予定がなかったのですが、急遽就活の関係で8/27に東京に行かなきゃならなくなったので

CEDECいけるじゃん!!」

ってなったので行きました。

個人的によかった講演やらメモをまとめておこうかなというお話です。

資料はCEDiLに公開されていたりするので、そちらもできるだけリンクを貼ります。

CEDiLは会員登録が必要なのでそれだけご注意を。

順番は適当です。

手と指がVRの中にある:Oculus Touchのインタラクションデザイン

資料公開があると思うのですが、さすがにまだ見当たらず…

Youtubeの配信もあったし、主婦さんのツイートとかを見ていただいたほうが早いかも。

Touchは非常に良いコントローラーなので、よりよい体験のためにどうしたらいいか というような内容が中心で、 僕も気になったところをちょこちょこツイートしてました。

こんなところですかね。Touchが楽しみです。

ベヨネッタ2』におけるゲーム品質を上げる為の自動化 ~オートプレイと継続的なパフォーマンス計測~

cedil.cesa.or.jp

前回のぷちコンでプレイ動画を撮るのにすごい苦労したので興味がありました。

AutoPlayの実装方法について説明されているのですが、非常にイメージしやすく これならUE4でもぱぱっと作れそうという印象でした。

ざっくりした方法を紹介するなら、

  1. コーンと呼ばれるマーカーみたいなものをレベルに配置
  2. 一番近いコーンに移動
  3. Actionを実行
  4. 終わったら次のコーンへ

と2-4を繰り返すイメージです。 AIを使うわけではなくAutoPlayなのでパッド入力としてActionを行います。

Actionには移動、待機、ジャンプなどそれぞれセットするだけなので単純。

Aで攻撃して壁を壊したら、移動する ではなく「適当に10回くらいA連打、待機、移動」のような実装で十分だそうです。

パフォーマンス計測の方は専用のwebページを作って、グラフィカルに負荷をみれるようにというコンセプトで作られており

アーティストさんにもパッと見で改善されたかわかるようにとのことでした。

データベース化すると管理で死んでしまうので取ってきたデータの生XMLを置いてあるとかいうお話です。

Unreal Engine 4 のレンダリングフロー総おさらい

BPでロジック組むの大好きだったのでレンダリングはからっきしでしたが、非常にわかりやすかったです。

毎日見直してレンダリングの流れを頭に入れておきたいレベルです。

細かいことは中身を見たほうがよっぽどいいですw

www.slideshare.net

「VR ZONE Project i Can」の知見、全部吐き出します!

これはEvernoteにメモったものがあるのでそれを

VRの宣伝は人の反応を見せるほうがインパクトがある

身長が10倍になると怖さは1/10

現実との比較がないと驚きが少ない

コントローラに機体をAttachするとずれない

被写界深度を浅くすると酔わなくなる…?

完全再現ではなく厳選再現でおけ

錯覚 クロスモーダル現象 認識とか判断を端折りたい →いつものパターンは端折る →騙される

得た経験とか知識によるリアリティの感じ方に差が出る

共感力の増加

  • 実際に経験豊富
  • 妄想
  • 楽しむ心 信じる心

減少

  • VR擦れ
  • 分析心

現実 実物は実在感が大事

物理法則のインタラクション大事 炎で熱いとか

複数の情報筋から得たいつものパターンつよい

映像 音 地響きのような複数インプットがあると信じる

VR

  • 旅に出る 体験して感動
  • 自分のからだ
  • 自ら行動→行動制限不能
  • 見回せる、歩ける
  • 強烈な体験そのもの
  • ゲームルールと面白さは別

ゲーム

  • 旅番組を見る 感情移入して感動
  • レバー ボタン
  • 意思を伝える
  • 作者の狙い通りに感動体験をした気分

面白い体験を発見すること

その場にいたら、本当に起こったら、を豊かに想像する力

アニメやゲームのシチュエーションはそもそもその場で体験したらすごい

百聞は一体験に如かず 開発者にも大事

リアル体験じゃないと得られない感動をコンテンツの中心におく

f:id:shop_0761:20160828125751j:plain

f:id:shop_0761:20160828125806j:plain

f:id:shop_0761:20160828125817j:plain

欧米で日本のゲームを成功させる方法 How to make Japanese games work in the West

同時通訳のせいで激辛セッションだった気がしますw

これもEvernoteのメモを

可愛らしい動物、アニメ的な簡単に描かれた顔、ファンタジー系、刀と銃の混在欧米ではない

欧米ではファンタジーは真剣に読んだりするものなのでアニメ的な絵などにすると子供向けに思われることも

アメリカ的にはシリアスなファンタジーのがよい

アメリカゲーマーは30-40代

アメリカとinterface(UI)が違う

アメリカではキャラになりきる、プレイヤーアバターのようなものが必要

PvPとPvEは混在させない

協力プレイがよい

アイテムを後から買うのはあまり受けない(ガチャとかガチャとかガチャとか

→時間をつぎ込むことで解禁できるように 他の手段でも獲得できるように

運によって差があると欧米ではマイナスな印象に(日本だとラッキーだねと割とプラスな印象に

探索可能、動機づけ(なぜ戦うのかなど)が大事

ポケモン的な感じが一番ウケがよく分かりやすい例(PvPとPvE、探索、ストーリーの動機付けなど)

f:id:shop_0761:20160828125835j:plain

f:id:shop_0761:20160828125846j:plain

f:id:shop_0761:20160828125857j:plain

まとめ

UE4のVRロードマップはだいたいリリースノートとかに書いてる感じだったので、資料を見ていただければいいかも。

下の2つは資料が公開されていないもののはずなので、なにか参考になればと。写真もちょっとあるので後で追記します。

ちなみにガチャは英語でGachaらしいです。

ネカフェで書いたので、帰ったあとに今回CEDECにかかった額の計算をしてみようかと思います。

(2016/08/28 追記 

計算しました。 およそ84000yenですね(やばい) 全部自費です。

簡単な内訳としては

  • 1daypass 2 expopass 1 33480
  • 飛行機 19300
  • Developer's Nightなどの懇親会費 12364
  • 宿代(ネカフェ) 3 6480

残りは交通費やらですね。

食費ゴリゴリ削る人なので、一人で飲食したのはジュース1本と帰ってきてから新千歳で買ったお菓子くらいです。

Developer's Nightは5000円の烏龍茶とオレンジジュースでした()

きっと普通に食べたら9万コースですねきっと。

)

全体を通して(懇親会もほぼフル参加では)、かなり行ってよかったなと思いますが

遠方+学校の支援なしな学生にはCEDECはコスト的な意味できついですね!!

内容の質を学生向けに下げる必要は全くないと思いますので、そんな学生向けのパス代にしてくれると助かります()

【UE4】Widget Interaction Componentを使ってみた

#VR UE4 Vive

はじめに

2016/08/07現在ではまだUE4.13 preview 1ですが、 新たに追加されたWidget Interaction Componentが思ったより便利な気がしたので 簡単に使い方を書いておこうかと思います。

手順

基本は3DWidgetを作る流れと同じなので、こちらでも見てください。

docs.unrealengine.com

一応今回はこんな感じで作ってます。

Widget

f:id:shop_0761:20160807112220p:plain

WidgetのEvent f:id:shop_0761:20160807112230p:plain

3DWidgetのActor

こいつにWidgetInteractionComponentを追加します。

InteractionDistanceとか設定できます。

f:id:shop_0761:20160807112243p:plain

LineTraceでWidgetを拾う

f:id:shop_0761:20160807112337p:plain

今回はMotionControllerのShoulderボタンを使いました。

一応押してる間にHitした対象がなくなったら困るので、適当にキャッシュしてみる

f:id:shop_0761:20160807112256p:plain

終了!!

ちゃんとlogが取れてます。

f:id:shop_0761:20160807112805p:plain

おわりに

めっちゃ簡単だし超VR向けで便利なのでは!?って感じでした。 PosingEditorの方も似たようなことをしていますが、非常に面倒な感じなのでこれに乗り換えたいですね。