Gaming Life

一日24時間、ゲームは10時間

C++で浮動小数点の誤差を考慮して等価比較する

<cfloat>ヘッダ中にあるDBL_EPSILONを使えば誤差も考慮して2つのdouble値の等価比較ができる。

float型ならFLT_EPSILONを使えばよい。

#include <cmath>
#include <cfloat>

//double型のaとbを誤差考慮して比較する
bool NearlyEqual(double a, double b)
{
    return abs(a - b) < DBL_EPSILON;
}

int main()
{
    double a,b;

    if(NearlyEqual(a,b))
    {
        return 0;
    }

    return 1;
}

追記(11/07) 故あってUE4の数学ライブラリ読んでたら似たような関数があったので、それに習って書き換えてみる。

struct Math
{

    static constexpr bool NearlyEqual(const float a, const float b, const float err = FLT_EPSILON)
    {
        return Abs<float>(a - b) <= err;
    }

    static constexpr bool NearlyEqual(const double a, const double b, const float err = DBL_EPSILON)
    {
        return Abs<double>(a - b) <= err;
    }

    template<typename T>
    static constexpr inline T Abs(const T a)
    {
        return (a >= (T)0) ? a : -a;
    }
};

Unity2018でTestRunnerを使うための参考リンク

現在Unityでゲームを作ってる。

PlantUMLで設計書から作り始めてるんだし、折角ならテストコードも書いてみたいよなー、とTest Runnerを試してみたのだが、Unity2018でTestRunnerの導入方法が大幅に変わっていて、困ったので参考になったサイトをメモ。

(plantUMLについては以前書いた)

ai-gaminglife.hatenablog.com

Unity2018以降でのTest Runnerの導入方法

ntgame.wpblog.jp

大体このサイト読めば解決すると思う。

Test Runnerの使い方

www.slideshare.net

  • そもそもテストってなんやねんってところから解説している。若干古い(2015年)情報であることは注意。

qiita.com

  • 初めてテストを書く時に参考になる。TestRunnerを使うメリットが分かる。

tsubakit1.hateblo.jp

  • Unityテスト完全に理解した勉強会のスライド集。2018年の情報で(記事執筆時点では)新しい情報なのが嬉しい。

実際使ってみて

  • 一々MonoBehaviorでnewしてAttachさせてDebug.Log()させる手間が省けるのは良い。

  • 設計がカッチリ決めてからの開発には向いているが、場当たり的な開発には向いてなそう。(テスト自体そう)

ほんの少しだけラクに、C++でAtCoderに参加するバッチファイル作った

先々週のABCからAtCoderを始めた。

前回参加時はたまたまTwitterを見ていた時にコンテスト開催中だということに気づき、折角だしやるか、と衝動的に参加したため、VS2017で書いて、動くかどうかは実際提出してみて試す、なんて非効率な事をしていた。

折角やるならちゃんと環境整えて、ローカルでもテストできるようにしたいよなー、ということで比較的簡単に環境構築できるバッチファイルを作った。

※と言ってもただディレクトリ作るだけの奴だけど......

前準備

torus711.hatenablog.com

このサイトを参考に最新のgcc導入まで済ます。

エディタには今回はVSCodeを採用。codeコマンドを叩いてVSCodeが起動すればOK。

バッチファイル作成

適当なフォルダでメモ帳を開いて、名前を "atcoder-init.bat"とする。

以下をコピペしてbatファイルに貼り付ける。(後から編集したい時は右クリック→編集を選択。左クリックするとバッチファイルが実行されてしまう)

cd /d [保存したいディレクトリ、自分で決める]
mkdir %1
cd %1
mkdir A
mkdir B
mkdir C
mkdir D
cd A
type nul > input.txt
type nul > Main.cpp
cd ..
cd B
type nul > input.txt
type nul > Main.cpp
cd ..
cd C
type nul > input.txt
type nul > Main.cpp
cd ..
cd D
type nul > input.txt
type nul > Main.cpp
cd ..

PATHを通す

(Windows10なら)スタートメニューで「環境変数」と入力すれば「環境変数を編集」メニューが出てくるのでそれを選択。(Win10、なんでコントロールパネル深いところに隠したんだろうか……)

出てきたウインドウの上側、ユーザー環境変数で、Pathを選択してから編集をクリック。

新規ボタンをクリックし、先程バッチファイルを保存したパスをコピペして保存する。

使い方

コマンドプロンプト(Not PowerShell)で

> atcoder-init [引数1]

を叩くと引数1に選択したディレクトリ以下にA~D問題を解くための作業ディレクトリが作成される。

A問題を解きたい時は

> code A

を入れればVSCodeが起動し、標準入力用のinput.txtと実際にコードを書くMain.cppを編集できる。input.txtには問題ページからサンプル入力をコピペしてはっつければいい。

Main.cppを編集し終えたら

> g++ A/Main.cpp

コンパイルコンパイルが通ったら、

> a.exe < A/input.txt

で実行する。

まとめ

ごくごく単純なバッチファイルだが、以前よりは確実にラクにテストできるようになった。世の中にはサンプル入力をスクレイピングして自動で拾ってくるようなのもあるらしいが、そんな技術はないので、仕方ない。

もっとラクなのがあったら教えてほしい。

水色までは頑張りたいなあ。

C# if文なしにプロパティで数値に上限/下限を設定する

月とか時間とか、数値に上限下限を設定したいとき、素直に実装するならif文使ってこんな感じにやる。

int month;
void setMonth(int value)
{
    if(value <= 1){
        month = 1;
    }else if(value >= 12){
        month = 12;
    }else{
        month = value;
    }
}

これじゃあやってることに対してコードが冗長すぎ。

解決策何かしらあるだろうなーと思って調べてみたら、Mathf.Min()やMathf.Max()を使えばできるらしいことが判明。折角のC#なのでプロパティを使ってもっとスマートに書いてみる。

public class Month
{
    //packing Field
    private int monthNum = 1;
    public int MonthNum
    {
        get { return monthNum; }
        set { this.monthNum = Mathf.Min(12, Mathf.Max(1, value)); }
    }
}

シェーダー芸やってる人やある程度プログラム書いてる人に取っちゃ当然の書き方なのかもしれないが、知らなかったので自分用にメモ。

まあClamp使えばいいんですが。

VSCode+PlantUMLでクラス設計図が簡単に作れる

 ブログ執筆を始め、ずっとエディタはAtomを使っていたのだが、Gitの設定をいじっていたらパッケージインストールで認証エラーが出るようになった。解決の仕方も分からなかったので、この機会だしVSCodeに移行してみた。

 こんな感じで記事を書いてる。

f:id:ai_gaminglife:20181011000348p:plain

 動作も軽快、UIもわかりやすく、Markdown PreviewCSSがちょっと見辛い以外は不満はない。


 で、本題。これまで私は何本かゲームを作ってきたが、どれも開発期間は長くて1ヶ月。行き当たりばったりでクラスを作り、結果相互参照連発しコンパイル時間が伸びる酷い設計のプログラムを何度も書いた。

 現在作り始めているUnityゲームは相当大規模になりそうで、こんな行き当たりばったり設計しててはあらゆる機能を持ってしまう(所謂)神クラスが誕生してしまいかねない。

 じゃあどうするかっていうと、UMLを使ったクラス図を作って事前に設計したくなる。しかし、以前まではWordかdraw.ioでテキストボックスをちまちま配置し、コネクタ同士を矢印で繋げて、コメント書いて……みたいな方法で作っていた。見た目は凝れるが、あまりに面倒。大規模だと流石にやってられない。

 PlantUMLを使えばそんな面倒な作業からおさらばできる。

plantuml.com

 簡易な文法ながら高機能で、複雑なクラス図を自動で作成、描画できる。

 PlantUMLを使いはじめて2時間位でこれくらいは作れてしまった。

 PlantUMLの優れているところはVSCodeに専用の拡張機能があることで、これを使うことでサイドタブにクラス図を描画させながら快適なVSCode環境で書くことができる。

 導入には以下のサイトが参考になるだろう。

注意

 PlantUMLはコメントを書きたい時は、

' 1行コメントはこれ
/*
複数行のコメントは
こんな感じ
*/

とすれば良い。

台風で停電した。

台風25号で約一日停電した。

人生ではじめて経験した命の危険を感じた台風。幸いなことに近所で窓が割れるなどの大きな被害は起きなかったが、電気が止まったことで断水も発生し、シャワーもしばらく浴びられなかった。この記事を書いてる時間でもまだ復旧していない地区もあり、考え過ぎってくらいに事前に備えておくのが本当に大切だなと感じた。

以下に実際停電中に役に経ったものを紹介する。

モバイルバッテリー

考えるまでもなく超役に立つ品。私はAnkerの10000mAhくらいのものを使っていて、停電するかもと思い台風上陸前から充電していた。

まあ、

Switch版イース8徹夜攻略に使ってしまったんですが。

(大学が停電していないっていう情報を入手していたのでもしなくなったら大学行けばいいとこんな無茶をした。決して真似をしてはいけない)

iPad

最近買ったのでスマホよりバッテリー持ちも良く、読書もできるので重宝した。普段使うスマホ以外にサブ機持っておくのは本当に便利だなーとこの時程感じることはなかった。

現金

停電中電子マネーは使えないので。21号の時電子マネーしか持ってなくて何も支払いが出来ない増田が話題になっていたが、やはり万が一のため1万程度は現金で持っておいたほうが良いと思う。

キングブレード(ペンライト)

今回のMVP。一応懐中電灯は持っていたが暗くて使えたもんじゃなく。キングブレードは本を読めるくらいに明るく、そして軽く持ち運びにも便利。停電中買い物に出掛けたときも重宝した。

f:id:ai_gaminglife:20181002221248j:plain

使ってたキンブレ。色も切り替えられて超便利。

こんな使い方もできる。

UE4 ぷちコン制作で役にたった資料リンク集

 お久しぶり更新。ここ一ヶ月はUE4ぷちコン用の作品作りで忙しくブログが更新できていなかった。

 今回のぷちコンで作った作品はこちら。

www.youtube.com

 大学の先輩後輩3人と協力して作った、サードパーソンベースのアクションゲーム。背景アセット、敵のゾンビ等マーケットプレイスの力をガンガン借りて作った。

 今回の開発にあたり、初めてUE4のアニメーション機能を触ってみたり、ソース管理をしてみたり、色々と初な経験をすることが出来た。本来初めての機能を試す時は公式のドキュメントを読むのが筋なのだろうが、UE4の日本語版ドキュメントはどーも最近リンク切れを起こしがちな上、「○○という処理がしたい!」といった逆引き的使い方には向かない為、短期開発ではあまり使えない。(もちろん分からない事があればまず最初にドキュメントを漁ったほうが良い。公式が出す確実な情報なので)

 今回は、特にコミュニティの有志の方々が作成された素晴らしい資料にお世話になった。折角なので、特に参考にした資料を紹介したいと思う。

アニメーションBP関連

  • UE4勉強会 in 大阪 アニメーション基礎

UE4勉強会 in 大阪 - アニメーション基礎

  • UE4勉強会 in 大阪 もっとアニメーションBP

UE4勉強会 in 大阪 - もっとアニメーションBP

com04さん作の今回ダントツで参考にした2つの資料。特に剣士のアニメーションBPは殆どパクったといっても差し支えないくらい参考にしている。初心者が最初にアニメーションを実装するならまずこれを見るべき、ってくらいの神資料。

  • 猫でもわかるUE4のAnimation Blueprintの運用について

猫でも分かる UE4のAnimation Blueprintの運用について

Epic岡田さんの猫でもわかるシリーズアニメーション編。アニメーションBPの基本的な考え方がわかる。最初に読むというよりは、先述の2つの資料を読んでから、もう少し深いところを学びたい。上手な運用を知りたいって時に使える。

実はこの資料が発表されたMeetupに参加してたのだが、当時は全く分からなかった。アニメーションBPを極め本でほんの少し触ったことある程度だったし仕方ない。

  • UE4 Saitama 初心者向けハンズオン #5 『アニメーションモンタージュ(Slotアニメーション)でコンボを作る』

UE4 Saitama 初心者向けハンズオン #5 『アニメーションモンタージュ(Slotアニメーション)でコンボを作る』

コンボアニメーションを組むのに参考にした。最新のアニメーションモンタージュの解説資料だと一番初心者向きで分かりやすい。

  • [CEDEC2018] UE4で多数のキャラクターを生かすためのテクニック

[CEDEC2018] UE4で多数のキャラクターを生かすためのテクニック

今年のCEDECで公開された公式の神資料。今回4.19を使った開発であったことと、同時にキャラを出すのがせいぜい40体程度で、処理落ちに特に気を払わなければならない、ってわけではなかったので結果的にはこちらの資料で紹介されているテクニックは使わなかった。が、ここまでアニメーションの処理負荷について詳しく書かれている資料は無いので紹介だけ。

チーム開発手法(ソース管理など)

  • 第4回UE4勉強会 in 大阪 UE4でのチーム製作

第4回UE4勉強会 in 大阪 UE4でのチーム製作

またcom04さんの資料。UE4が標準で備えているコメント機能や、作業の分割のやり方の一例について紹介している。関数の説明欄に @param を使ってカーソルをあわせた時に引数に説明をつけることができることはここで知った。

  • UE4】BPをキレイにしよう:コメント編

dfkfuturelab.hatenablog.com

  • UE4】BPをキレイにしよう:折りたたみ編

dfkfuturelab.hatenablog.com

大福さんのブログ。チームで開発するなら特にBPの可読性を上げる事は重要で、こちらの記事はその助けになること間違いなし。

  • SVN はじめてのバージョン管理

papersloth.hatenablog.com

まめおさんのバージョン管理に関しての資料。SVNの基本の使い方を学べる。

ai-gaminglife.hatenablog.com

手前味噌だが当ブログで以前書いた記事。自宅にグローバルIPが振られておらず、自宅鯖を構築出来ないが、リモートのリポジトリを立てたいって人の役に立つ(と思う)。

セキュリティの事を殆ど考えていないので、大きなプロジェクトでは役にたたないだろうが、今回の1ヶ月レベル、ぷちコン規模の開発ならこの方法なぞって貰えばいい(と思う)。

UI

  • みつまめ杏仁

limesode.hatenablog.com

メチャクチャいろんな記事を参考にした。UE4のUI周りでここ以上にわかりやすく豊富な情報がのっているサイトはない。

エフェクト

  • moyashiエフェクト館

tktknkyo.hatenadiary.jp

moyashiさんのブログ。実は今回のゲームで一部のエフェクトをmoyashiさんに依頼して作ってもらいました。本当にありがとうございます。

UE4のエフェクトの作り方を実際のサンプルを例に教えてくれる素晴らしいサイト。

  • UE4の学び部屋 パーティクル入門(1) パーティクルの用語

manabibeya.com

UE4公式のチュートリアルの日本語化サイト。パーティクルを作りたければ一度は通してやってみるべき。基本的な事をど忘れした時に参考にした。

その他

  • Action RPG サンプル

https://www.unrealengine.com/marketplace/action-rpg

UE4.20のリリースと同時に公開された公式の無料サンプル。恐ろしいくらい良く出来ていて、中身の実装は、今回の開発でも非常に参考にしている。チュートリアルを終えて、サードパーソンテンプレートを理解できた人なら必見のサンプル。

  • 猫でも分かる UE4の新しいサンプル「Action RPG」について

猫でも分かる UE4の新しいサンプル「Action RPG」について

猫でもわかるシリーズ最新版(2018年9月現在)。Action RPGを読み解くのに一緒に見たい資料。

  • UE4 AnswerHub(日本語)

Japanese - UE4 AnswerHub

UE4公式の質問フォーラム。ネットの情報もあらかた調べ、自分でも試行錯誤したが、分からなかったって時の最終手段。今回私も一度だけ質問した。

注意したいのはこのサイトはあくまでボランティアによる運営であり、Yahoo知恵袋のようなものではない、ということ。質問は自分でやれることをやりきった後。実際する時はスクショをつけるなどして、見る人が理解できる形式で質問するようにしましょう。

まとめ

 他にも色々参考にしたサイトはあるが(alweiさんの Let's Enjoy Unreal Engine とか)、載せきれられないのでここまで。

 UE4はUnityと比べ、資料が少ない、と言われるが、実際それは事実。現状UE4とUnityではユーザー数が圧倒的に違い、個人開発で使用しているユーザーに限れば更に少ない。

 しかし、UE4は公式で超ハイクオリティなサンプル、アセット(Paragonなど)を公開してくれる。情報も最近は充実しつつあり、ある機能の解説が全く見当たらないなんてことは殆どないと思う。

 情報の少なさ故にUE4を使うか悩んでいる方は、そのあたりは心配せず、是非はじめてみてほしい。そしてわかったことがあれば是非このブログのようにバシバシ公開してほしい。Twitterハッシュタグ #UE4Study や #UE4などとつけてくれれば多くの人が監視してるので、記事を公開したらハッシュタグをつけて宣伝してほしい。