UE4の歩き方(情報の探し方)
qiita.com
の11日目の記事となります。
UE4の使い方や疑問などを調べる手順を紹介したいと思います。
公式ドキュメント・コミュニティを全検索するフォーム
UE4は公式ドキュメントやコミュニティがしっかりしてますので、まずは公式を検索した方がググるより早いことが多いです。
そこで役に立つのが公式ドキュメント・コミュニティを全検索できる以下のフォームです。
フォーム下のリンクを切り替えることで、検索するドキュメント・コミュニティを絞ることもできます。全検索するとノイズが多いですので、適宜切り替えると良いと思います。
日本語で検索できます。ただ、英語の方が情報量が圧倒的なので英語検索をおすすめします。日本語ドキュメントがない未来も遠くないと思うので技術英語まではがんばろう!
Document
マニュアル・説明書などなど、色々呼び名はありますが真っ先に調べるべき対象です。
基本的な使い方や機能が網羅的に書かれています。答えそのものは無くともヒントや参照先に助けられることも多いです。
Answers
AnswerHubの検索です。AnswerHubは質問を投稿して誰かに答えてもらえるという開発者間の相互互助をサポートするシステムです。内容によって(主にバグ報告)はEpicの人からも回答がもらえます。
もっとも有用な検索で、使い方や挙動がバグかどうかを調べるには、ほぼAnswerHubを調べれば出てきます。AnswerHubそのもの使い方は、How To Ask Questions - UE4 AnswerHub を見て下さい。
ついTwitterとかで質問をしがちですが、AnswerHubに書いた方が共有がしやすいので、AnswerHubに投稿した上でTwitterで投稿したよ!とやった方が回答率が上がると思います。Epicの中の人も見てますしね。
Forums
フォーラムは、お題ごとに議論を行うためのシステムです。
リリース情報やEpicの人のちょっとしたこぼれ話や、UE4利用者たちの宣伝、新機能の要望、UE4のチュートリアルなどなど、とても沢山の情報が飛び交っています。
多くは英語ですので調べるのは少し骨が折れますが、AnswerHubには載ってこないマニアックな情報*1も多く、AnswerHubで見つからなかったら次に探す対象です。
Wiki
EpicWikiはドキュメントからこぼれ落ちた内容を具体的なコードと共に紹介してくれています。特にUE C++を扱う人は閲覧必須です。
UE C++のチュートリアル、C++プラグインの作り方などが書いてあります。
Blog
EpicBlogはバージョンごとの新機能解説あたりはよくやっているので、最新の内容が知りたいときは特に参照すると良いと思います。
公式外のコミュニティの検索
- Twitter #UE4Studyタグ
- Mstdn https://ue4-mstdn.tokyo
- Discord UE4_JP_Community サーバー
Discordが出来てから、mstdnからDiscordにうつった感があるのでDiscordをのぞくのが良いかもしれません。
MastdonでTopページと「このインスタンスについて」を改造する
Mastodonは、サイトの説明文*1という項目で、テキストを追加することはできますが、画像を入れ替えたり、記述の順序を変えることはできません。
デフォルトのままでは、何のMastodonかわかりにくいですので、次にやりたいのはTopページと「このインスタンスについて」の改造ですよね?
Topページをいじる
Topページは、app/views/about/show.html.haml に記述されている通りに表示されます。
hamlというのはRailsが実装しているhtmlのテンプレート形式で、PythonやMarkdownのような記述方式でhtmlが書けるというものです。詳しくはググってください。
次のリンクを見ながら読み進めてください。
mastodon/show.html.haml at master · tootsuite/mastodon · GitHub
「Mastodonとは?」
”Mastodonとは? Mastodonは自由でオープンソースな……”というMastodonの説明は、23行目
23: %p= t('about.about_mastodon').html_safe
で出力されますので、好きな位置に移動します。
「Mastdonの特徴」
”Mastdonの特徴”と続くチェックボックスがついたリストは43行目~73行目です。
43: %h3= t('about.features_headline') // "Mastdonの特徴" 44: 45: .features-list // このブロックがチェックボックスリスト . . . 73: = t 'about.features.api'
で出力されますので、好きな位置に移動します。
画像を変更する
画像の変更の仕方は2つあります。
- 画像を上書きしてしまう
- 画像のurlを変更する
です。
画像は、app/assets/imagesディレクトリ の中にありますので、対応する画像を置き換えることで入れ替えます。
置き換えをせずに入れ替えるには、hamlの画像urlを書き換えます。
対応するhamlは、26行目です。
26: .mascot= image_tag 'fluffy-elephant-friend.png'
'fluffy-elephant-friend.png'を追加した画像ファイル名に変更します。
また、画像を追加したい場合は、app/assets/imagesディレクトリに画像を追加し、image_tagを使って好きな場所に書きます。
サイトの説明文
サイトの説明文は、75行目~77行目です。
75: - unless @instance_presenter.site_description.blank? 76: %h3= t('about.description_headline', domain: site_hostname) 77: %p= @instance_presenter.site_description.html_safe
ログインのすぐ下など、すぐに見える位置に移動させるのが良いと思います。
ちなみに、自分はインスタンス説明は、hamlに直書きしてしまい。
buildをせずに反映させることができるため、この部分は「お知らせ」に使っています。
「このインスタンスについて」の改造
「このインスタンスについて」は、app/views/about/more.html.haml です。
表示とhamlをにらめっこすればわかると思いますので、詳しくは説明しません。
改造の反映
改造を反映するには、改めてbuildする必要がありますので、いったんdockerをstopし、buildしてから立ち上げ直します。
画像などassetを追加した場合は、アセットのprecompileも必要ですのでお忘れなく。
*1:admin権限を持つユーザーにのみ表示されます
Web素人がMastodonを立ててみた
ゲームプログラム一筋で、オンライン対応でクライアント側のP2P対戦作ったり、サークルの開発サーバーをちょっとだけやってた程度の知識で立ててみた話。
SMTPサーバーも立ち上げて、外部のメールサービスを使わない形で立ち上げます。ドメインはお名前.comで適当に取って来て、適当に設定しています。
- サーバー
- CentOS6をCentOS7に入れ替える
- 基本的な設定をする
- 必要なものインストール
- ファイアーウォール設定
- Dockerの設定
- postfix
- nginx
- サービスを立ち上げる
- docker-composeを立ち上げる
- 参考
サーバー
さくらVPS 1Gプラン(石狩)
CentOS6をCentOS7に入れ替える
さくらVPSはデフォルトだとCentOS6ですので、CentOS7に入れ替えます。
CentOS7自体は標準対応なので、VPSの設定画面からボタン一発で再インストールされます。
石狩設置じゃないとCentOS7にできないらしいので、契約気をつけましょう。
CentOS7にしないといけないのは、CentOS6はDockerのサポートが切られてるからです。
必要なものインストール
マニュアル見ると他にもいるもの(DBとかRubyとか)が書いてあるんですが、Dockerが全部引っ張ってきてくれるので気にしなくて良いようです。自分はDockerがどういうものかを良く知らなかったのでチマチマ入れてたんですが、Twitterで教えてもらいました。
Mastodon
作業フォルダとなるので、tmpには置かない方が良いと思います。
自分は、SSHログイン用に作ったユーザーのhome内においてます。
git clone https://github.com/tootsuite/mastodon.git
nginx
Apacheの仲間のWebサーバーです。
yum インストールでも良いですが、この手は最新が良いと思うので、ngnix.repoをつくってからinstallしました
/etc/yum.repos.d/nginx.repo ファイルを作り以下の内容を書きます。
[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1
その上で
yum -y --enablerepo=nginx install nginx
とします。
Docker/Docker-compose
仮想マシンを構築するパッケージらしいです。Dockerが本体で、Docker-composeは設定ファイルに基づいてDockerコンテンを作るサポートパッケージです。
Docker
最新を入れた方が良いかなと思いましたので、公式ドキュメントに従いdocker-ceを入れます。ceは無料版で、eeは企業向けの有料サポートあり版だそうです。
yum-utilsを入れます。
yum -y install yum-utils
dockerのリポジトリを登録してから、インストールします。
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce
Docker-compose
docker-composeは、ビルド済みのをGitHubから引っ張ってきます。
curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
ファイアーウォール設定
http(80)、https(443)、smtp(25)、smtps(587)を開放します。
firewall-cmd --add-port=80/tcp --zone=public --permanent firewall-cmd --add-port=443/tcp --zone=public --permanent firewall-cmd --add-port=25/tcp --zone=public --permanent firewall-cmd --add-port=587/tcp --zone=public --permanent firewall-cmd --add-service=http --permanent firewall-cmd --add-service=https --permanent firewall-cmd --add-service=smtp --permanent firewall-cmd --add-service=smtps --permanent firewall-cmd --reload
Dockerの設定
cloneしたMastodonのフォルダに移動して、環境設定ファイルをいじります。
環境設定ファイルは、.env.production.samle をコピーして書き換えます。
cp .env.production.sample .env.production
ドメイン
# Federation LOCAL_DOMAIN=ドメイン名 LOCAL_HTTPS=true
ドメインは自前で取っても、さくらVPSで割り当ててあるやつでもご自由に。
HTTPSを使うには証明書が必要になります。Let’s Encryptなどを使って取得して設定しておきます。nginx設定の時に軽く紹介します。
DB
データベースは、特に設定する必要はありません。
鍵
Application secrets 項に3つの鍵(PAPERCLIP_SECRET/SECRET_KEY_BASE/OTP_SECRET)を設定します。
Docker-composeが生成するらしいので、以下のコマンドを3回実行して、最後に出てくる文字列を順番にコピペします。
初回だけ実行に時間がかかりますが、それ以降はすぐ出てきます。
docker-compose run --rm web rake secret
docker-composeは、mastodonのソースがあるフォルダで実行します。
docker-composeを使うには、Dockerのサービスを立ち上げておく必要がありますので、先に立ち上げておきます。
systemctl start docker
メール
メールは、外部のsmtpサービスを使っても良いですが、ここではホスト側にpostfixサービスを立ち上げて、それを使います。
まずは、メールを送信用のユーザーを作ります。
useradd mstdn_mail passwd mstdn_mail
次にdocker0という名前のブリッジのIPアドレスを確認します。
ip a
docker0に設定されているIPアドレスが、Dockerの中からホストへ通信するためのIPとなります。
例えば、「172.16.0.1」と設定されていたとします。
.env.productionのメール設定を以下のようにします。
# E-mail configuration SMTP_SERVER=172.16.0.1 SMTP_PORT=587 SMTP_LOGIN=mstdn_mail SMTP_PASSWORD=設定したパスワード SMTP_FROM_ADDRESS=送信先として設定されるアドレス SMTP_AUTH_METHOD=plain SMTP_OPENSSL_VERIFY_MODE=none SMTP_ENABLE_STARTTLS_AUTO=true
ただし、オープンなmstdnを立ち上げようと思っているならば、外部のsmtpサービス(SparkPostとか)を使う方が良いと思います。
自前のドメインだと、迷惑メールにならないようにする対策とかOP25Bを解決するのがとても大変です。
DBを永続化する
デフォルトの設定ですとDockerを再起動する度にDBが初期化されてしまいますので、そうならないようにします。
mastodonフォルダにあるdocker-compose.yml を開いて、db,redis項目のvolumesの2行をアンコメントします。
db: restart: always image: postgres:alpine ### Uncomment to enable DB persistance volumes: - ./postgres:/var/lib/postgresql/data redis: restart: always image: redis:alpine ### Uncomment to enable REDIS persistance volumes: - ./redis:/data
postfix
/etc/postfix/main.cf を書き換えます。
基本
myhostname=メールサーバーの名前 mydomain=ドメイン名 home_mailbox=Maildir/
送信受付
ローカルとDockerからのみメール送信を受け付けるようにします。
docker0に設定されているIPを「172.16.0.1」とします。
inet_interfaces = localhost 172.16.0.1 mynetworks = 127.0.0.0/8 172.16.0.0/16 relaydomin=
認証
サブミッションポート(587)を有効にします。
smtpd_sasl_auth_enable=yes smtpd_recipient_restrictions = pemit_mynetworkd permit_sasl_authenticated reject_unauth_destination
nginx
Docker内で動いているmastodonをhttp/httpsにリダイレクトするのに使います。
設定ファイルは、mastodon公式で公開されているものをコピーして使います。
置き場は、/etc/nginx/conf.dフォルダ に例えばmstdn.confという名前で作ります。
example.comを自分のドメインに置き換えるだけで完了です。
サービスを立ち上げる
systemctl start postfix systemctl enable postfix systemctl start nginx systemctl enable nginx
docker-composeを立ち上げる
mastodonのフォルダに移動しておきます。
docker-compose pull
docker-compose build
docker-compose up -d
以上です。
立ち上がるのには、少し時間がかかるのでしばらく待ちます。
HoloLensはじめました
ずっと欲しくて転送サービスをはじくMSにグギギとしつつ日本販売開始と同時に手にいれたのですが、やっとさわれるようになったので、HoloLensについてもボチボチ書いていこうかと思います。
ちゃんとした開発記事とかは、
twitter.com
twitter.com
twitter.com
あたりをフォローするなりリストにいれておけば大丈夫です。
なので、いつも通り、他の人があまりやってなさそうとか、変に引っかかったことについて書いていきます。
眼鏡は?
フレームがあまり大きくないなら、眼鏡したままでも被ることができます。私のだと、片目が横6cm、縦3cmぐらいで、問題なく被ることができます。
HoloLens自体は前後に調整することもできるので、被ることのできる幅は広いと思いますが、それでも縦が大きいとかぶれない可能性が高いと思われます。
スクリーンの位置合わせ
マススカーソルに相当するGazeカーソルというのがありまして、ヘッドトラッキングでカーソルを動かすので、ちゃんと目と目の間に来てないととても疲れます。
Gazeカーソルはスクリーンの中央に表示されています。スクリーンがちゃんと目を覆うような位置に調整するのが良いと思います。被った状態で良く見るとグレーがかかった場所が見えますのでそれです。
カーソルやスクリーンは、IPD(瞳孔間距離)によっても見え方が変わるので、座りの良い位置が見つかったら、Calibrationをやり直してIPDを調整しなおします。
Calibrationは、初起動時に自動で実行されますが、アプリとしてインストールされているものですので、あとで何度でもやり直すことができます。スタートメニューから辿って起動するか、Cortanaにお願いすれば起動します。
VR機器などでIPDが正確にわかっているかたは、DevPortalから直接入れても良いと思います。
チュートリアル
HoloLensAcademyとして、MSが用意してるやつがあります。
最近、日本語版も公開されました。
ただ、現在(2017/03/30)の所、HoloLensのページが全体的に改修中なのか、リンクがほぼ死んでいます。ググった結果も死んでます。新しいページにリダイレクトもされないので、HoloLensのトップページから辿るしかありません。
Unityからリモート起動する場合
UnityでビルドするとVisualStudioが自動で立ち上がりますが、自動で立ち上がったソリューションからはリモート起動することができません。
ビルドする際に自分で指定したフォルダにあるslnファイルを開いて、そっちから起動します。
UE4 見下ろし2Dゲームの移動処理(TopViewMovement)を作る
久々の2Dゲームネタです。タイトルの通り、見下ろしタイプの2Dゲームの移動処理を担うMovementComponentをつくってみます。
見下ろし移動とは?
RPGや縦STGなどでよく見る真上からキャラクターやマップを見ていることを見下ろし視点と言います。
2Dゲームでは上下左右の4方向、もしくはそれに斜めを追加して8方向に動かします。これは、コントローラの十字キーと一致させるためにそうなっています。
もちろん、回転操作をいれて任意方向に進めるようにしてあるものもありますし、モデルを使っている場合は、レバーを倒した方向に移動させるものもあります(UE4 TopDownテンプレート)。
ここでは見下ろし2Dゲームでは一番使われると思われる8方向移動させることにします。
見下ろし視点は英語ではTopDownView/TopViewと言いますので、実装するMovementComponentのことをTopViewMovementComponentと呼ぶことにします。
TopViewMovementComponentの機能
以下の機能を実装します。
- 8方向移動
- 8方向移動するナビゲーション移動
ナビゲーションが入っていますので、Pawn向けのMovementComponentとして実装します。
TopViewMovementComponentの実装方針
TopViewMovement実装の一番の難点は、ナビゲーション移動を8方向に制限することです。ナビゲーション移動は最短距離を突き進みますので、移動中かなり自由な向きを取ります。
以下の記事のようにすることで、移動すべき方向ベクトルを取得することができます。
これを利用して、移動すべき方向ベクトルから8方向のどれに一番近いかを判定して、その方向に動かすように実装することで実現します。
上記記事の通り、C++で実装しないと移動すべき方向ベクトルが取得できませんので、TopViewMovementもC++で実装することにします。
また、MovementComponentは裏で色々と処理を行っているようなので、全部自作することはせずに、FloatingPawnMovementComponentを継承し、必要な部分だけカスタマイズすることにします。
UCLASS(ClassGroup=Movement, meta=(BlueprintSpawnableComponent)) class PROJECT_API UTopViewPawnMovement : public UFloatingPawnMovement { ... }
なお、完全なコードは載せるのは長いですので、この記事では大まかな実装の紹介だけにします。
MovementComponentでの移動処理
まずは簡単にですが、MovementComponentでの移動の仕組みを紹介します。
TickComponentで移動する
移動を行うタイミングはComponentのTickです。TickComponentメソッドの中で、SafeMoveUpdatedComponentメソッドを呼ぶことで移動が行われます。
SafeMoveUpdatedComponentメソッドに、そのTickで移動する分のベクトルを渡します。
void UTopViewPawnMovement::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction * ThisTickFunction) { FVector DeltaVel = /* ... このTickで移動するベクトルを計算 */ ; const FQuat Rotation = UpdatedComponent->GetComponentQuat(); FHitResult Hit(1.f); // 移動(座標の変化)が行われる SafeMoveUpdatedComponent(DeltaVel, Rotation, true, Hit); }
第一引数の移動ベクトル分、座標が変化します。
第三引数がSweep処理を行うかのbool値です。trueにするとSweep処理が行われ、Hitがあれば第四引数のHitResultクラスに結果が入ります。
移動メソッドは移動するための情報をため、実際の移動処理はTickComponentで行う設計となっています。
Velocity変数に移動方向がためられる
MovementComponentは、Velocityという変数を持っています。AddInputVectorなどの移動メソッドによる移動ベクトルの計算結果がためられていきます。
このVelocityは、次のTickでの移動方向を現します。長さは1以下で、最大速度をスケールします。Velocity変数を元にして、SafeMovementComponetメソッドの第一引数に渡す移動ベクトルを計算します。FloatingPawnMovementComponentやCharacterMovementComponentの最大速度はunit/secですので、DeltaTimeを乗算するのが基本の求め方になります。
FVector DeltaVel = Velocity * MaxSpeed * DeltaTime;
自作の移動メソッドを作る時は、このVelocity変数と合成するのを忘れないようにしましょう。
8方向移動
XY平面(TopView)上の8方向とします。X方向が右に正、Y方向が下に正の座標系です。
8方向は上方向を1として時計回りに1ずつ増やして、1~8のByteで扱うことにします。0は方向なしとして扱います。
方向を表すenumを作っても良いのですが、それはBP側に作ることにします。代わりにByteで表すことでenumと連動しやすくしておきます。
移動メソッド
// 指定した方向に移動する。DirectionはTOP(1)から時計回りに1ずつ増える。0は停止 UFUNCTION(BlueprintCallable, Category="TopViewPawnMovement") void UTopViewPawnMovement::MoveToToward(uint8 Direction) { FVector Vel = DirectionToVector(Direction); AddInputVector(Vel); }
方向に応じた移動ベクトルを計算して、AddInputVectorを呼びVelocityに設定しています。TickComponentでVelocityに応じた通常の移動処理を行います。
方向からベクトルを計算する関数は以下の通りです。
// 方向を単位ベクトルに変換する FVector DirectionToVector(uint8 Direction) { float sin=0, cos=0; switch(Direction) { case 1: // 上 return FVector(0.f, 1.0f, 0.f); case 2: // 右上 FMath::SinCos(&sin, &cos, FMath::DegreesToRadians(315.f)); return FVector(cos, sin, 0.f); case 3: // 右 return FVector(1.0f, 0.f, 0.f); case 4: // 右下 FMath::SinCos(&sin, &cos, FMath::DegreesToRadians(45.f)); return FVector(cos, sin, 0.f); /* ... 以下続く ... */ } }
8方向移動するナビゲーション
ナビゲーション移動を開始するメソッドは、AIMoveToなどFloatingPawnMovementComponentに実装されているものをそのまま使えます。
紹介した記事に従って、まずはナビゲーションによって計算された移動方向をインターセプトします。
void UTopViewPawnMovement::RequestDirectMove(const FVector& MoveVelocity, bool bForceMaxSpeed) { NavVelocity = MoveVelocity; }
RequestDirectMoveメソッドをオーバーライドして、ナビゲーション移動方向であるMoveVelocityを保存しておきます。
TickComponent
先に書きました通り、実際の移動処理は、TickComponent内で行います。
ナビゲーション移動状態かは、以下のコードで判定します。
const AControlloer Controller = PawnOwner->GetController(); if(Controller && Controller->IsLocalController() && !(Controller->IsLocalPlayerController()) && Controller->IsFollowingAPath()) { /* ... ナビゲーションの移動処理を行う ... */ }
MovementComponentを持っているPawnのControllerが「ローカルのコントローラであり、PlayerControllerでなく、パスフォロー状態である」という判定になります。
ナビゲーション移動処理は、以下の通りです。
if(NavVelocity.SizeSquared2D()>0.f) { const uint8 direction = VectorToDirection(NavVelocity); MoveToDirection(direction); }
ナビゲーション移動ベクトルが存在しているかをチェックし、ベクトルを方向に変換して、先ほど実装した8方向移動メソッドに渡します。
ベクトルを方向に変換する関数は以下の通りです。
uint8 VectorToDirection(const FVector Vel) { float angle = FMath::RagiansToDegrees(FMath::Atan2(Vel.Y, Vel.X)); if(angle<0.f) angle += 360.f; if(22.5f<=angle && angle<67.5f) return 4; // 右下 else if(67.5f<=angle && angle<112.5f) return 5; // 下 else if(112.5f<=angle && angle<157.5f) return 6; // 左下 /* ... 以下続く ... */ }
360度を8分割し、どの分割範囲に入っているのかを判定しています。分割する範囲の中央には8方向がそれぞれ入るような分割にしています。
なお、元々、任意の方向が取れる前提のナビゲーション移動を無理矢理8方向に制限していますので、通常のナビゲーション移動とは違う動きをする可能性があります。方向の切り替え角度をまたぐような移動が連続してしまいカクカクした移動になるなどです。これは仕様上どうしもないですので、目的地設定を変えるなど、上手く対応してください。
まとめ
8方向移動をするTopViewMovementを作る指針を紹介しました。自作のMovementComponentを作るヒントになればと思います。
TopViewMovementを完成させるには、ここで紹介する以外の所にも手を入れないといけないのですが、それは実際のコードを見てください。
移動を伴うゲームに取って、移動処理というのは肝になる部分です。UE4が用意しているMovementComponentは、必要最小限ですので手をいれる必要がどうしてもあります。
例えば自分の場合は、これらの処理を基本として、
- 指定方向に指定時間だけ移動する
- 指定方向に指定距離だけ移動する
なども実装し、簡単に移動演出を行えるようにしています。
TopViewMovementComponentのソース
完全な実装は、以下のgithubに公開しておきますので好きに改造しておつかいください。
実際に桃子と夢のシールで使っているものを、公開用に少し手直ししたものになります。使い方などは、READEME.mdをご覧ください。