johnnyGameStudio’s blog

無能なゲームプログラマのぼやき ぎーくになりたい Twitter: https://twitter.com/JGS_Developer

認定スクラムマスターを取得

認定スクラムマスターを取得

題名の通り
認定スクラムマスターになるには研修に参加する必要がある
研修費用は個人だとかなり高額なので受講する際は会社と交渉するべき f:id:johnnygamestudio:20190613220013p:plain

スクラムマスター研修

会場は神谷町のオフィスビルだった
参加した人数は全部で60人ほどで6人で1チームになり、基本的にワークショップを行ったりスクラムの詳細な事例などを説明されたりする形で進行し計2日間にわたって行われる
個人的に印象に残ったのは「コンテキストスイッチ」という概念の体感ワークショップ
コンテキストスイッチとは簡単に説明すると、異なるタスクを同時進行した場合タスクの切り替え時に総労力の20%がロスとして発生するというもの
実際に行ったワークショップの例を下記に説明するので是非やってみてほしい

アラビア数字と漢数字とアルファベットを書く

用意するのは1枚のA4用紙とストップウォッチ
そこにアラビア数字、漢数字、アルファベットを書くためのスペースを作るために区切りを書く

その① それぞれ交互に書いていく

アラビア数字、漢数字、アルファベットを画像のように書いていき、10まで書き終わるまでのタイムを計る
f:id:johnnygamestudio:20190613230451p:plain

その② 10まで書ききったら次へ移る

アラビア数字、漢数字、アルファベットを画像のように10まで書き終わったら次の文字へ移るように書いていってそのタイムを計る
f:id:johnnygamestudio:20190613230501p:plain

結果

やってみればわかるが①でやったやり方だと時間がかなりかかるが②のやり方だとかなり速くなる
個人差はあるが、私の場合はその①は1分かかり、その②だと30秒ほどだった
こんな簡単なタスクでもコンテキストスイッチが発生するということは実際の業務ではさもありなんというである

認定スクラムマスター試験

認定スクラムマスターの試験はWEBブラウザ上で行う
私の場合は研修終了の翌日にメールアドレスへ試験へのリンクが届き、試験を受けることができるようになる
問題は全部で30問あり23問正解すると合格となる
特に会場に出向くなどはないので自宅や職場で受験が可能
難易度はそこまで高くないが研修でのスクラムへの理解度が試されるような問題となっており、研修で行った内容がそのままテストに出るようなことはない
制限時間などはなく、ggり放題なのだがggっても特に正解が出てくるような問題でもなかったりするので注意が必要
研修だけでなく、自分で本を読んだりしてある程度勉強していればたぶん落ちることはないと思われる
(と言っているが私の点数は24点だった。ギリギリ)

総評

研修自体はかなり楽しかった
ほかの業界の開発者と色々話せたのも良い経験になった
スクラム開発に興味がある人は受講をお勧めする
現在、新しいチームでスクラム開発を初めていこうとしているところなので組織全体へ波及できるようにしっかり成果を出していかなくてはならない

f:id:johnnygamestudio:20190613220028j:plain
緑のトレーナー着ているのが私

【今更】Twitch本社に行ってきました【GDC2019】

3月にGDC2019に行ってました

本当に今更ですが、GDC2019に参加してきました
その際にAWSさんのご招待でTwitch本社に行ってきたのでレポートしておきます

超綺麗なロビー

Twtich本社はサンフランシスコの街中にひっそりとTwitchの看板が見えるビルに入っています
中に入るとロビーがあってID照会をしないと入れない仕組みになっていました
f:id:johnnygamestudio:20190531023504j:plain f:id:johnnygamestudio:20190531023445j:plain

無料で利用できる綺麗な食堂

Twitchでは従業員なら無料でランチをすることができます
さらに飲み物やアイスも無料で食べることができてまさに至れり尽くせり
ですが、ここサンフランシスコで優秀な人材を獲得しようとするならこれらは至って普通だそうです
おそろしやサンフランシスコ

f:id:johnnygamestudio:20190531023813j:plain f:id:johnnygamestudio:20190531023810j:plain

豊富なメニュー

メニューは日によって違っていてハンバーガーやピザ、サラダチキンなどもありました
それだけでなく、ランチでもお酒を無料で飲めてしまいですが、パッと見た限りさすがに昼間から酒を飲んでいる人は見当たりませんでした

f:id:johnnygamestudio:20190531024145j:plainf:id:johnnygamestudio:20190531024149j:plainf:id:johnnygamestudio:20190531024152j:plain f:id:johnnygamestudio:20190531024843j:plain

実況設備も完備

Twitchなのでもちろん実況設備も充実しており、僕が見た限り大小さまざまな実況室が5つくらいはあったと思います
f:id:johnnygamestudio:20190531025031j:plain

個人的に一番良かった点

サンフランシスコのオフィスの多くはオープンテラスがあり、そこで談笑したり仕事したりしている従業員の方がいたのが印象的でした
すごいサンフランシスコっぽい
f:id:johnnygamestudio:20190531025208j:plain

【UE4】最小構成でC++クラスの自動テストを試してみた

はじめに

第3回UE4何でも勉強会 in 東京に参加したが、その中で自動テストについて触れられており、興味があったのでUE4の自動テストについて触ってみた
しかし、Blueprintでのテスト手順はいくつかヒットしたが、ほとんど説明しているブログが見当たらず、あってもあまり詳細には書かれてなかったりしていたので最小構成でのC++クラスのテストをまとめておく

実行環境

UE4.21.2
VisualStudio2017

実行手順

1. プラグインを有効にしてエディタを再起動

まず最初にプラグインを有効にする。メインメニューから
編集>Plugin
を開いて、その中の「Testing」という項目を選択
その中にあるPluginはすべて有効にして、その後再起動
(これらを有効にすると、エディタの再起動を求められる。[Restart Now] ボタンをクリック)
image.png

2. セッションフロンドエンドを開く

ウィンドウ>デベロッパーツール>セッションフロントエンド
を開く
sessionFront.png

開くと「このアプリケーション」の今開いている項目を選択(緑色のアイコンになっていればOKなはず)
その後オートメーションタブを選択
sessionFront2.png

※すでにこのままでもC++以外の既存の機能はテスト可能

3.テストしたいクラスを用意する

今回は最小構成でやっているため、適当にActorを継承したAMyActorクラスを用意した
実装したcppファイルは以下のようになっている(ヘッダーは特に何もしていないので省略)
解説はソース内にコメント

// Fill out your copyright notice in the Description page of Project Settings.

#include "MyActor.h"
#include "AutomationTest.h"//マクロをつかうため

namespace
{
    AMyActor* actor = nullptr;//テストクラスからアクセスできるように無名名前空間でインスタンスのを確保(これで正しい方法かは疑問だが楽)
}
// Sets default values
AMyActor::AMyActor()
{
    // Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
    PrimaryActorTick.bCanEverTick = true;
    actor = this;//コンストラクタで自身のポインタを渡しておく
}

// Called when the game starts or when spawned
void AMyActor::BeginPlay()
{
    Super::BeginPlay();
    
}

// Called every frame
void AMyActor::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

}
//テストクラスから呼び出される関数
void AMyActor::ExecuteAutomationFunc()
{
    UE_LOG(LogTemp, Log, TEXT("Autonmation TEST"));
}

/*以下テストクラスの生成
AutomationTest.h内に書かれているマクロ「IMPLEMENT_SIMPLE_AUTOMATION_TEST」を使う
マクロの中身を見る限り、コンパイル時?にこのcppファイル内に第一引数で指定した名前のクラスを自動生成
RunTest関数を自動テスト側が実行するという仕組みだと思われる
第2引数はセッションフロントエンド内でのカテゴリ分け
ほかにもマクロが色々あるがそれは最後のリンクを貼っている参考にした記事で確認してみてほしい
*/
IMPLEMENT_SIMPLE_AUTOMATION_TEST(FMySimpleTest, "MyTest.MySimpleTest", EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter)
bool FMySimpleTest::RunTest(const FString& Parameters)
{
    actor->ExecuteAutomationFunc();
    return true;
}

4. テスト実行

マクロの第2引数で渡したカテゴリの設定が反映されているはずなのでそれを有効にする
(今回の場合だと「MyTest.MySimpleTest」)
テストしたい項目を有効にしたら「テストを開始する」ボタンを押す
image.png

5. 結果

以下のように
- [x] MyTestが実行されている
- [x] AMyActorのメンバ関数内のLogが正常に吐かれている
- [x] すべてのテストが正常に成功して終了している
これらが確認できるのでテスト完了。

image.png

参考

公式:自動化システムの概要
自動テストの追加方法

【UE4】Unityで慣れたゲームPGがUE4に乗り換える際のTips

はじめに

最近Unityから離れてUE4触ってみようとするゲーム系エンジニア増えましたね
そんな人たちに向けて、実際にUnityに慣れたプログラマUE4に移行してみたときに困ったポイント・知っておいたほうがいいポイントをまとめてみました
正直、始めたばっかりなので間違っている箇所もあるかもしれませんがその際はコメントしていただけると助かります

本記事の対象となる人

  • C++なんもわからんという人
  • Unityなら一通り触っていたという人

参照渡しとポインタ渡しと値渡し

なにをいってもこれ
もちろん、C#にもこれらはあるわけですがC++ではより厳格な制御が求められます
例えば、C#でこんな感じで書いた場合だとString型のtmpはhoge関数の引数として渡されてもC#のString型は参照型なのでコピーはされません
(もちらんintなどの値型が引数ならコピーされます)

void hoge(string str)
{
...
}

void foo()
{
    string tmp = "hello";
    hoge(tmp);//参照型なのでコピーは発生しない
}

また、C#で参照渡しを行いたい場合はrefを使います
現場によりけりだと思いますが、refを使うことはUnityだとあまり使用するタイミングは少ない気がします
(使うケースだと関数内で引数の中身をいじることを明示的に示したい時などでしょうか)
何が言いたいかというと、C#の場合は割と雑に書いてもコンパイル通るし問題ないように動きます
しかし、C++はそうはいきません
先ほどのように書くと値渡しとなりコピーが発生します

void FooClass::Hoge(FString str)
{
...
}
void FooClass::hogehoge()
{
    FString tmp = TEXT("Hello");
    Hoge(tmp);//値渡しなのでコピーが発生する
}

これを防ぐにはポインタ渡しが参照渡しを行ってあげる必要がありますので以下のようにする必要があります
また、値渡しでない場合はconstを積極的に使ったほうがよいでしょう
※ポインタ渡しと参照渡しがなにかという説明はほかに色々記事があるのでここでは説明しません

void FooClass::Hoge_pointer(const FString* str)
{
...
}
void FooClass::Hoge_ref(const FString& str)
{
...
}
void FooClass::hogehoge()
{
    FString tmp = TEXT("Hello");
    Hoge_pointer(&tmp);
    Hoge_ref(tmp);
}

列挙型の文字列化

C++では列挙型を文字列化させるように気の利いた機能はない
C#のようにToString()で簡単に文字列化させてくれるなんて素晴らしい機能はない
だが安心してほしい、UnrealC++ではそこらへんはカバーされている。ありがとうUE4

UEnumをStringに変換する方法はこちら
もしくはこっち

ただし、これはUEnumの列挙型だけであり、なんらかの理由によりUEnumが使えず、普通に宣言されているenumは泥臭く実装するしか方法はないです(あったら是非教えてほしい)
つまり、いい感じのマクロを組んだり、Map(C#でいうところのDictionary)を使用して文字列を列挙型の各値と連結させるしかない
ここらへんは下記リンクで世界中のエンジニアが試行錯誤しているのでぜひ参考にしてください
世界一悲しい話をしている場所はこちら

関数の呼び出し履歴

Unityの場合、Debug.Logを使えばその関数でLogが吐き出されるまでの経路をConsoleウィンドウで確認できますよね
僕の場合はよくこれを使ってデバッグとかしていたんですが、UE4ではそれはできません

呼び出し履歴を知りたい場合はブレイクポイントを使うしか方法はありません
UE4のブレイクポイントを使うための方法などはこちらの方がまとめてくださってます

改造UE4使ったときのインテリセンスがやばい

小さいProjectデータや改造UE4を使っていない場合などは言うほど、重くならないのですが、僕の場合改造されたUE4を用いて作業をしているのでVisualStudioが参照しようとするファイル数が尋常ではなく、インテリセンスがほとんど機能しません
ですが、こちらの記事を参考にしてもうらうとかなり軽減されます

For those who suffer from Visual Studio IntelliSense slowness

簡単に解説すると、ソースファイルを変更した際にインテリセンスはすべてのパスを検索して参照を見つけており、UE4のエンジンデータは特に量が多いです。なので、エンジン側を毎回検索せずにすることで高速化しているようです。

余談ですが、個人的に予測IntelliSenseを使いたいので
オプション > テキストエディター > 試験的 > 予測IntelliSenseの有効化をTrueにしてます

image.png

includeとはなにかということ

Includeとは何をしているか知っていますか?
includeを行うとコンパイル時にその宣言された部分に指定されたヘッダープログラムを差し込み、そのプログラムファイル内で外部のクラスなどを扱えるようにしています
なぜこれをちゃんと知っておくことが大事かというとコンパイル時間に差が出てくるからです
UE4C++クラスを作成するとヘッダーファイルにこんな宣言がされているのを確認できると思います

#pragma once//これ

#include "CoreMinimal.h"
...

これは何を意味するかというと、このヘッダーファイルを読み込んだ時に二重に読み込まれることを防ぐ効果があります
たとえば以下のように二度同じヘッダーをincludeしてしまうとコンパイル時に二つ同じ関数や変数が存在することになっていまい、予期せぬエラーの原因になったり、コンパイル時間が増加したりするなど悪影響を及ぼします

#include "Sample.h"
#include "Sample.h"

ですが、このSample.h内で「#pragma once」が宣言されていればそのようなことは防ぐことができるというわけです
なので、新しくクラスを作成した際は必ず#pragma onceを宣言することを忘れないようにしましょう
詳しく知りたいかたはこちら

無名名前空間

↑のコンパイル時間を長くしない、ということに関連して無名名前空間は使ってほうがいいかなと思います
無名名前空間はCPPファイル内で宣言できるためコンパイル時間を長くしなくて済むほか、外部から見えるヘッダーファイルでは見てほしくない関数名や変数名などを隠蔽するための機能です
ヘッダーに宣言しているとアクセスできなくても関数などは見えてしまうため、設計的にそれは好ましくない場合などで使います
無名名前空間を使うときは「そのファイル内で完結する関数・変数」に限ります
具体的には以下のように使います

#include "Test.h"

namespace
{
    void Hoge()
    {

    }
    int foo;
}


// Called when the game starts or when spawned
void ATest::BeginPlay()
{
    Super::BeginPlay();
    Hoge();
    int a = foo;
}

まとめ

以上C++なんもわからんゲームプログラマがUnityから移住してきた際に知っておいたほうがいいTipsでした
ほかにも色々ありますが、長くなるのでいったんこれで締めます
参考になれば幸いです
間違いなどありましたらコメントください

【UE4】Android向けビルドを行うとrungradle.batでエラーが出る問題

環境

Windows10
UE4.21.2

現象

こちらと同様です
https://answers.unrealengine.com/questions/720605/android-packaging-build-fail-ue-418.html
私の場合はOculusGoのビルド環境を整えていた時にこの現象に遭遇しました

LogPlayLevel: Error: ERROR: cmd.exe failed with args /c "C:\UE4_Prj\TestVR\Intermediate/Android/APK\gradle\rungradle.bat" :app:assembleDebug

いろいろ調べて解決方法はブログでまとめられている方がいらっしゃいましたが、断片的になってしまっておりまとめている人がいなかったので備忘録的にまとめておきます

↑のAnswerHub通りに

1. run NVPACK/android-sdk-windows/tools/android.bat

2. click on "Deselect All"

3. update Extras/Android Support Repository

を行っても解決しない!なぜだ!

という現象が発生します

Ant使えばBuildできちゃう

一応
Project Setting > Android > Enable Gradle instead of Ant
のチェックを外すとビルドは成功できちゃいます

enableGradle.PNG

しかし、これは根本的な解決になっておらず単純にGradleを使わずにAntでビルドしちゃいましょうという話なのでそれはちょっと・・・という感じなのでこれはダメ

原因と解決方法

原因はGoogleがライセンスを更新したのですが、その対応がUE4.21では間に合っていないことらしいです

なので

  1. こちらのpackage.xmlから中身をコピーする
  2. Engine/Source/ThirdParty/Android/package.xml にコピーした内容を上書き
  3. プロジェクトを立ち上げ「Project Setting > Android > Accept SDK License ボタンを押す

これで無事ビルドできました
詳細なことは↓のepic gamesのおかずさんのブログで解説してくれているので目を通しておくといいと思います

追記

1のリンクが404になる場合があるようです このリンクを開くにはGithubアカウントをEpicGamesのUnealEngineリポジトリを開けるようにする必要があります その方法は以下のリンクを参照してください 公式ドキュメント-GitHubとは?

参考

http://pafuhana1213.hatenablog.com/entry/2019/02/06/010250

【UE4】プラグインを追加する場合の手順

はじめに

プラグインUE4に認識させるまでは結構いろいろなブログなどで取り上げられておりBPだけならそれでも良いのだが、実際仕事をしていればC++で作業することになると思う その場合は自分で追加したC++のコードからプラグインAPIを使用することになるが、モジュール参照を追加しなければincludeすることができない ちゃんとそのあたりも含めて手順をまとめている記事が少なかったのでまとめてみた
足りない手順または間違っている場合はコメントしてください

作業環境

Windows10
UE4.21.2
VisualStudio Community 2017

追加手順

0.前準備

  • C++プロジェクトデータであること
  • 追加したいプラグインのソースを用意してあること

1.プラグインのソースをプロジェクトに追加

プロジェクト直下に「Plugins」フォルダを作成してその中にプラグインのソースを追加する f:id:johnnygamestudio:20190219005051p:plain f:id:johnnygamestudio:20190219005110p:plain

2.UE4プラグインを認識させる

〇〇.uprojectを右クリックし「Generate visual studio project files」を選択する
こうすることでslnファイルが再生成される(ちなみに、バージョン管理ツールなどの都合でslnファイルがない場合もこれで0から生成される)
ue4plugin_2.PNG

3.VisualStudioを立ち上げてモジュール参照を追加する

UE4ソースコードはモジュールと呼ばれる単位ごとにUnrealBuildToolがビルドを行っている
なのでこの作業を行っていない場合includeに失敗するので気をつけよう

まず、VSを起動してソリューションエクスプローラから「(プロジェクト名).Build.cs」を開く
ue4plugin_4.PNG
PublicDependencyModuleNamesに追加したプラグイン名を追加して完了
ue4plugin_5.PNG

参考

UE4 プラグインを自分でビルドしてみる
[UE4] モジュールについて

AWS学習レポート①VPCを使ったネットワーク設計について

AWS学習レポート書いた経緯

最近全然アプトプットできていないのがとても嫌なのでレポート形式でちょっとずつ書くことにしました なにもしていなかったわけではないのです,AWSの本読んだり実際に触ってみたり、英語の勉強したり、マネジメント本を読んだりしていました。 正直個人製作のほうはほとんどできていません。新しいPCが届いたらUE4の記事書こうとは思ってます

で、AWSの勉強っていっても範囲はすごくひろくてそのすべてをうまいこと記事にする能力はないのでAWSが提供する基本的なサービスを一つずつ備忘録的に書き記していこうかなと思ったわけです 最終的にはAWSSAアソシエイトの資格を取得できるといいなって思ってます(とれるかな・・?)

AmazonVPCとは

Amazon Virtual Private Cloud (Amazon VPC) を使用すると、定義した仮想ネットワーク内で AWS リソースを起動できます。仮想ネットワークは、お客様自身のデータセンターで運用されていた従来のネットワークによく似ていますが、AWS のスケーラブルなインフラストラクチャを使用できるというメリットがあります。 ※AWSユーザガイドより引用

よくわからんですね。 要するにAWS上にプライベートネットワーク環境を構築できるサービスで AWSを用いてサービスを運用する場合、かなり多用することになる代表的なサービスの一つです

VPCを使ってネットワーク設計をする際のポイント

リージョンの選択

リージョンとはデータセンターのある場所だと考えていればいいと思います(東京とかオレゴンとか)
リージョンはAZ(アベイラビリティゾーン)と呼ばれる複数のデータセンターで構成されており、東京には現在4つのAZが用意されています
リージョンを選択する際には以下のポイントを気を付ける必要があります

  1. 法規や社内規定を満たすか
    データには保存先の国の法律が適用されるため、社内規定には触れないかどうか、保存先の国では問題ないかなど考慮する必要があります

  2. ユーザとの距離
    データセンターとユーザーの距離が物理的に離れていると、通信速度がどうしても遅くなってしまいます。
    そのため、サービスの内容によっては設置したリージョンから離れた場所にいるユーザだと満足のいくサービスの提供ができない可能性がでてきます。
    ちなみに東京リージョンとアメリバージニア北部リージョンのレイテンシーの差は200ミリ秒ほどあります。

  3. 使いたいほかのAWSのサービスが使えるかどうか
    VPCはネットワーク環境を構築するサービスなため、多くの場合ほかのAWSのサービスと連携させます
    しかし、新サービスなどは一部のリージョンでしか利用できない場合があるため、そもそも利用できるリージョンを選ぶ必要があります

  4. コストパフォーマンス
    AWSのサービスの価格はリージョンによって異なるため、価格の安いリージョンを選ぶことでコスト削減が見込めます

サブネット

サブネットとは大きなネットワーク環境をさらに小分けに分割したネットワークのことです
サブネットは基本的に独立しており、明示的に関係性を明らかにしない限り干渉しあうことありません
なぜ分割するかというと主な理由は以下の通りです

  1. 障害を広げないため
    物理的に隔離することで一つのサブネット内で障害が発生してもその影響を全体に広げない効果があります

  2. セキュリティ上の理由
    サブネットをわけることで別々の設定ができるため「特定のサブネットのみアクセスが可能にする」といったことが可能になります
    また、インターネットに接続するサーバーだけのサブネットを作り、ローカルネットワークから隔離することでセキュリティを高めたりすることができます

Internet Gateway

サブネットを作成するだけではインターネットに接続することができません
インターネットに接続するためにはInternet Gatewayへのルートを設定したカスタムルートテーブルを作成してサブネットに関連づける必要があります
なので、作成するサブネットはインターネットに接続する必要があるかなどを考える必要があります
また、インターネットに接続できるようにしたサブネットを「パブリックサブネット」、接続できないサブネットを「プライベートサブネット」と呼びます

パブリックIPアドレス/Elastic IPアドレスの割り当て

インターネットに接続するにはパブリックIPアドレスの割り当てを行う必要があります
AWSのパブリックIPアドレスプールからランダムに割り当てられ宇パブリックIPアドレスを使用してもよいのですが、この場合インスタンスが再起動するたびに変化してしまいます(それで問題ない場合もある)
もう一つの方法はElasticIPアドレスです。ElasticIPアドレスはAWSアカウントごとに割り当てられた固定IPアドレスインスタンスに紐づけて使います
独自ドメインのホスト名とIPアドレスを関連付ける場合など、インスタンスのパブリックIPアドレスを変更したくない場合はこちらを使います

Security GroupとNACLの設定

Security Groupはインスタンスレベルで動作するのに対して、NACLはサブネットレベルで動作します
用途によって使い分ける必要があります
詳細は長いので以下のリンクを参考してください

docs.aws.amazon.com

まとめ

ようやくVPCについてだけでもブログにすることができました
基本的なサービスは随時アウトプットしていきたいです 正直結構端折っているので詳しく知りたい方は本を読むなり、気になったワードを検索したほうがいいと思います

参考文献

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

Amazon Web Services エンタープライズ基盤設計の基本

Amazon Web Services エンタープライズ基盤設計の基本