naichi's lab

3日後の自分(他人)への書き置き

【初心者向け】UnityプロジェクトにGitを導入しGitHubと連携する手順

はじめに

f:id:naichilab:20190114010820p:plain:w128

GitHubの価格が改定され、無料で非公開リポジトリが作れるようになりました。

Gitを使うとこんなことができます。

  • アセット入れたらおかしくなった! -> 戻せます。(簡単)
  • 昨日まで動いてたのに... -> 戻せます。(簡単)
  • 突然PCが壊れた!! -> 戻せます。(GitHubから別のPCに)(そこそこ簡単)
  • WinとMacで作業したい -> できます。(ちょっと難しい)
  • 複数人で共同開発したい -> できます。(ちょっと難しい)

もしフォルダをコピーしてバックアップしているのなら、Gitを覚えると全く違った体験が待っています。

一人でバックアップ代わり使う分にはそんなに難しくないので多くの人にぜひ使ってほしいと思います。

この記事ではUnityプロジェクトを作ってからGitの初期設定を行い、GitHubにアップロード(プッシュ)するところまでを画像付きで紹介します。

今日紹介する方法はあくまで一例ですが、ある程度の参考になれば幸いです。

環境

以下を想定しています。Windowsでも同じ感じでいけるはず。

  • Mac OS X
  • Unity 2018.3.0f2(Unityバージョンはなんでもいいです)
  • GitはコマンドラインではなくSourceTreeを使用
  • SourceTree 3.0.1

Git管理を始める手順

では早速やってみましょう。

ローカルにプロジェクトを作る

練習用にプロジェクトを作ります。

  • Unityで新規プロジェクトを作ります。
    • f:id:naichilab:20190113160030p:plain:w320
  • できました
    • f:id:naichilab:20190113161102p:plain:w320
  • 今日はGitの練習なのでもうUnityは閉じて大丈夫です。
  • Finder(Windowsの場合はエクスプローラ)をみてみると、下記のようなフォルダ構成ができています。
    • f:id:naichilab:20190113161320p:plain:w320

このプロジェクトをGitで管理できるようにし、GitHubへもアップロードします。

プロジェクトフォルダをローカルリポジトリにする

SourceTreeをお持ちでない場合は入れておいてください。

Gitを使うためのGUIツールは他にもForkGitKrackenとか色々ありますが、一番使われてそうな気がするSourceTreeで説明します。

  • SourceTreeを起動する

    • f:id:naichilab:20190113164104p:plain:w320
  • 新規 -> ローカルリポジトリを作成

    • f:id:naichilab:20190113162431p:plain:w320
  • プロジェクトフォルダを指定します。
    • f:id:naichilab:20190113162515p:plain:w320
    • リモートリポジトリは作成しない。でOK。
  • 一覧に追加されました。
    • f:id:naichilab:20190113162737p:plain:w320
    • 大きな数字(ここでは1870)が出てますがとりあえず無視してください。
  • 一覧からリポジトリ名をクリックすると詳細画面が開きます。
    • f:id:naichilab:20190113163047p:plain:w320
    • 以後この画面を操作します。

GitHubにリモートリポジトリを作成する

GitHubのアカウントをお持ちでない場合は作成しておいてください。

  • ブラウザでGitHubにログインし、右上の + から New repository を選びます。
    • f:id:naichilab:20190113163407p:plain:w320
  • リポジトリ名などを入力して作成します。
    • この時、 .gitignore のところで Unity を選択するようにしましょう。
    • f:id:naichilab:20190113163714p:plain:w320
  • 作成に成功すると、 https://github.com/[ユーザー名]/[プロジェクト名] のようなURLで下記ページが表示されます。
    • 作成時のオプションを選択していれば、すでに .gitignore というファイルが存在しているはずです。
    • f:id:naichilab:20190113164017p:plain:w320
  • この画面にある Clone or Download というボタンから、 https:// で始まるURLをコピーします。
    • f:id:naichilab:20190113164525p:plain:w320
    • コピーした文字列は次の手順で使います。

ローカルリポジトリとリモートリポジトリを接続する

先ほど作ったローカルリポジトリに、リモートリポジトリはここだよ。と教えてあげる設定をします。

  • SourceTreeに戻ります。
  • 右上にある設定を開き、リモートタブを選択します。
    • f:id:naichilab:20190113164330p:plain:w320
  • リモートタブの 追加 を開き、先ほどコピーしたURLを入力します。
    • リモートの名前は origin としましょう。(これは何でもいいのですが慣習的にoriginを使う場合が多いです)
    • f:id:naichilab:20190113164840p:plain:w320
  • リモートタブに追加されたことを確認します。
    • f:id:naichilab:20190113165021p:plain:w320

リモートリポジトリをダウンロード(クローン)して、 .gitignore ファイルをローカルに作る

.gitignore というファイルは、 どのファイルをgitから無視するか。 という設定ファイルです。
GitHubではリポジトリ作成時に選ぶだけで、Unity用の一般的な設定ファイルを作ってくれます。
このファイルはまだリモートリポジトリにしか存在しないので、ローカルに取り込みます。

  • 引き続きSourceTreeで操作します。
  • メニューにある プル を押します。
    • f:id:naichilab:20190113165232p:plain:w320
  • ダイアログが出てくるので、 プルするリモートのブランチで master を選択します。
    • 選択肢に出てこない場合は 更新 を押すと出てくると思います。
    • f:id:naichilab:20190113165347p:plain:w320
    • OKを押して閉じる。
  • プルしています〜 と表示されたのち、うまくいけばダイアログが閉じてリポジトリ詳細画面に戻ります。
    • f:id:naichilab:20190113165726p:plain:w320
  • ここまでうまくいっていれば、先ほど出ていた数字がかなり減っているかと思います。
    • .gitignore というファイルが作られ、管理しなくて良いフォルダ(LibraryとかTemp等)が管理対象外となったため数字が減りました)
    • f:id:naichilab:20190113165853p:plain:w320

コミットしよう

ここからやっとプロジェクトファイルをコミットしていきます。

  • 対象ファイルを選択 -> メッセージをいれて -> コミット
    • f:id:naichilab:20190113170308p:plain:w320
  • まっさらになって数字も消えました。コミット完了。
    • f:id:naichilab:20190113175505p:plain:w320
  • ちゃんと履歴としては存在しています。
    • f:id:naichilab:20190113175631p:plain:w320

プッシュしよう

  • SourceTreeで履歴画面をみると、 origin/master から上方向に master が伸びています
    • f:id:naichilab:20190113175835p:plain:w320
    • origin/master はGitHubの状態
    • master はローカルの状態
    • これは origin/master に対して、 master の方が1コミット進んだ状態を表しています。
  • この状態だと、進んだ分をGitHubにアップロード(プッシュ)することができます。
    • (もし origin/mastermaster が枝分かれしてるような形の場合はプッシュできません)
  • プッシュ を選択 -> master にチェックを入れ -> OK
    • f:id:naichilab:20190113180133p:plain:w320
  • 成功すれば origin/mastermaster が横並びになります。
    • f:id:naichilab:20190113180358p:plain:w320
  • GitHubをリロードするとファイルが入っています。
    • f:id:naichilab:20190113184259p:plain:w320

準備完了

おつかれさまでした。

これでUnityのプロジェクトファイル一式をGit管理下におき、さらにGitHubへプッシュ(アップロード)することができました。

私はこの手順を、Unityプロジェクトを作ったら毎回行なっています。

これ以降は、キリのいいタイミング(1つの機能が完成したとか、1日の終わりに、とかいつでもいいです)でコミット&プッシュをしていくだけです。

こうしておくと、何かあってもGitの機能で古い時点のファイルに戻せますし、GitHubにアップロードしてあるので突然PCが壊れてもプロジェクトは守られます。

機能追加する前にコミットする癖をつければ、何かあっても必ずそこまでは戻せるので心理的な安心感が違います。

今回はGitの使い方詳細については触れませんでしたので、書籍やネットの記事を参考にしてください。

わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉

わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉

ぜひGitを使いこなして快適なUnityライフをお過ごしください〜。

#unity1week Meetup in Tokyo2019 が開催されました!

概要

Unity1週間ゲームジャム(unity1week)

私の運営しているunityroomでは、不定期で 1週間でゲームを作って公開しよう! という趣旨のオンラインイベントを開催しています。

unityroom.com

展示交流会が開催されました

上記オンラインイベントの参加者限定で、2018年1月12日(土)にゲーム展示交流会を開催しました。

meetup.unity3d.jp

前後半90分ずつに分けて、合計28作品の展示が行われました。

私の知る限り、北は北海道、南は福岡から参加いただけたようです。

わざわざこのイベントのためだけに遠方から駆けつけてくれた方もいて大変ありがたく思います。

当日の様子

写真

まずいもの写ってたら消しますのでご連絡ください。

  • 会場
    • 新しいUnityさんのオフィスは、広くて綺麗でとても快適な空間でした。
    • f:id:naichilab:20190113114433j:plain:w320f:id:naichilab:20190113114437j:plain:w320
  • おにぎり
    • 参加者の皆さんにおいしいおにぎりが提供されました。ごはんとおともさんのケータリングサービスだそうです。
    • f:id:naichilab:20190113114427j:plain:w320f:id:naichilab:20190113114442j:plain:w320f:id:naichilab:20190113114446j:plain:w320
  • 展示風景
    • 前後半14組ずつの展示。終始賑わっており3時間があっという間でした。
    • f:id:naichilab:20190113114405j:plain:w320f:id:naichilab:20190113114411j:plain:w320f:id:naichilab:20190113114416j:plain:w320f:id:naichilab:20190113114449j:plain:w320f:id:naichilab:20190113114454j:plain:w320

ツイート

当日のツイートを一部抜粋。

すべてのツイートはこちら https://twitter.com/search?f=tweets&vertical=default&q=%23unity1week%20since%3A2019-01-11%20until%3A2019-01-15&src=typd

お礼

開催にあたって会場提供および費用のご支援をいただきました Unity Technologies Japan 様

全面的な準備と司会進行をしてくださった青木ととさん

当日参加いただいた60名ものゲーム開発者の皆さん

さらには日頃からunityroomをご利用いただいている皆さん

ありがとうございました。心よりお礼申し上げます。

感想

普段なかなかお会いできない開発者の皆さんとお話しでき、非常に楽しい時間がすごせました。

作ってる人を知るとその人が作ったゲームを遊ぶのがより楽しくなりますよね。

私も後半展示してアドバイスをもらい、がんばってゲームを作らなきゃ!とモチベーションが湧きました。

新作リリースできるまでがんばります。

f:id:naichilab:20190113114458j:plain

ありがとうございました!!また来年お会いできることを願っています!

【Unity】エディタ再生中にスクリプトを変更した場合の挙動を選ぶ

環境

  • Mac OSX Mojave
  • Unity 2018.3

やりたいこと

Unityはエディタ上で簡単に再生できてTry&Errorしやすいです。

  1. スクリプト書く
  2. エディタ再生して確認する
  3. スクリプト書き換える
  4. 自動コンパイルされる
  5. エディタ再生を止める
  6. エディタ再生して確認する

こんな感じで作業してるんですが、5、6が地味に面倒だと感じていました。

この手順を無くせる設定が増えてたのでメモしときます。

解決方法

Preference -> General -> Script Changes While Playing

f:id:naichilab:20181229001053p:plain

Recompile And Continue Playing

デフォルトです。

スクリプトの変更を検知してUnityエディタが勝手にリコンパイルしてくれますが、再生は止まりません。

そのままエディタ実行を続けると色々エラーしますよね??私はかならず操作やめるんですがもしかしてプレイし続けられたりする・・・?

Recompile After Finished Playing

再生を止めるまでリコンパイルしません。スペックの低いPCだと結構嬉しいかも。ちょっと変更してエディタアクティブにするだけでがっつりPCリソース持っていかれるので・・・。

これは再生中のゲームみながらスクリプト調整する場合なんかに便利ですね。

Stop Playing And Recompile

変更を検知したら自動で再生を止めてくれます。変更したらすぐに再確認したい場合はこれが便利そう。

まとめ

この項目、前はなかったですよね?

Stop Playing And Recompile でしばらく使ってみようかな。

Stop Playing And Recompile And Re-Play があれば最高だった!

【Unity】RiderでUniTask使うとエラー「The return type of an async method must be void, Task or Task<T>」が出る

環境

  • MacOSX Mojave 10.14.2
  • Unity 2018.3.0f2
  • Rider 2018.3

概要

タイトルの通り、RiderでUniTaskを使ってこんな感じのコードを書くと、

async UniTask Hoge()
{
    //コード
}

こういうエラーが出る。

The return type of an async method must be void, Task or Task<T>  

f:id:naichilab:20181227212815p:plain

asyncメソッドは voidTaskTask<T> を返せやコラーってことらしい。

ちなみにUnityエディタ側のコンソールにはエラー出ていないし実行も可能。

解決方法

  1. Unity -> Preference -> Rider -> Override LangVersionにチェックを入れる。
  2. LangVersionを7.3にする。 f:id:naichilab:20181227213512p:plain
  3. Unityを再起動

これでエラー全部消えました。

さすがとりすーぷ先生。

ギルドでポロっと呟いたら即答もらえた。ありがたや〜。

2019.08.26 再発

Unity 2019.2.1f1 と Rider 2019.2.1 を使ってて、突然再発しました。

色々ググった結果、

Rider -> Preferences -> Build, Execution, Deployment -> Toolset and Build

にある Mono executable pathUse MSBuild version が古いUnityのままだったのでこれを選びなおしたらエラーは消えました。

f:id:naichilab:20190826034058p:plain:w320

【unity】Unity5.5から2018.2にあげたらTextMeshProがめっちゃエラーした

すでにいろんな人が散々書いてますが自分も遭遇したのでメモ

何が起きた

  • 5.5.1f1で作ってたプロジェクトを久々に開いた
  • 2018.2.5f1に更新された。
  • いっぱいエラー出た(46個)

f:id:naichilab:20181015234850p:plain:w320

エラー例

Multiple plugins with the same name 'tmpro_plugin' (found at 'Packages/com.unity.textmeshpro/Plugins/64 Bit Plugins/TMPro_Plugin.bundle' and 'Assets/TextMesh Pro/Plugins/64 Bit Plugins/TMPro_Plugin.bundle'). That means one or more plugins are set to be compatible with Editor. Only one plugin at the time can be used by Editor.
Assets/TextMesh Pro/Scripts/TextMeshProUGUI.cs(72,21): error CS0103: The name `m_canvasRenderer' does not exist in the current context
Assets/TextMesh Pro/Scripts/TMP_Text.cs(276,35): error CS0121: The call is ambiguous between the following methods or properties: `TMPro.TMPro_ExtensionMethods.Compare(this UnityEngine.Color32, UnityEngine.Color32)' and `TMPro.TMPro_ExtensionMethods.Compare(this UnityEngine.Color32, UnityEngine.Color32)'

原因

f:id:naichilab:20181015235159p:plain:w320

  • TextMeshProが2箇所に入ってる
    • Assets/TextMesh Pro 5.5のときにアセットを導入してインストールされたフォルダ
    • Packages/TextMesh Pro 2018でPackageManager経由でインストールされたフォルダ

=> Assets以下のTextMeshProを消せばどうにかなりそうです。

対処

1. Assets 以下のTextMeshProフォルダを消す

丸ごと消す。

エラーが4つに減りましたが下記が残ってました。

Multiple plugins with the same name 'tmpro_plugin' (found at 'Packages/com.unity.textmeshpro/Plugins/64 Bit Plugins/TMPro_Plugin.bundle' and 'Assets/TextMesh Pro/Plugins/64 Bit Plugins/TMPro_Plugin.bundle'). That means one or more plugins are set to be compatible with Editor. Only one plugin at the time can be used by Editor.

Unityエディタを開き直したらエラーは消えました。

2. TextMeshPro必須リソースを取り込む

メニュー -> Window -> TextMeshPro -> Import TMP Essential Resources

f:id:naichilab:20181015235841p:plain:w320

これで新しいTextMeshProで最低限必要なシェーダーやフォントアセット等が作られます。

f:id:naichilab:20181015235934p:plain:w320

インポート先は Assets/TextMesh Pro で、消したフォルダと同じ場所ですがこれはこのままで大丈夫。

3. 新旧スクリプトの置き換え

メニュー -> Window -> TextMeshPro -> Project Files GUID Remapping Tool

f:id:naichilab:20181016000121p:plain:w320

Scan -> Save

f:id:naichilab:20181016000226p:plain:w320

まとめ

ひさびさにプロジェクト開くと怖いですね。

TextMeshProは市販アセットからUnity公式アセットになってインストール方法も大きく変わりました。

ちょっと怖かったですが無事移行完了してホッとしました。

Gyazoのアクセストークンを取得する方法

f:id:naichilab:20180917025811p:plain

概要

gyazo.com

  • Gyazoという便利な画像アップローダサービスがある。
  • プログラムからアップロードするためのアクセストークンを取得する方法をまとめておきます。

書いた日

  • 2018/09/17

Gyazoにユーザー新規登録

すでに登録済みの人はアプリケーションの登録まで飛ばしてください。

  • TOP画面へアクセス Gyazoへようこそ : スクリーンショットの瞬間共有
    • メアドとかで登録〜って感じではないみたい
  • ダウンロード
    • f:id:naichilab:20180917030434p:plain:w320
  • インストールしたGyazoアプリを起動
    • するといきなり範囲指定カーソルになるので適当に指定。
    • f:id:naichilab:20180915131431p:plain:w320
    • すんなりと画像アップロード成功
  • 表示されたページ内に登録フォームがあるので入力
    • f:id:naichilab:20180915131533p:plain:w320
  • 届いたメールに記載のリンクをクリックして登録完了〜。

アプリケーション登録

  • ログイン後、こちらのページへアクセス Gyazo
  • アプリケーションを登録 をクリック
    • f:id:naichilab:20180915131744p:plain:w320
  • さらに New Application
    • f:id:naichilab:20180915131917p:plain:w320
  • アプリケーション名を入れて Submit
    • callback urlは適当でいいみたい
    • f:id:naichilab:20180915132140p:plain:w320
  • 作成したアプリを選択
    • f:id:naichilab:20180915132219p:plain:w320
  • access tokengenerate
    • f:id:naichilab:20180915134130p:plain:w320
  • できた
    • f:id:naichilab:20180915134149p:plain
    • これをメモしておきます。

【Unity】Isometric 2.5D Toolsetを使ってクォータービュー(Isometric Tilemap)のゲームを作ろう

はじめに

こんにちは、 @naichilab です。

この記事は Unity アセット真夏のアドベントカレンダー 2018 Summer! 22日目の記事です。

昨日は @xiumidaさんの 【アドカレ 2018】Closing Creditsでスタッフロールを作るでした。アセットの更新止まっちゃってるのが残念ですがとても便利そうです!

さて、本記事では Isometric 2.5D Toolset というクォータービューのタイルマップを扱えるアセットを紹介したいと思います。

目次

環境

  • Unity 2018.2.3f1
  • Isometric 2.5D Toolset 3.0.3 (2018/08/15リリース)

クォータービューって?

f:id:naichilab:20180818150205p:plain:w320

Googleで画像検索するとこんな感じ。

クォータービューは和製英語らしいので Isometric Tile とかで調べた方が情報は多いかもしれません

Isometric 2.5D Toolset について

今回紹介する Isometric 2.5D Toolset はアイソメトリックタイルを使ったゲームを作りやすくしてくれるアセットです。

エディター上でのタイル配置、前後関係のソート、物理演算、3Dモデルとの併用など、いろんな機能を提供してくれます。

クォータービューの箱庭ゲームを作ろうと思って色々アセットを購入して比較しましたが、このアセットが一番求めているものに近かったので使っています。

とりあえず使ってみる

このアセットがどんな感じか知ってもらうために利用開始までの手順をまとめておきます。

Isometric 2.5D Toolset をダウンロード&インポート

  1. アセットストアで購入してダウンロード
  2. Unityにインポートします。
    • f:id:naichilab:20180818181825p:plain:w320

IsoWorld を設置

Isometric 2.5D Toolset では、 IsoWorld というスクリプトをつけたオブジェクトが必須です。 まずはそれを作ります。

  1. Hierarchy -> Create -> Create Empty
  2. 名前は IsoWorld とします。
  3. Position も 0,0,0 にしておきましょう。(別にずれててもいいですけど)
    • f:id:naichilab:20180818184954p:plain:w320
  4. さらに AddComponent -> IsoWorld を追加します。
    • f:id:naichilab:20180818185041p:plain:w320
  5. こんな感じ
    • f:id:naichilab:20180818185456p:plain:w320

同一シーンに IsoWorld を複数設置することもできます。

IsoObject を設置

IsoWorld を設置したら、その子供に IsoObject を作っていきます。

  1. IsoWorld を選択して再度 Create Empty します。
  2. 名前は IsoObject にします。( Floor とか、 Table とか分かりやすい名前をつけてもいいです)
  3. Add Componentから IsoObject コンポーネントを付与。
  4. こんな感じになります。
    • f:id:naichilab:20180818185906p:plain:w320
  5. このままでは分かりづらいので下記チェックを入れましょう
    • Editor Only -> Show Iso Bounds
    • Editor Only -> Show Screen Bounds
    • f:id:naichilab:20180818191559p:plain:w320
  6. すると Scene ビューに六角形が表示されます。
    • f:id:naichilab:20180818191725p:plain:w320

タイルサイズを決める

IsoWorldWorld Settings で各タイルのサイズを決めます。

f:id:naichilab:20180818213252p:plain:w320

今回は分かりやすく 1dot = 1m になるように設定してみます。

例えば下記のような 32px x 16px の画像を使う場合、

f:id:naichilab:20180818225452p:plain

Tile SizeTile Height16 にして、下記のようにします。

項目
Tile Size 16
Tile Ratio 0.5
Tile Angle 45
Tile Height 16

試しにサイズが 32 x 16 のCubeと重ねて見るとこんな感じ。

f:id:naichilab:20180818214409p:plain:w320

ちゃんとCubeとひし形が重なりました。

等角以外のタイルについて

Tile RatioTile Angle を変えると等角投影以外のタイルにも対応できます。

Tile Ratio を変更した場合、見下ろす角度が変わります。

f:id:naichilab:20180818215204g:plain:w320

Tile Angle を変更した場合、左右の角度が均一ではなくなります。

f:id:naichilab:20180818215550g:plain:w320

Isometric = 等角ではないタイルはなんて呼ぶんでしょうね?

今回の記事では等角のまま(TileRatio=0.5、 TileAngle=45)で進めます。

タイル画像を用意

タイルサイズを決めたら画像を用意します。

  • この記事では今作ってるゲームの画像を使います。
    • f:id:naichilab:20180819002100p:plain:w320

インポートした Isometric 2.5D Toolset にもサンプル画像が含まれてるので特に用意しなくても試せます。

ドット絵タイル画像の自作について

自分は絵がかけないのでデザイナさん頑張ってとしか言えないのですが、
32px x 16px を基準にする場合、32px x 15px を積み重ねるように描くと綺麗に敷き詰められるようです。

32x15 でひし形を用意

f:id:naichilab:20180818184103p:plain:w320

厚み1pxで緑を重ねるとこんな感じ

f:id:naichilab:20180818184236p:plain:w320

ぴったり並びました。

Isometric 2.5D Toolset では、IsoObject の高さを0にすると同じ高さ同士でのソート順がおかしくなることがあります。 なので上記のような薄っぺらいオブジェクトも、1px分の厚みがあるものとして設定していきます。

テクスチャのインポート設定

  1. 用意した画像をUnityに放り込みます。
    • f:id:naichilab:20180818225929p:plain:w320
  2. テクスチャ設定を変更します。
    • TextureType = Sprite(2D and UI)
    • Pixels Per Unit = 1 (画像サイズとタイルサイズの兼ね合いで調整してください)
    • Pivot = Bottom
    • Generate Physics Shape = false (不要)
    • Filter Mode = Point (no filter) (ドット絵なのでOFF)
    • f:id:naichilab:20180818223800p:plain
  3. 変更したら Apply

IsoObject にSpriteをつける

やっとタイル設定と画像の取り込みが終わったのでシーンに配置していきます。

  1. IsoObject の子として 2D Object -> Sprite を追加します。
    • f:id:naichilab:20180818223506p:plain:w320
  2. Sprite のインスペクタから画像を選択します。
    • f:id:naichilab:20180818230134p:plain:w320
    • ひし形に合うように表示されました。
    • 位置があってない場合はSpriteを移動させてしまえば大丈夫です。
  3. IsoObject を選択し、Sizeを変更する
    • この画像は高さ1pxなので、1/16 を入力します。( IsoWorld の設定で Tile Height を16にしたので1dot = 1/16)
    • f:id:naichilab:20180818230341p:plain:w320
    • 赤線がぴったり合いました。
  4. IsoObject の名前を分かりやすく変更し、Prefabにでもしておきましょう。
    • f:id:naichilab:20180818230633p:plain:w320

タイルを並べる

  1. 作ったPrefabをHierarychyビューにドラッグするか、直接 IsoObjectCtrl+Dcmd+D で複製します。
    • f:id:naichilab:20180818230847p:plain:w320
  2. それぞれの IsoObject を自由に移動します。
    • f:id:naichilab:20180818231040p:plain:w320
    • 綺麗に並びました。
IsoObject のドラッグ移動が楽々

IsoObject を選択した場合のGizmoはこんな感じです。

f:id:naichilab:20180818231414p:plain:w320

XYの線(赤と緑)が斜め上方向に伸びています。
IsoObject のXYZ座標はWorldのXYZ座標と一致していないので、専用のハンドルが用意されています。

そしてこのハンドルはスナップが効くようになっているので整列させるのが非常に楽です。

f:id:naichilab:20180818232021g:plain:w320

他の形も並べてみる

同様に幅や高さの違う IsoObject を作ってみました。

f:id:naichilab:20180818232628p:plain:w320

  • 茂み(IsoSize = 1x1x1
  • 木(IsoSize = 1x1x5
  • テーブル(IsoSize = 1x2x1

適当に移動してもいい感じに整列してくれます。

f:id:naichilab:20180818232808p:plain:w320

Sceneビューを3D表示にすると常にソートされていることがよく分かります。

f:id:naichilab:20180818234737g:plain:w320

その他の小ネタ

物理演算したい

IsoRigidbody コンポーネントを使えば可能です。

  • 茂みに IsoRigidbodyIsoBoxCollider をつけました。
    • f:id:naichilab:20180818235821p:plain:w320
  • 床に IsoBoxCollider をつけました。
    • f:id:naichilab:20180818235848p:plain:w320

これだけでちゃんと重力を扱ってくれます。便利。

f:id:naichilab:20180819000256g:plain:w320

クリックされた場所のIsoWorld座標を取得したい

IsoWorldMouseIsoPosition が使えます。

using UnityEngine;
using IsoTools;

public class Sample : MonoBehaviour
{
    void Update()
    {
        var iso_world = IsoWorld.GetWorld(0);
        if (iso_world && Input.GetMouseButtonDown(0))
        {
            var iso_mouse_pos = iso_world.MouseIsoPosition(0);
            Debug.Log("クリックしたIso座標は[" + iso_mouse_pos + "]です。");
        }
    }
}

たったこれだけ。

クリックされたIsoObjectを取得したい

IsoPhysicsRaycast を使います。(IsoObjectにIsoColliderをつけておく必要があります)

using UnityEngine;
using IsoTools;
using IsoTools.Physics;

public class Sample : MonoBehaviour
{
    static IsoRaycastHit[] _raycastBuffer = new IsoRaycastHit[16];

    void Update()
    {
        //クリック座標の下にあるIsoObjectsを取得
        var iso_world = IsoWorld.GetWorld(0);
        if (iso_world && Input.GetMouseButtonDown(0))
        {
            var iso_mouse_pos = iso_world.MouseIsoPosition(0);
            var ray_from_iso_camera = iso_world.RayFromIsoCameraToIsoPoint(iso_mouse_pos);
            var hit_count = IsoPhysics.RaycastNonAlloc(ray_from_iso_camera, _raycastBuffer);
            for (var i = 0; i < hit_count; ++i)
            {
                IsoRaycastHit hit = _raycastBuffer[i];
                Debug.Log(hit.collider.gameObject.name + "をクリックしました。");
            }
        }
    }
}

困ったら?

とりあえず公式フォーラムを読み漁りましょう!

https://forum.unity.com/threads/v3-0-1-isometric-2-5d-toolset.291418/

作者のblackmatさん、結構マメに返信してて好感が持てます。

最近もアセットの更新は続いてるようなので、フォーラムの返信も期待できます。

他のアセットとの比較

さて、Isometric 2.5D Toolset の基本的な機能は伝わったでしょうか?

アセットストアにはいくつかアイソメトリックタイル用のアセットがあるので簡単に比較してみます。

Ultimate Isometric Toolkit

すぐに見つかるのはこちらの Ultimate Isometric Toolkit かと思います。無料のLite版もあります。

こちらも専用のGizmoが用意されていますが、スナップ機能はないようです。

f:id:naichilab:20180819004239p:plain:w320

また、こちらのチュートリアル にあるように、タイルサイズより大きなSpriteは分割して扱う前提のようです。

物理演算やキャラクターコントローラ、パスファインディング等の機能もあるようですね。

Isometric Builder

こちらのアセット存在は知りませんでした。(この記事書いてて見つけました)

Youtubeのチュートリアル見る感じ、使いこなせればかなり強力そうです。

2Dタイルマップのオートタイル機能のようにドラッグでどんどんマップを作れるようなので、RPGとかどんどんマップ作っていく系のゲームには向いてそうですね。

ただちょっとフレームワークとして大掛かりすぎる気もします・・・。

Unity標準機能

Unity標準でもタイルマップ機能は提供されています。

Unity 2017.2から2Dタイルマップ、さらにUnity 2018.2から六角形の2Dタイルマップがサポートされました。

ただ、残念ながらアイソメトリックタイルは非対応です。

2D Experimental Preview には入ってるらしい?(ちょっと確認できなかった)
のでいずれ標準機能でサポートされるかもしれません。

自作する

Introduction to Isometric Movement in Games - YouTube

Isometric座標の計算自体はそれほど難しいものではなさそうなので、実装してみるのもいいかもしれません。

自分も最初は実装しようかと思ったのですが、タイルサイズを考慮してのソートが必要になると一気にややこしくなって諦めましたw

所感

いくつか見てきましたが、テーブルのようなXY長さがタイルサイズより大きいものをソートできるのは Isometric 2.5D Toolset だけでした。

固定サイズのブロックを並べていくような用途の場合、 Ultimate Isometric ToolkitIsometric Builder の方が優れている点も多そうです。

宣伝

今日紹介した Isometric 2.5D Toolset を使って新作作ってます。

森を開拓して建物を並べて〜といった森開拓シミュレーションになる予定です。

こちらのアカウントで情報出していくのでぜひフォローお願いします。

twitter.com

来年春ぐらいに出したい・・・な

まとめ

クォータービューのゲームはワクワクするのでみんな作りましょう!遊びたい!

と言うわけでUnity アセット真夏のアドベントカレンダー 2018 Summer!、22日目の記事でした。

明日は ラズさんです。お楽しみに〜。