スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Androidでのプロジェクト設定

いつもAndroid向けのプロジェクトセッティングを忘れるので、ブログに残すことにします。
今回のやり方は、公式のドキュメントにもあるUE4をインストールした際についてくるCodeWorksを使ってSDKを用意するのではなく、VisualStudioをインストールした際についてくるSDKマネージャーを利用するやり方になります。

プロジェクト作成


設定は公式とかスクショにもあるとおりです。
ここでしてなかったり、既存のプロジェクトをスマホ対応させたい場合はこのあとの手順で設定変更をしましょう。
プロジェクト作成

プロジェクトが開いたら、ProjectSettingsを開きます。

プロジェクト作成時に上記の設定をしていない場合は、まずその設定をしましょう。
TargetHardWare.png

Platforms Android


次にPlatformsのAndroidを開きます。作成時はこんな感じです。
Platforms_Android_1.png

Configure Nowを押すとこんな感じに緑色になるので、設定をそれぞれ変更します。

AndroidPackageNameは
Company: 自分の名前とか所属してる会社名やらサークル名
Project: このプロジェクトの名前を設定しましょう

今回赤で丸をしていませんが2つ下にあるApplication Display Nameは空白だと、プロジェクトの名前がAndroidのホーム画面にでます。

Minimum SDK Version: サポートする最も低いAndroidのバージョン
Target SDK: ターゲットとするAndroidのバージョン
をそれぞれ指定します。当たり前ですが、SDKがないとビルドできないので、SDKマネージャーできちんと対応するAPIレベルのSDKを用意しましょう。

無駄に赤丸で囲んでいるOrientationはスマホの向きです。主に使うと思われるのは下記の2つだと思います。
Portrait: 縦向き
Landscape: 横向き

一応赤丸をつけている部分ですが、ビルドの際にサポートするハードの種類?だとおもいます。
スマホによってはarm64を入れているとビルドが通らなかったり通ったりで自分でもよく理解していません。誰かご教授お願いします。
Platforms_Android_2.png

これより下に行くとGooglePlayの対応やらのセッティングがありますが、なくてもビルドはできるので飛ばします。

Platforms Android SDK



SDKやNDK、jdkなどはここでパスを設定します。単純にブループリントで作ってビルドを通すだけならSDKとJDKだけでも問題ないです。C++つかうならNDK必要です。apache-antはJavaのビルドツール?らしいですが、どういう形でビルドする際に必要なのかはよくわかんなかったです。

NDK API Levelはandroid-対象とする最も低いAPIレベルを書いてやればOKです。
SDK API Levelは・・・よくわかんないです。とりあえず、初期値であるmatchndkにすると、NDK API Levelと同じレベルのSDKを自動で指定するようになります。最後に多少あがいたことを書いておくので、もし知ってる方は教えてくださると助かります。
Platform_AndroidSDK.png

というわけでこんな感じにプロジェクトを設定するとAndroid向けにビルドが通ります。

SDK API Levelの疑問


ちなみにSDK API Levelを色々いじるとこんな感じのエラーが出ます。
内容的にはtargetとしたidは存在しないので、android list targetsで対象のidを確認して指定し直してくれみたいな感じだと思います。
outputErrorLog.png

それでみると、こんな感じ。

3以上が存在しません。ちなみに、13まではビルドが普通に通り、14以降はだめでした。理由はよくわかんないので、知ってる人は教えてください。
android_list_target.png
スポンサーサイト

DXライブラリAndroid版開発メモ1

つい先日、DXライブラリがAndroid対応したので軽く触ってみたので、その時つまった部分や、基本的に使えば良さそうなのを備忘録代わりに残していきます。

一応1日程度でこの位までは動かしました。



とりあえず基本的な環境構築は公式を参照してください。
http://dxlib.o.oo7.jp/use/dxuse_vscom2015_android.html

まず僕の環境のせいかもしれませんが、AVDは起動した状態じゃないとプロジェクトを立ち上げて、デバッグをしても仮想マシン上で動いてくれません。原因は知りません。

次に基本操作。今のところタッチしか使っていないので、GetTouchInputのみしか使っていません。
複数の指を使う場合にはGetTouchInputNum()とか使って指の本数とかみるといいと思います。テストしてないから適当な発言です。

他には画像とかのリソースを使う際の注意点とか、ソースコードの文字コードはUTF-8じゃないとダメだとかありますが、全部公式が書いてくれていますので、その辺見てください。

後は基本的なDXライブラリの使い方で動きます。ホントすごい。

UE4でOculusTouchを簡単に使えるテンプレートのメモ

今回はOculusTouchをUE4で使うお話です。

UE4には最初からモーションコントローラ用のプレイヤーポーンが存在しますが、それの掴む部分の中身の解釈をメモ書きとして残しておきます。間違ってたら修正ください。

ブログ執筆時に使用しているプロジェクトの実行環境はUE4.14.2です。まぁ別口で4.14.1で正月に試していたのでそっちでも動きます。

プロジェクトはVRTemplateで作ります。手のメッシュと入力イベントが最初から実装されてるので。

まず、Pawnを親クラスとしてブループリントクラスを作成します。次に、Actorを親クラスとしたブループリントクラスを作成します。こちらは、実際の手として扱うアクターになります。

手の表示


手の表示部分です。この部分だけを実装するだけでも(メッシュを設定していれば)手がでて、Touchの動きに手が追従するようになります。

プレイヤーポーンです。コンポーネントは参考にしたMotionControllerPawnと同じで、DefaultSceneRootにSceneComponentを子に、そして更にその子にCameraComponentをくっつけます。

イベントグラフはこれです。これもだいたい同じですが、OculusTouchにしか対応する気がない感じの実装です。
BP_Player全体図

重要というか今回の目的である手の生成はこれです。先程作った、手を扱うためのActorを生成してます。後述で説明しますが、右手か左手か判定用の列挙体変数をスポーンに公開して、生成時に設定できるようにしています。あと、何が重なってても生成は絶対なので、Always Spawn, Ignore Collisionsに設定して、適当な位置に生成します。直後にこちらのSceneComponentにアタッチするので問題ないです。
生成した手のアクターはいろんなとこで使うので変数化して保持しています。
手の生成部分

手のアクターはこんなかんじです。参考元ではテレポートように色々ありましたが、そこは省略するので、必要なコンポーネントは、RootにSceneComponent、その子にMotionControllerComponent、更にその子にSkeltalMeshComponent、そして最後の子にSphereCollisionConmpornentです。名前はそれぞれ参考元のを流用しました。
コンストラクションスクリプトでは、EControllerHand列挙体の変数HandをMotionControllerComponentのHandに設定しています。アクターが持っている変数のほうは、スポーンに公開しているため、生成時に設定されています。
BeginPlayでは手のスケルタルメッシュがLeftの場合に限り、左手の向きになるよう設定しています。もともとのスケルタルメッシュが右手で作られているのを使っているために必要な処理です。もし、両手別々のスケルタルメッシュの素材を使う際には、手の向きによってスケルタルメッシュにここで動的に設定するようにすればいいともいます。僕は持ってないので試せないです。

ここまで作ったらコンパイルして、レベル上に作ったプレイヤーポーンを配置してVRプレビューで見ると、手がTouchと同じように動くと思います。

なんかを掴む


しかし、このままでは、何を押しても反応しないし手は握ったアニメーションをしません。ので、その辺も実装してしまいましょう。

サンプルのほうの実装の簡単な説明をすると、
①手のアクターのSphereCollisionに重なってるアクターのリストを取得
②そのアクターがPickupActorInterfaceを持っているかを調べる
③重なってるアクターでPickupActorIntarfaceを持っているアクターが複数ある場合、一番距離が近いやつを掴む対象とする

こんな感じです。PickupActorInterfaceは掴んだときと離したときのイベントメッセージを送るために実装されています。

処理の流れがわかったところで実装に移ります。

入力を受け取るプレイヤーポーン側はほとんど実装するものがありません。入力を受け取って、左右それぞれのつかみに対応したボタン入力を受け取って入力されたときと離したときのイベントを呼ぶのみです。
BP_Player掴む動作

掴む入力があったときに呼び出す関数GrabActorの中身です。
WantsToGripというBool変数は握ってることを管理するフラグです。次のGetActorNearHandはGrabShereに重なってるアクターを取得する関数です。あとで中身は載せます。
その後、条件を満たした重なってるアクターが存在していたらActor型変数のAttachActorに設定します。その後、MotionControllerをアタッチする際の親として参照を渡して、先程取得したAttachActorに拾ったときのメッセージを送ってます。
最後のRumbleControllerイベントはよくわかんないです。PlayDynamicForceFeedbackの説明読んでもいまいちよくわかんなかったです。関数名とかからしてコントローラに力を反映するみたいな意味っぽいですけどよくわかんないです。誰か教えてください。
ちなみになくてもつかめます。
GrabActor.png
GrabActor1.png
GrabActor2.png

掴む際に対象を取得するGetActorNearHandです。
GetActorNearHand.png

まず、SphereCollisionのGrabSphereに重なっているアクターのリストを取得して、それをForEachLoopで回します。
GetActorNearHand1.png

リストの要素がPickupActorInterfaceを持っていて、NearestOverlapの値よりも、このアクターとPickupActorInterfaceを持っているアクターの距離がより近い場合、戻り値用のローカル変数であるNearestOverlappingActorと比較用のNearestOverlapにそのアクターと距離を設定し、次の要素へ進みます。
GetActorNearHand2.png
GetActorNearHand3.png

リストの要素すべてを確認したらReturnNodeへNearestOverlappingActorをわたし、処理を終えます。

そして、離したときの処理です。WantstoGripをfalseにし、AttachedActorが存在していた場合、MotionControllerComponentを親としてアタッチしていたら、離す処理のメッセージをAttachedActorに送り、AttachedActorの中身を空にします。
ReleaseActor.png

最後にEventGraphのEventTickです。WantstoGripをみて手のアニメーションやその他更新を行っています。順番に見ていきます。
EventTick.png

まず、WantstoGripがtrueかAttachedActorがNULLでなければ握っている状態なのでGripEnum列挙体変数GripStateをGrabに設定します。
もしどちらでもない場合、近くに拾えるアクターがあるかどうかを見て判定を行います。
EventTick1.png

存在していれば握っている状態なので、GripStateにCanGripを、存在していないけどもWantstoGripがtrueならGrabを、そうでないならOpenを設定します。
EventTIck2.png

次の処理ですが、もともと用意されているアニメーションインスタンスに先程設定した握ってるかの状態をそのままわたします。これでアニメーションが遷移するようになりました。
EventTIck3.png

最後に、握っていたらコリジョンを有効に、握っていなかったら無効にします。これにより、OculusTouchのFirstContactのようにグーならものを殴れるようになります。
EventTIck4.png


あとは、掴むものを用意します。初めから用意されているものでも全然構いませんが、どうせなのでこっちも作ります。

今回はこちらのScifi Melee Weapon Packを使います。理由は特にありません。強いて言えばかっこいいからです。有料アセットですので、無料でやるならば適当なスタティックメッシュをジオメトリで作ったり、InfinityBlade:Weaponsを使うといいと思います。
ScifiMeleeWeaponPack.png

こんな感じのブループリントです。もともと、剣のスタティックメッシュにコリジョンが設定されています。その辺気をつけてください。
SceneConponentをRootに配置して、その下にStaticMeshComponentを子に置いています。取っ手の部分がRootの位置に重なるようにします。銃とかでもその辺気をつけてください。
InterfaceにPickupActorInterfaceを設定します。これにより、PickupとDropのイベントを実装することが出来るようになります。
Sword1.png

実装ですがこんな感じ。もともとサンプルのほうではコリジョン設定を物理にしているため、物理を無効化する処理が入っていますが、この剣にはつけてません。宙に浮いていたほうがつかみやすいので。
AttachToComponentとDetachFromActorの赤枠で囲んでいる部分は、初期設定がKeepRelativeになっているため、なんか変な挙動をします。
掴む際には位置は手の位置と同期させるためSnapToTarget、回転とスケーリングはそのまま使ってくれたほうがいいのでKeepWorldです。
離す際にはそのままワールドの位置に残ってもらいたいのでKeepWorldです。
Sword2.png

以上ですべて完了です。うまく言ってるとこんな感じに作った剣を掴んだり、やってはいませんが、目の前に用意されている青い箱を掴んだりできます。

UE4ゲーム制作入門二十五日

一人UE4ゲーム制作入門アドベントカレンダー二十五日目最終日です。

今日は細かい修正だけをしておきました。スクショは特に写すものもないんでないです。ごめんなさい

まず、現状フィールドを突き抜けていた弾をなんとかしました。blockAllDynamicにしてBeginOverlapからHitイベントに変更です。基本スタティックメッシュはBlockAllなので特に問題なくイベントが発生します。

次にボス。現状遠距離攻撃も単純に腕振ってるだけだったので、岩を投げるようにしました。岩のモデルはStarterContentの岩モデルです。

あとは敵の当たり判定が死亡アニメーション再生段階で残っている部分や実は前に走りながら撃つと弾が自機にヒットする不具合など、思ってたよりバグがいっぱいありました。

内容がとても薄いですが、以上で今回のアドベントカレンダーは終了になります。色々思うとこはありますが、後日に完走した感想でもブログに上げるつもりなので、そこで色々ぶちまけたいと思います。

約一ヶ月の長い間お付き合い頂きありがとうございました。

UE4ゲーム制作入門二十四日

一人UE4ゲーム制作入門アドベントカレンダー二十四日目です。

今日はちょっとしたフィールドのギミックを実装しました。どんなのかというと、スイッチ的なあれで、弾が当たったら道があらわれるよくあるギミックです。

まずはスイッチとなる的のアクターを作ります。AnyDamgeイベントが発生したら今回なら橋を出現させるようにしています。
BP_Mato.png

出現する橋はこっちです。初期値ではNoCollisionとVisibleにfalseをセットしています。
BP_Hashi.png

それぞれにいい感じのStaticMeshを設定してマップに配置して、表示するための変数に設定してやるとおっけーです。

以上が今日(22時くらいから)の進捗になります。

一日の休みを寝てたりゲームしてたりでめちゃくちゃサボって過ごした結果です。最終日前日に燃え尽き気味・・・。明日は出勤キーンなのもやる気ゼロシステム発動に拍車をかけてる気がしますが。

ついに最終日なので、できることは悪あがきだけはしておこうと思います。それでは。
プロフィール

shiratori00

Author:shiratori00
ゲームプログラミング頑張って勉強中です。

最新記事
最新コメント
月別アーカイブ
カテゴリ
Twitter on FC2
カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。