altebute.hatenablog.com

犬も歩けば規格にあたる

ドラゴンクエストビルダーズの感想

Switch版のドラゴンクエストビルダーズをプレイした。ストーリーは一通りプレイしたが、フリービルドまでやる気は起きなかった。

単なるマインクラフトフォロワーではなく、しっかりとドラクエ、それもロトシリーズの系譜に連なる作品として良くできていた。

既に各所でも語られている事だが、ストーリーの章が進むとそれまでに築いた資産が失われる点や、ボス戦の面白くなさは大きな欠点で、個人的には閉所での操作のし辛さも気になった。

一方でNPCとの会話の軽妙かつ誰もが個性的で素晴らしかった。竜王の動機付けがやや強引だったり、全体的に話の内容がDQ7的で暗いのは気になったが、最終章の雰囲気はDQ3で初めてアレフガルドに降りたった時を思い出させる物で、心揺さぶるものがあった。ルビスがそれまでのシリーズと比べて過干渉気味で、かつ不信感を募らせる演出は興味深かった。

2にも期待している。

Acer Chromebook Tab 10が欲しい

これまで度々タブレットが欲しいと度々思いつつも結局買うまでには至らなかったが、Acer Chromebook Tab 10はかなり欲しい。

Windowsタブレットはフル機能のWindowsが使えることは魅力的だがタブレットとしては使いづらい。iPadは悪くないが不自由さが目につく。Androidタブレットは決定打に欠ける。

ChromebookならばPC版と同等のUIのGoogle Chromeが動くし、SoCが対応していれば開発者モードを有効化しchromebrewを導入する事でgit等の主要なパッケージはインストール出来る。

私的にはアスペクト比は3:2が良かったが、最近はラップトップなら3:2が良いがラップトップなら4:3でも良いかなと思い始めた。

問題は国内でのChromebook Tab 10が困難な事だが。

日記 2018-03

  • 外耳炎で病院のお世話になった。通院不要になるまで大分かかった。
  • 薄い財布を買った。良い。
  • 気合いを入れて風呂の排水溝を掃除した。吐き気を催す邪悪な臭いだった。
  • バンナイズのデジアナ格納庫-9のレッグバッグが欲しい。
  • この日記を書くためにBlackBerry KEYoneが欲しいと思ったが、コストに見合わない上に巨大で重いので止めた。
  • MSYS2上でgccから比較的新しめのC++を利用出来る環境を構築した。std::is_aggregate_vが動いて僕満足。
    • 上記に伴いGit for Windowsを削除して、MSYS2上で諸々の環境を構築した方が良い気がしてきた。
      • しばらく運用して、あくまでMSYS2はWindows上で動作するLinuxライクな環境として運用すべきだという結論に達した。パッケージマネージャーが使いたければChocolatey使おう。
  • Unityを再開した。

Git 環境構築メモ on Windows

CUIGUIは分けて考える. 導入するツールは以下の通り.

ライセンスに気をつける. 特にGUIアプリケーション. GUIアプリケーションは好きなもの1つでよいだろう.


各アプリケーションの更新はRSSを購読して確認する.

GUIアプリケーションは更新通知機能がついてたり, ついていなかったりするかも知れない. 最近Sourcetreeが不自然な挙動見せるけど実利用で問題ないので見て見ぬふりをする.


基本的に公式に書いてある手順に従って導入する.

GitのインストーラはオプションでGit LFSも同時にインストールする事が出来るが, 必ずしも最新版とは限らないため使わない方が良い. git-lfs/README.mdに従ってインストールしよう.

git-flowはWindowsだとちょっと難しい感じがしないでもない.


シェルはGit Bashが基本だが, 余力があればfish shell等を導入しても良いかも知れない. ここらへんUnix, Linux環境向けの話ばかりで初心者はトラブルが起きた時自分で対応出来ない気がする.

シェルを思い通りにしようと思うと, コマンドプロンプト, Windows PowerShell, Git Bash, Cygwin, MSYS2等の各のシェルについてどのようにパスを通し, どのように環境変数が参照されるのかを把握する必要があるため, 学習コストが高い.

基本的に長いものにはまかれろの精神で, メジャーでカスタマイズする項目が少なくて済むツールを導入する. 多くの人が使用している環境の方が情報も豊富.


まずgit init --bare --sharedでベアリポジトリを作成. ディレクトリを作成する訳ではなく, カレントリディレクトリ自身をリポジトリに作成するので注意. ベアリポジトリの名前はxxx.gitとするのが通例.

次にgit clone <repository> [<directory>]でベアリポジトリをクローン, ノンベアリポジトリを作成する. クローン先のディレクトリが空でなかった場合, クローンに失敗する. 指定しなかった場合, リポジトリ名と同じ名前のディレクトリを作成し, そこにクローンする. 作成しようとしたディレクトリ名のディレクトリが既に存在した場合, クローンに失敗する.

Git LFSの設定はワークツリー内で行う. 例えばgit lfs track "*.png"等とすればpngファイルのコミット時にGit LFSが使用される. 設定は.gitattributesファイルに保存される. 恐らく, Gitの操作をする際にこのファイルを読み, それに従ってコミットを行う, という仕組みなのだろう. 当然Git LFSの設定は共有すべきなので.gitattributesファイルはコミットしておく.

最後にgit-flowの初期化処理を行う. git flow initで初期化したらそれで終わりである. 対話形式で初期設定を行うが, 基本的にデフォルトの設定で構わない. 尚, この行程はGUIアプリケーションでもたぶん問題ない.


その他, SSHの設定等が必要かもしれないが, サーバーをきちんと用意したりしないのであればたぶんデフォルトで問題ない.

尚, Git LFSは自身が管理するファイルについて, 複数のユーザによる同時アップロードが発生した際の競合を防ぐためのファイルロックの仕組みを備えるが, 殆どサーバは実装していないため, 以下のような警告が発生するかも知れない. その場合警告に従ってこの設定を無効化する必要があるかも知れない. 詳細はこちら

Remote "origin" does not support the LFS locking API. Consider disabling it with
:
  $ git config lfs.C:/Users/agate_pris/test.git/info/lfs.locksverify false

以上.

Unity プロジェクト作成

手順

  1. Dropbox 上にディレクトproject-name を作成.
  2. そのディレクトリに移動.
  3. 以下のコマンドを実行.
    git init --bare --shared=true project-name.git
  4. 同期の完了を待つ.
  5. 作業用ディレクトリにプル. ディレクトリ名は project-name/dev.git にした.
  6. dev.git に移動 Unity のプロジェクト project-name.unity を作成.
  7. Assets/ProjectName/Games/Game.cs を作成, Visual Studio で開ける事を確認, シーン Game に空のオブジェクト Game を作成し, コンポーネント Game を追加. 実行確認.
  8. .gitignore を作成. 内容は後述.
  9. コミット, プッシュ.

.gitignore

/project-name.unity/[Aa]ssets/AssetStoreTools*
/project-name.unity/[Bb]uild/
/project-name.unity/[Bb]uilds/
/project-name.unity/[Ll]ibrary/
/project-name.unity/[Oo]bj/
/project-name.unity/[Tt]emp/

# Autogenerated VS/MD solution and project files
ExportedObj/
*.booproj
*.csproj
*.pidb
*.sln
*.suo
*.svd
*.tmp
*.unityproj
*.user
*.userprefs

# Unity3D generated meta files
*.pidb.meta

# Unity3D Generated File On Crash Reports
sysinfo.txt

# Builds
*.apk
*.unitypackage

ディレクトリ構成

リモート

  • project-name
    • project-name.git

ローカル

  • project-name
    • dev.git
      • .gitignore
      • project-name.unity

dev.git については, ブランチを切る時はまた別のディレクトリを作成してそこで作業をする.

参考文献

Unityを三日坊主して分かった事

最初から目標を大きくするな

それ一番言われてるから.

使用する機能を最初から隅から隅まで理解しようとするな

機能が必要になったら調べればいい. そもそも全体を把握しないと何のためにあるのか分からない事もある.

郷に入らば郷に従え

エンジンの設計に逆らうのはエンジンをある程度理解してからでも遅くない.

案ずるより生むが易し

簡単な小さい目標を立てて, 何でもいいからまず動かす.

とりあえず

週末なんかしたいな.

Unity 5 日記 6 ショットを発射

もう適当にさっさと書かないと飽きるので雑に書いていく. さっさとショット発射してみたい. 敵にあたるとかそんなんどうでもいい.

Unity 5 日記 2 スクリプトの作成Unity 5 日記 3 deltaTime の適用 で作成したオブジェクトにショットの発射機能を持たせる.

作成してあった移動処理をメソッド Move に分離し, メソッド Update を以下のように書き換える.

private void Update()
{
    Move();
}

変数 float shootFreezeSystem.Collections.Generic.List<GameObject> shots を追加する.

private QuantizedTime shootFreeze;
private System.Collections.Generic.List<GameObject> shots;

ついでにメソッド Start に各々の初期化処理を追加しておく.

void Start()
{
    ...
    shootFreeze = 0;
    shots = new System.Collections.Generic.List<GameObject>();
}

はっきり言ってこの書き方は良くない. クソコードである. 関心の分離もへったくれもない. 本当なら別途ショットを管理するためのクラスを用意すべきだが, ここではとりあえず後回しにする.

Unity 5 日記 5 Prefab で書いたような感じで Prefab を作成し, Resouces フォルダに Shot という名前で適当にいれる.

そしてショットにスクリプトを追加する.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ShotBehaviorScript : MonoBehaviour
{
    // Use this for initialization
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
        var x = transform.position.x;
        var y = transform.position.y;
        var z = transform.position.z;
        z += Time.deltaTime * 100;
        transform.position = new Vector3(x, y, z);
    }

    public bool IsOut()
    {
        return 32 < transform.position.z;
    }
}

メソッド Update で移動を行う. IsOut は消去判定を行うためのメソッドだ. Unity では画面外に出たことを判定するための関数があるが, ショットは画面外に出た時に消えてしまうのは困るので自分で色々判定する. ここでは本当に適当な値の比較にした.

そして自機側のスクリプトにメソッド Shoot を追加する. この名前もかなり悪い.

private void Shoot()
{
    if (0 < shootFreeze.Value)
    {
        var deltaTime = Time.deltaTime;
        shootFreeze -= deltaTime.Value;
        return;
    }

    var fire = UnityEngine.Input.GetButton("Fire1");
    if (fire)
    {
        GameObject shotPrefab = (GameObject)Resources.Load("Shot");
        var shot = Instantiate(shotPrefab, new Vector3(0,(float)_position.Y, (float)_position.X), Quaternion.identity);
        shots.Add(shot);
        shootFreeze.Value = 128;
    }
}

手元のスクリプトとブログに書いてあるスクリプトが一致していないので座標周りがおかしかったり変数名があっていなかったりするが心の目で読んで欲しい. Resouces ディレクトリに入れた Prefab は上記のような感じでインスタンス化することが出来る. 生成したショットは shots に追加する.

最後に画面外に出たショットを削除するためのメソッド RemoveShots を追加する.

void RemoveShots()
{
    for (int i = 0; i < shots.Count;)
    {
        var shot = shots[i];
        var script = shot.GetComponent<ShotBehaviorScript>();
        if (script.IsOut())
        {
            Destroy(shot);
            shots.Remove(shot);
            continue;
        }
        ++i;
    }
}

GetComponent でアタッチしたコンポーネントを取得し, メソッド IsOut で判定を行い, Destroy 関数で GameObject を削除する.

ShotBehaviorScript の中で Destroy(this) するとオブジェクト全体ではなくコンポーネント単体を削除してしまうらしい.

なんかもう記事書くのも面倒になってきた. この雑さ極まるコードを GitHub に丸上げして, コミットログにリンク張って日記にする程度でいいんじゃなかろうか.