Raspberlyのブログ

Raspberlyのブログ

Unityネタをメインとした技術系ブログです。にゃんこ大戦争や日常なども。そろそろブログタイトル決めたい

【メタ演出】Windowsのメッセージボックスを出す【Unity】

今回はUnityネタをやっていきます。
ゲームでたまに見るメタ演出を再現する試みで、WindowsのメッセージボックスをUnityから出してみます。

 

メタ演出をやろうと思ったきっかけ

現在Steamで開催中のサマーセールで面白いゲームを見つけました。その名も「OneShot

こちらは斬新な演出が特徴のゲームでメタ演出が盛り込まれています。
プレイ中も「これUnityでできるのかなぁ」といろいろ考えていました。
そこで今回は、ゲーム内の序盤から使われているメッセージボックスをUnityで出してみます

 

※この記事にOneShotのネタバレは含んでいません。

 

 

 

メタ演出とは

いわゆるメタフィクションのことを指します。
簡単に表すとゲーム内で「これはゲームである」ことを表現することです。
ゲームキャラクターが、自分がNPCであることを自覚していたり、第四の壁を越えようとしてくるなど。

おもしろい演出ができる一方、うざがられたりするので全てのゲームで使える演出ではありません

今回扱うメッセージボックスは、
ゲームの主人公ではなく画面の前にいるプレイヤーに直接メッセージを伝えるために使われますね。

 

 

開発環境

Unity 2019.4.0f1
Windows10

 

 

下準備

調べてみたところ、System.Windows.Forms.dllを使うと簡単にメッセージボックスを出せるそうです。
さっそくやってみます。

DLLを探す

C:Windows/Microsoft.NET/Framework64/vX.X/System.Windows.Forms.dll」を探します。

f:id:Raspberly:20200703003324p:plain

PCによって違うと思いますが私はこちらを。

f:id:Raspberly:20200703015855p:plain

 

DLLをPluginsフォルダに格納する

Assets/Pluginsフォルダを作り、そこにSystem.WIndows.Forms.dllを格納します。

f:id:Raspberly:20200703022717p:plain

 

usingに記述

Scriptに「using System.Windows.Forms;」を記述します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Windows.Forms;

public class MsgBox : MonoBehaviour
{
------

 これで使う準備は完了です。

 

 

 

 

メッセージボックスを出す

ここからが本題です。下準備はできたのでメッセージボックスを出していきます。
下記のOpen関数をStart()やOnClick()で呼んであげましょう

最もシンプルなメッセージボックス

テキスト本文が表示され、OKボタンがあるだけの簡単なものです。
OKボタンを押すとそのまま終わります。

    public void Open()
    {
        MessageBox.Show
        (
            "メッセージ"
        );
    }

f:id:Raspberly:20200703224317p:plain

 

 

 

 

キャプション付きメッセージボックス

キャプション(タイトル)がついたメッセージボックスを作ります。
やることは変わらず、MessageBox.Showに第二引数を足すだけです。

    public void Open()
    {
        MessageBox.Show
        (
            "メッセージ",
            "タイトル"
        );
    }

 

f:id:Raspberly:20200703222702p:plain

 

 

 

表示するボタンを変える

表示するボタンを変えてみます。
第三引数にMessageBoxButtonsを追加します。

    public void Open()
    {
        MessageBox.Show
        (
            "メッセージ",
            "タイトル",
            MessageBoxButtons.OK
        );

デフォルトは「OK」です。

f:id:Raspberly:20200703222702p:plain

このMessageBoxButtonsは全部で6種類あります。
自由に組み替えられるものではなく、形式が決まっています。

f:id:Raspberly:20200703225809p:plain

MessageBoxButtons.OKCancel

f:id:Raspberly:20200703230332p:plain

MessageBoxButtons.AbortRetryIgnore

f:id:Raspberly:20200703225947p:plain

MessageBoxButtons.YesNoCancel

f:id:Raspberly:20200703230443p:plain

MessageBoxButtons.YesNo

f:id:Raspberly:20200703230518p:plain

MessageBoxButtons.RetryCancel

f:id:Raspberly:20200703230548p:plain

 

 

 

アイコンを表示する

アイコンを表示してみます。

第四引数にMessageBoxIconを追加します。

    public void Open()
    {
        MessageBox.Show
        (
            "メッセージ",
            "タイトル",
            MessageBoxButtons.OK,
            MessageBoxIcon.None
        );
    }

 デフォルトは「None」です。

f:id:Raspberly:20200703222702p:plain

MessageBoxIconは全9種類ある・・・かと思いきや実は5種類です。

f:id:Raspberly:20200703231200p:plain

MessageBoxIconの定義を見てみるとこんな感じ。
実は同じアイコンが使いまわされています。

namespace System.Windows.Forms
{
    public enum MessageBoxIcon
    {
        None = 0,
        Hand = 16,
        Stop = 16,
        Error = 16,
        Question = 32,
        Exclamation = 48,
        Warning = 48,
        Asterisk = 64,
        Information = 64
    }
}

 

MessageBoxIcon.Hand .Stop .Error

f:id:Raspberly:20200703231341p:plain

MessageBoxIcon.Question

f:id:Raspberly:20200703232326p:plain

MessageBoxIcon.Exclamation .Warning

f:id:Raspberly:20200703232349p:plain

MessageBoxIcon.Asterisk .Infomation

f:id:Raspberly:20200703232140p:plain

 

 

 

 

 

押されたボタンに応じて処理をする

押された結果は、 MessageBox.ShowからDialogResultとして取得できます。
ここではresultに値を格納しています。

    public void Open()
    {
        var result = MessageBox.Show
         (
             "メッセージ",
             "タイトル",
             MessageBoxButtons.AbortRetryIgnore,
             MessageBoxIcon.None
         );

         switch(result){
            case DialogResult.None:
                Debug.Log("基本呼ばれないと思う これいる?");
                break;
            case DialogResult.OK:
                Debug.Log("OKボタンが押された");
                break;
            case DialogResult.Cancel:
                Debug.Log("Cancelボタンが押された");
                break;
            case DialogResult.Abort:
                Debug.Log("Abortボタンが押された");
                break;
            case DialogResult.Retry:
                Debug.Log("Retryボタンが押された");
                break;
            case DialogResult.Ignore:
                Debug.Log("Ignoreボタンが押された");
                break;
            case DialogResult.Yes:
                Debug.Log("Yesボタンが押された");
                break;
            case DialogResult.No:
                Debug.Log("Noボタンが押された");
                break;
        }
    }

 

 

閉じるボタンを押すとどうなるの?

閉じるボタンを押すと何が通知されるのでしょうか?
これはMessageBoxButtonsによって変わります

f:id:Raspberly:20200703234400p:plain

MessageBoxButtons.OKの場合は閉じてもOKが押されたと判定されます
MessageBoxButtons.YesCancelの場合はCancelが押されたと判定されます
MessageBoxButtons.YesNoCancelの場合はCancelが押されたと判定されます
MessageBoxButtons.RetryCancelの場合はCancelが押されたと判定されます

 

MessageBoxButtons.AbortRetryIgnore.YesNoの場合はそもそも閉じれない

f:id:Raspberly:20200703225947p:plain

f:id:Raspberly:20200703230518p:plain

 

全部触ったわけではありませんが、MessageBox.Showはオーバーロードが20個もあるのでいろいろできそう。

 

 

 

 

PCのユーザーネームを取得

次は少し変わった演出、PCのユーザーネームを取得しメッセージボックスで表示してみます。
本名を登録している人はそんなにいないと思いますが、初見の人はびっくりするかも。
ユーザーネームは「Environment.UserName」で取得できます。

    public void Open()
    {
        MessageBox.Show
         (
             "やぁ  " + Environment.UserName + "  見てるかい?"
         );
    }

 

f:id:Raspberly:20200703235808p:plain

 

 

 

まとめ

・System.WIndows.Forms.dllをインポートするとメッセージボックスを出せる
・タイトルとメッセージは自由に設定できるがボタンはある程度固定
・PCのユーザーネームも取れる

 

 

ちなみにSteamサマーセールは7月10日までやっているようなので気になる方は要チェック!
その4日後の7月14日はデスストランディングがSteamでリリースされるのでそっちも気になる・・・

 

 

 

 

参考資料

コガネブログさんの方では、EditorフォルダにDLLを格納していますがうまくいきませんでした。
Alpaca Tech Blogさんの方ではPluginsフォルダに格納していまして、こちらだと動作しました。
もしかしたら環境によって違うのかも。

baba-s.hatenablog.com

alpacatech.hateblo.jp

 

w.atwiki.jp

 

 

Unity外でC#を使ったことがそんなにないのでいろいろタメになったけども、
よくよく考えたらUnityというよりも.NET Frameworkの記事だこれ・・・
C#に詳しい方から見たら内容が初歩的すぎてつまらなかったかも・・・

 

 

間違っている所、わかりにくい所がありましたらコメントまでお願いします。

【アセット紹介】HUD for VRでVR用のHUDを作る【Unity】

今回はアセットの紹介をしていきます。
紹介するのはHUD for VR - Sterile Future
VR用のSFチックなHUD UIアセットです。

f:id:Raspberly:20200619193122p:plain

 

前回の記事を書いている途中に見つけたアセットで、面白そうなので紹介記事を書いてみました。

raspberly.hateblo.jp

 

 

 

どんなアセット?

VR用のHUDアセットです。HUD用のUI素材に加え多くのScriptがついています。
10ドルする有料アセットでしたが、無料になりました。

VRプロジェクトに有益なSci-Fi Hudを使用します。VRの乗り物酔いがなくても機能し、プロジェクトで完全にカスタマイズできます。

無菌未来;
+使いやすい+非常に
高速で最適化されている
+データを使用して アニメーション化され 、カスタマイズ可能。
+ VRの問題なし
+階層化されたセットアップでの作業
+含まれるソースコード
+ Mixed Reality HMD互換性
+ OculusおよびVive互換性
+モバイルVR互換性

インポートが簡単で、カスタマイズ可能なリグが無限にあり、最高の外観と快適さを実現します。

WebGLのデモがこちらから確認できます。

f:id:Raspberly:20200621014533p:plain

 

 

開発環境

Unity2019.4.0f1

HUD for VR - Sterile Future ver1.0

 

 

セットアップ

アセットインポート完了時はこんな感じです。

f:id:Raspberly:20200620231737p:plain

インポート時のエラーの解決

インポート完了後以下のようなエラーがでました。

f:id:Raspberly:20200620215206p:plain

このアセットにはMouseLock.csというScriptが含まれていますが、
Oculus Integrationにも同名のScriptがあるためエラーが起きています。

そのためファイル名とクラス名を別の名前に変えてあげると解決します。

 

サンプルシーンの確認 

VR HUD - Sterile Future/Scenes/SampleSceneがサンプルシーンになります。
前述の通りVR用のアセットですが、こちらはマウスでも操作可能になっています。
先ほどエラーが出ていた、MouseLock.csがマウス移動を反映しているようです。

f:id:Raspberly:20200620231840g:plain

画面には遅れて追従するHUDが表示されています。
目線の中央に位置するレティクルに、SFチックなインジケーターが盛りだくさんです。
右下、左下に表示されている数字はCameraの角度になります。右下がX軸(縦方向)で左下がY軸(横方向)です。

 

 

 

主要コンポーネント

CanvasLayerMove

このアセットのメインになるのがHUDです。SampleSceneにも置いてあります。

f:id:Raspberly:20200620233413p:plain

この中にCanvasが入っていますがCanvasにアタッチされているCanvasLayerMoveが重要なコンポーネントです。

f:id:Raspberly:20200620235313p:plain

Tracked Object

 追従するオブジェクトです。何も設定されていない場合はStart時にMainCameraが格納されます。

Track

 追従するかどうか、Falseにすると追従しなくなります。

Rotate Speed

 追従速度です。

 

 

 

 

実際に試してみる

テスト用のSceneとして、Oculus IntegrationのDistanceGrabを使います。

raspberly.hateblo.jp

 

このアセットの使い方ですが、PrefabのHUDをScene内に追加するだけです。

f:id:Raspberly:20200621013313p:plain

f:id:Raspberly:20200621013351p:plain

後は再生するだけでHUDが動作します。これは簡単!

f:id:Raspberly:20200621013508g:plain

後は自分好みにコンポーネントのパラメータを変えたり、HUDのデザインを調整すればよさそう。

 

 

付属のコンポーネント

主要コンポーネントであるCanvasLayerMove以外にもたくさんのコンポーネントが付属しています。

AngleToHUD

Cameraの角度を取得しTextに反映するコンポーネントです。
GetComponent<Text>をしているので、TextMeshProに使う場合は少し手直しが必要です。

f:id:Raspberly:20200621004055p:plain

f:id:Raspberly:20200621004259g:plain

 

RotateWithMove

Cameraの角度に応じてUIを回転させるコンポーネントです。

f:id:Raspberly:20200621005316p:plain

外側にある円の回転をコントロールしています。

f:id:Raspberly:20200621005423g:plain

 

SlideWithMove

Cameraの角度に応じてUIのPosXを変化させるコンポーネントです。
一定値を超えると反対側にリセットさせるようにできています。

f:id:Raspberly:20200621010009p:plain

f:id:Raspberly:20200621010015g:plain

 

FillWithMove

Cameraの角度X軸Y軸に応じてImageのFillAmoutを変化させるコンポーネントです。

f:id:Raspberly:20200621010340p:plain

f:id:Raspberly:20200621010436g:plain

 

OpacityWithMove

CanvasとTargetとの角度の差に応じてSpriteの透明度を変化させるコンポーネントです。

f:id:Raspberly:20200621010939p:plain

f:id:Raspberly:20200621011110g:plain

 

パラメータのSpeedに応じて点滅(ColorのAlphaを変化)させるコンポーネントです。

f:id:Raspberly:20200621011243p:plain

f:id:Raspberly:20200621011457g:plain

 

 

その他 HUDが障害物に隠れる問題

WorldSpaceのCanvasの宿命として地形や障害物に隠れる問題がおきます。

f:id:Raspberly:20200621014107g:plain

こちらは前回の記事で解決法を載せているので合わせてどうぞ。

raspberly.hateblo.jp

 

 

 

まとめ

VR用のHUDアセットだが、UI素材だけでなく付属のScriptも演出に役立つものばかり。
・使い方はPrefabをScene内に置くだけ。
これで無料

 

 

他のアセットの紹介記事はこちら↓

raspberly.hateblo.jp

 

VR開発記事はこちら↓

raspberly.hateblo.jp

 

 

 

 

※本記事にはAssetStoreアフィリエイトリンクが含まれています。

他、間違っている箇所、わかりにくい所がありましたらコメントにお願いします。

【VR開発メモ】視点から遅れて追従するUIを作る【Unity】

 

今回はVR開発ネタをやっていきます。
開発に使うのはOculusQuestですがRift Sなどにもそのまま応用できるかと思います。

 

VRアプリを体験されたり、遊んでいる方はこのようなUIを見たことがあるかと思います。

f:id:Raspberly:20200619004300g:plain
首を振ったり、辺りを見渡すとUIが少し遅れて追従してきますね。

(参考:Robo Recall)

Oculus Integarationに入ってそうですが見つからなかったので、今回はこれを作ってみます。

 

開発環境

Unity 2019.4.0f1

Oculus Integration ver17.0

Oculus Quest

 

セットアップ

まだProjectを作っていない方や初めてVR開発をする方はこちらを参考にしてみてください。
すでに作成済みの方は次へ。

raspberly.hateblo.jp

今回はこのようなSceneを用意しました。
何もないSceneにPlaneとOVRPlayerControllerを設置しています。(Planeは描画だけ切っています)

f:id:Raspberly:20200619004944p:plain

Cameraさえあればなんでもいいです。

 

 

実際にCanvasを作ってみる

VRでは、UIはワールド座標に配置することがほとんどで、
VRゲームのような画面に張り付けるタイプのUIは少なめです。

UnityではCanvasRender Modeを変えることでワールド座標に配置することができます

f:id:Raspberly:20200616223640p:plain


 

ただし、Canvasを作っていきなりモードを変えると設定が少し面倒なので以下の方法がオススメです。

tsubakit1.hateblo.jp

テラシュールブログさんのやり方でCanvasを作ってみます。

Canvasの作成

f:id:Raspberly:20200616224513p:plain

Canvas - Render ModeをScreenSpace-Cameraに変更

CanvasコンポーネントのRender ModeをScreen Space - Cameraに変更します。

f:id:Raspberly:20200616224721p:plain

Render CameraにはSceneに配置されているCameraを設定します。

f:id:Raspberly:20200616225038p:plain

設定するのはOVRCameraRig/TrackingSpace/CenterEyeAnchorです。

f:id:Raspberly:20200616225139p:plain

Plane DIstanceを調整

次にPlane Distanceを設定します。これはCameraとCanvas間の距離です。
プレイヤーに追従するUIとしてなら2~5くらいがちょうどいいかもしれません。

f:id:Raspberly:20200616225633p:plain

これにより、Cameraの前方にCanvasが移動します。大きさもいい感じです。

f:id:Raspberly:20200616230704p:plain

Canvas - Render ModeをWorld Spaceに変更

最後にCanvasのRender ModeをWorld Spaceにして完成です。

f:id:Raspberly:20200616230931p:plain

このやり方ならCanvasのWidth/HeightやScaleを自力で調整する手間がなくなります。

 

ImageやTextの配置

後は適当に画像や文字を配置していけばそれっぽいUIの出来上がりです。

f:id:Raspberly:20200619005430p:plain



 

 

 

必要なコンポーネントの準備

今回やりたいことを実現するためのScriptはこちら。コピペなどでProjectに入れてください。

FollowHUD

Targetを追跡して、位置や角度を追従するコンポーネントです。
このコンポーネントがアタッチされたオブジェクトの子にCanvasを置きます。

パラメータ

Target
 追従するターゲットのTransformです。設定されていない場合Main Cameraを自動的に取得します。

FollowMoveSpeed
 移動速度です。

FollowRotateSpeed
 回転速度です。

RotateSpeedThreshold
 UIとTargetの角度を常に計算し、一定以上離れたら回転速度を上げるようにしています。
このパラメータはそのしきい値です。

isImmediateMove
 有効にすることで位置のみ瞬時に同期するようになります。

isLock
 有効にすることで回転しないようにできます。XYZ個別に設定できます。
 文章を表示するUIはZ軸をLockしておくとよさそう。

 

 

CameraEnable

UI Cameraにアタッチすることで、シーン開始時にCameraを再有効化します。

 

 

 

UIのセットアップ

先ほど作ったCanvasコンポーネントを使って、視点から遅れて追従するUIを作ってみます。

HUDの作成

空のGameObjectを作り、名前を「HUD」(なんでもいい)に変えます。
作ったWorldSpaceのCanvasをHUDの子オブジェクトにします。

f:id:Raspberly:20200618232940p:plain


HUDにFollowCameraコンポーネントをアタッチします。Cameraの設定はしなくても大丈夫です。
他パラメータはお好みで。

f:id:Raspberly:20200618234024p:plain

これで完成です。

f:id:Raspberly:20200619000301g:plain


UIの細かい位置や速度などは実際に動かしながら調整するといいでしょう。

CanvasのPositionなどを調整

HUDのPositionはCameraと同じ値にしておくと調整が楽になります。
Cameraからの距離はCanvasを、細かい位置や角度はUI部品個別に調整するといいかも。

f:id:Raspberly:20200618234627p:plain

 

ちなみに、HUDを複数用意してSpeedを変えておくとバラバラに追従します

f:id:Raspberly:20200619003702g:plain



 

 

 

UIがオブジェクトに隠れてしまう時の対処法

WorldSpaceのUIの問題点として他のオブジェクトに隠れてしまう点があります。
床や壁、多数のオブジェクトがある場合困りますね。

f:id:Raspberly:20200619001251g:plain



対処方としては、UI用のCameraを新たに作成するのが手っ取り早いです。

Cameraの作成

CenterEyeAnchorDuplicate(オブジェクトの複製)し、名前をUI Cameraに変更します。
Audio Listenerは消しておきましょう。

f:id:Raspberly:20200618015843g:plain

UIのみ映るようにする

CameraコンポーネントCulling MaskをUIのみに設定します。
CameraはCulling Maskに設定したレイヤーのオブジェクトのみ描画します。

f:id:Raspberly:20200617233249g:plain

Clear FlagsをDepth onlyに

Clear FlagsをDepth onlyにします。

f:id:Raspberly:20200617233626p:plain

元のCameraにUIは映らないようにする

CenterEyeAnchorのCulling MaskからUIを外しておきます。
これでUIだけ映らなくなります

f:id:Raspberly:20200619000953p:plain


これで完成・・・ではないんです。実はもう一段落あります

 

アクティブな2つ目以降のCameraが正常に動かなくなる問題の解決

Scene内にアクティブなCameraが複数ある場合、1つを除いて正常に動かなくなる場合があります。
Oculus Integrationの何かがやっているとは思いますが、原因はわからず。。。


一度Cameraのenableを切り替えたり、オブジェクト自体の再アクティブ化を行えば治ります。 
先ほど紹介したCameraEnableコンポーネントをそのままアタッチすれば問題ありません。

f:id:Raspberly:20200619000541p:plain

これで完成です。
地形や障害物に影響されず最前列にUIが表示されるようになりました。

f:id:Raspberly:20200619001654g:plain

 

 

まとめ

・FollowHUDコンポーネントを使うことで、視点から遅れて追従するUIを作る

・UIが他のオブジェクトに隠れてしまう場合は、UI用のCameraを作ることで最前列に表示できる

 

 

 

その他

この記事を書いている最中に良さそうなアセットを見つけました。

紹介記事はこちら

raspberly.hateblo.jp

 

 

余談

HoloLensの話ですが、実はこのようなオブジェクトの配置方法はBody-Lockedと呼ばれているそうです。

HoloLens でのオブジェクトの配置は大きく 3 種類にわけられ、Body-Locked はその内の一つという位置づけです。

  • World-Locked
    • 現実の位置に重ねて表示
  • Display-Locked
    • ディスプレイ上に固定
  • Body-Locked
    • 視界の範囲内で遅延させて表示

tips.hecomi.com

 

 

参考文献

bibinbaleo.hatenablog.com

bibinbaleo.hatenablog.com

 

qiita.com

naichilab.blogspot.com

VRゲームプレイ「Robo Recall(ロボリコール)」vol.1 with Oculus

 

 

 

他のVR開発メモはこちら 

raspberly.hateblo.jp

 

 

他間違っている箇所がありましたらコメントにお願いします。

【クソデカ】Unityの限界までScaleを大きくし続ける【Unity】

今回はUnity自由研究をやっていきます。

 

Twitterなどでクソデカ羅生門というものが流行っていますね。
私もクソデカユニティちゃんなどを作ってキャッキャしていたわけですが、
ふと、どんどんScaleを大きくしていったらどうなるのか試してみたくなりました。

f:id:Raspberly:20200613173422p:plain

そこで今回は、宇宙規模までScaleをどんどん大きくしていく実験をしてみます。

 

追記:うお座くじら座銀河団Complexの直径を修正しました。
追記:プレアデス星団の画像を修正しました。

 

開発環境

Unity 2019.4.0f1

 

事前準備と注意事項

Unityでのメートル

Unityでは、Scale1のCube一辺が1メートルになるようできています。
つまり、Scale(10, 10, 10)のCubeなら一辺が10メートルということですね。

f:id:Raspberly:20200613175000p:plain

 

 

巨大なオブジェクトがGameビューに描画されない時の対処法

Unityには描画範囲が設定されており、この範囲外のオブジェクトなど描画されないようになっています。
この描画範囲はCameraから変更できます。
CameraのClipping PlanesFarが最大描画距離です。

f:id:Raspberly:20200613192559p:plain

デフォルトだと1000以降のオブジェクトは描画されないのでここの値を大きくするといいでしょう。

巨大なオブジェクトがSceneビューに描画されない時の対処法

Sceneビューに映らない時も同様で、Cameraの設定を変える必要があります。
Sceneビュー上のカメラのマークがついたボタンを押し、SceneCameraの編集ビューから値を変えます。
この時DynamicClippingにチェックが入っていると編集できないのでチェックを外しておきましょう。

f:id:Raspberly:20200613194156p:plain

 

各惑星、星団などの直径について

Googleで「"惑星or星団名 直径"」で検索して出たものを使っています。
もしかしたら違うものが混じっていたりするかもしれません。
その際はコメントまでよろしくお願いします。

 

 

クソデカユニティちゃんを作る

 最初はクソデカユニティちゃんを作ってみます。
デフォルトのSDユニティちゃんをキューブとかぶせるとこんな感じです。
大体高さ1メートルですね(カチューシャは含めない)

f:id:Raspberly:20200613175252p:plain
ではユニティちゃんのScaleを(1000000, 1000000, 1000000)にしてみます。

f:id:Raspberly:20200614204503p:plain
全長100万メートルのユニティちゃんの登場です。

f:id:Raspberly:20200613201508g:plain

比較対象がいなくともかなりスケール感が狂いますね。

 

 

 

 

宇宙を作る事前準備

ここから先は細かく大きさを変えてもきりがないので壮大にいきます。
その前に白いCubeやSpeherだと味気ないので、素材を追加します。
 

宇宙を作るのでSkyboxはこちらのアセットを使います。
SkyですがSpaceも含まれているアセットです。宇宙は空にある

 

地球なども作るのでこちらのアセットもいれておきます。 

 

 

 

それではやっていきましょう!

(脳内BGM ~グレンラガンの例の曲~)

 

 

太陽系を作る

地球を作る

宇宙創生の最初は我らが母星地球を作ります。
地球は直径12742000mです。

f:id:Raspberly:20200613202238p:plain

先ほどインポートしたアセットでいい感じになりました。

f:id:Raspberly:20200613201718p:plain

さきほどのクソデカユニティちゃん(100万m)を乗せるとこんな感じ。巨大綾波

f:id:Raspberly:20200613202030p:plain

 

月を作る

せっかくなので月も作ります。
月は直径3474200mです。

f:id:Raspberly:20200613203442p:plain

地球と並べるとこんな感じ、結構大きい。

f:id:Raspberly:20200613203623g:plain

 

地球-月の距離を離す

地球と月があるので現実と同じ尺度で再現してみます。
地球と月の距離は384400000mです。

f:id:Raspberly:20200613204106p:plain

何か警告が出てますね。浮動小数点の精度の関係上ワールド座標を小さくした方がいいとのこと。


実際に配置するとこんな感じ、意外と近い?いや遠い?

f:id:Raspberly:20200613204739g:plain

 

 

太陽を作る

太陽系の恒星、太陽を作ります。
太陽の直径は1392700000mです。

f:id:Raspberly:20200613205444p:plain

デカァァァァァいッ説明不要!!
大きさは地球の約109倍、質量約33万倍は伊達じゃないですね。

f:id:Raspberly:20200613205907g:plain

地球と太陽の距離は149600000000mですので、こちらも間隔を調整してみます。

f:id:Raspberly:20200613210109p:plain

こんなちっちゃくなるのか。

f:id:Raspberly:20200613210446p:plain

 

ちなみにこのあたりからギズモ(XYZ軸の矢印がついたアレ)が表示されなくなります。

 

他の太陽系惑星を作る

水星

直径は4879400mです。

f:id:Raspberly:20200613212125p:plain

金星

直径は12104000mです。

f:id:Raspberly:20200613212152p:plain

火星

直径は6779000mです。

f:id:Raspberly:20200613212223p:plain

木星

直径は139820000mです。

f:id:Raspberly:20200613212256p:plain

土星

直径は116460000mです。

f:id:Raspberly:20200613212320p:plain

天王星

直径は50724000mです。

f:id:Raspberly:20200613212352p:plain

海王星

直径は49244000mです。

f:id:Raspberly:20200613212441p:plain

惑星直列をやってみました。なかなか壮大ですね。水金地火木土天海m(ry
ちなみに惑星間の距離も現実に合わせて配置してみましたが、画面に全く収まらず小さすぎて見えないのでボツ

f:id:Raspberly:20200613214710g:plain

 

 

宇宙を作る

一光年を作る

天文学で使われる単位一光年を作っていきます。
年がついているので時間だと勘違いされがちですが、光が一年かけて進む距離を示します。
メートル換算で9.461e+15mとなります。ここはCubeを使っていきます。
※「e+〇〇」についてはこちら

f:id:Raspberly:20200613213842p:plain

一辺一光年のCubeの完成です。描画されましたがLightの影響を受けなくなりました。
Lightがレンダリングされるまで1年かかるのだろうか。

f:id:Raspberly:20200613214057p:plain

Sceneビューがおかしくなる

一光年に合わせてCameraの設定も変えていますが、なんだかブツブツとおかしくなっています。

f:id:Raspberly:20200613214541p:plain

f:id:Raspberly:20200613220211g:plain

なんだか不穏な空気がしますがUnityは動いているので続行します。

 

プレアデス星団を作る

肉眼でも見える散開星団です。日本では「すばる」といいますね。
直径は35光年、メートル換算で3.311e+17mとなります。
こちらもCubeで作ります。

f:id:Raspberly:20200614204626p:plain

一光年Cubeからカメラを引いて比較してみます。ちょうど35個分ですね。

f:id:Raspberly:20200613231739g:plain



ω星団を作る

最大の球状星団です。NGC 5139ともいいますね
直径は172光年、メートル換算で1.627e+18mとなります。
ここからはSphereで作っていきます。

f:id:Raspberly:20200613231436p:plain

プレアデス星団Cubeと比べると大体5倍くらいの大きさ。

f:id:Raspberly:20200613230919p:plain

 

NGC 604を作る

さんかく座銀河のHII領域で局部銀河系で最も大きいものです。
直径は1520光年、メートル換算で1.438e+19mとなります。

f:id:Raspberly:20200613232220p:plain

ω星団と比べるとこんな感じ

f:id:Raspberly:20200613232157p:plain

 

天の川銀河を作る

天の川銀河(単に銀河系とも)は太陽系を含む銀河のことを指します。
直径は105700光年、メートル換算で9.999992e+20mとなります。

f:id:Raspberly:20200613232648p:plain

NGC 609と比べるとこんな感じ

f:id:Raspberly:20200613232536p:plain

 

 

アンドロメダ銀河を作る

アンドロメダ銀河は太陽系を含む渦巻銀河です。
直径は220000光年、メートル換算で2.081361e+21mとなります。

f:id:Raspberly:20200613221836p:plain

 大きさ的には天の川銀河の約2倍です。

f:id:Raspberly:20200613232816p:plain



IC 1101を作る

観測されている銀河で最大のものです。
直径は3913900光年、メートル換算で3.7028353e+22mとなります。

f:id:Raspberly:20200613233238p:plain

アンドロメダ銀河と比べるとこんな感じ

f:id:Raspberly:20200613233202p:plain

 

 

おとめ座銀河団

天の川銀河アンドロメダ銀河など銀河群を含む超銀河団です。
直径は15000000光年、メートル換算で1.41910957e+23mとなります。

f:id:Raspberly:20200613233749p:plain

IC 1101と比べるとこんな感じ

f:id:Raspberly:20200613233716p:plain

 

 

うお座くじら座銀河団Complexを作る

銀河団、銀河フィラメントの複合体で、おとめ座銀河団を含んでいます。
長さ約10億光年幅約1.5億光年と推定されているらしい。(Wikipedia)
メートル換算で9.460730473e+24m1.419109571e+24mとなります。
厚さは調べてもよくわからなかったのでそのまま。

f:id:Raspberly:20200614000046p:plain

見づらいので白色にしました。
おとめ座銀河団と比べるとこんな感じ、手前にある小さい点がおとめ座銀河団

f:id:Raspberly:20200614021845p:plain



 

 

天元突破ユニティちゃんを作る

天元突破グレンラガンと同じ大きさのユニティちゃんを作ります。
全長約52.8億光年です。メートル換算で4.9952656895e+25mとなります。

f:id:Raspberly:20200614000715p:plain

踏んでいる白いのがうお座くじら座銀河団Complexです。
ユニティちゃんはプリミティブなCubeやSphereと違いちゃんとLightの影響を受けていますね。

f:id:Raspberly:20200614021730p:plain



 

 

観測可能な宇宙を作る

諸説あるようですが、ここでは可視宇宙の球体のことを指します。
直径約930億光年です。メートル換算で8.7984793395e+26mとなります。

f:id:Raspberly:20200614001947p:plain

天元突破ユニティちゃんと比べるとこんな感じ

f:id:Raspberly:20200614002152p:plain

f:id:Raspberly:20200614024457g:plain


 

 

天元突破ユニティちゃんを作る

天元突破グレンラガンと同じ大きさのユニティちゃんを作ります。
全長約1500億光年、メートル換算で1.419109570887e+27mです。

f:id:Raspberly:20200614002520p:plain

観測可能な宇宙と比べるとこんな感じ

f:id:Raspberly:20200614024155p:plain

f:id:Raspberly:20200614021016g:plain

この大きさでもアニメーションは破綻することなく再生できました。
歩くだけでその辺の銀河を滅ぼしそう。

f:id:Raspberly:20200614010643g:plain

巨大な物で思い当たるのはこれが最後ですね。
正直ここまでUnityが動くなんて思ってませんでした。その気になれば宇宙まで作れる!

 

 

浮動小数点の限界

最後に、理論上は浮動小数点の限界3.402823e+38まではいけると思うのでやってみました。

f:id:Raspberly:20200614003347p:plain

しかし何も表示されませんでした。どうやらこのあたりが限界のようです。
ちなみにこれ以上大きい値を入力しても強制的に3.402823e+38に戻されます

 

 

 

 

Unityの異変

宇宙を作っていく過程でSceneビューにいろいろ異変が起きていました。

Sceneビューが真っ白になり反応しなくなったり、Gameビューは真っ黒になったり。

f:id:Raspberly:20200613171433p:plain

f:id:Raspberly:20200613171537p:plain

動作がガクガクになったりなど。

f:id:Raspberly:20200614011041g:plain

f:id:Raspberly:20200621224626g:plain

これらの異変は、SceneビューをいったんClose Tabし新しくAdd Tabすると解決します。


コンソールを見てみるとたくさんエラーがでていました。
どうやらオブジェクトが大きすぎるとこうなるようです。

f:id:Raspberly:20200614010303p:plain

 

 

 

まとめ

・超天元突破ユニティちゃん(全長1500億光年)までは表示を確認できた
・SceneビューやGameビュー、ギズモが正常に動かなくなる
・理論上は3.402823e+38までいけるはず
宇宙ヤバイ

 

 

完全にネタ記事でしたが最後まで見ていただきありがとうございます。

もしやこの世界もUnityでできているのでは・・・? 

 

 

 

参考資料

地球から太陽までは、何光年ですか?│太陽│宇宙科学研究所キッズサイト「ウチューンズ」

ロボットの大きさ比較用全高データまとめ:ブレイクザウィットネス - ブロマガ

1e5、1e-6、1E+9などの数値の意味と注意点 - 具体例で学ぶ数学

honcierge.jp

ninagreen.hatenablog.com

www.scriptlife.jp

 

【アセット紹介】Magic Missiles and Lasers ミサイル編【Unity】

今回はアセットの紹介をしていきます。
紹介するのはMagic Missiles and Lasers
魔法のミサイルとレーザーが入ったエフェクトアセットです。

f:id:Raspberly:20200601215605p:plain

 

 

現在Sci-Fiをテーマにしたアセット100が50%OFFになる特大セール開催中です。
今回紹介するアセットもこちらのセール対象になっているのでお得に購入できちゃいます。
以下のバナーからどうぞ。6月13日15時59分までとなっています。

f:id:Raspberly:20200608131225j:plain

 

 

 

どんなアセット?

ミサイルのように追尾する魔法弾とレーザーが入ったエフェクトアセットです。
以下ストアページから引用

vimeo.com

vimeo.com

完全にカスタマイズ可能なVFX、任意のプロパティを調整して、独自の効果を作成できます。爆発、粒子、残り火、レーザー。これらはすべて個別に使用できます。

ボーナス:メッシュエンチャントシステム(火、ブレージング、エネルギー、プラズマ、エレクトロ)

-11の完全なVFXプレハブ
-5つの大爆発プレハブ
-5つのレーザーショットプレハブ
-28サウンドFX
-100以上のテクスチャとノイズ
-メッシュエンチャントシステム
-さまざまなシェーダーバリアント
-リニアおよびガンマ対応
-スタッフ、プラットフォーム、ロックモデル
-歪みシェーダー
-エッジ検出シェーダー
-シェーダーをディゾルブ

現在、ミサイルプレハブに対する完全なモバイルサポートはありません(レーザーはモバイルで正常に動作します)。私たちは将来のアップデートでミサイルのモバイルサポートを提供します、お楽しみに!

 

 

 

開発環境

Unity2019.3.12f1

Magic Missiles and Lasers ver1.1a

 

 

 

デモシーンの確認

アセットインポート完了時はこんな感じです。

f:id:Raspberly:20200601234833p:plain

SineVFX/Scenes/DemoSceneがデモシーンです、開いてみます。

f:id:Raspberly:20200606183053p:plain

同じ階層にあるDemoScene_Gammaがガンマ色空間用のデモシーンのようです。

f:id:Raspberly:20200606192836p:plain

 

デモシーンでは、ミサイルの発射とエフェクトの切り替え、昼夜の切り替えができます。
・マウス左クリックでミサイルを発射(ホールドで連射)
・マウス右クリックで大型ミサイルを発射
・画面左下のDAY/NIGHTボタンで昼夜切り替え
・画面左下の矢印ボタンでミサイルやレーザーの切り替え
マウスの方向に杖が向き、発射されたミサイルが誘導される

f:id:Raspberly:20200607130100g:plain


ミサイルは全6種類用意されています。
色だけでなくエフェクトにも特徴があります。

f:id:Raspberly:20200607165422g:plain

f:id:Raspberly:20200607170236g:plain

f:id:Raspberly:20200607170540g:plain

f:id:Raspberly:20200607170639g:plain

f:id:Raspberly:20200607170803g:plain



 

 

主要コンポーネント

このアセットを使いこなすうえで重要なコンポーネントを紹介します。

 

デモシーンを見てみると、EffectPrefabs直下にFireMissilesなどが置かれているのがわかります。

f:id:Raspberly:20200607215859p:plain

 

 

MouseTarget

FireMissilesについているコンポーネントです。
ただし、これはデモ用のコンポーネントのため、ゲームにそのまま組み込むものではありません。
自分のゲームに組み込む場合は、このScriptの中身を参考にするといいでしょう。

f:id:Raspberly:20200607232848p:plain

Speed

一見ミサイルのスピードのように見えますが、杖が回転する速度です。

StartWavePS & StartParticles

ミサイル発射時のエフェクトです。

SmallMissiles

ミサイルのエフェクトです。

SmallMissilesCount

ミサイルの発射数の制限です。

BigMissileOne&Two&Three

大型ミサイルの発射エフェクトです。3つまで設定できますが、TwoとThreeは設定しなくても動作します。

 

HomingParticles

Missilesにアタッチされているコンポーネントです。
こちらはそのままゲームに組み込めます。

f:id:Raspberly:20200608010402p:plain

Targetに設定されているTransformに向かってミサイルが飛行します。
他のScriptから設定してあげることもできます。

 

 

ミサイルを発射するごとにミサイル弾PrefabのようなものInstantiateしているわけではなく、
ParticleSystemをEmitしています。当たり判定もParticleCollisionを使用しているようです。

 

実際に試してみる

簡単にミサイルを実装できるようPrefabが用意されているので、1からシーンを作ってみます。

シーンを新しく作成し、ミサイルを撃つLauncherとTargetをそれぞれ作成します。

f:id:Raspberly:20200609020141p:plain

 

デモシーンにあるMouseTargetはそのままだと使いづらいのでミサイルを発射するScriptを書きます。
MouseTargetを参考に必要な部分はそのままコピペするとよさそうです。

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

public class Launcher : MonoBehaviour
{
    public ParticleSystem startWavePS;
    public ParticleSystem startParticles;
    public ParticleSystem smallMissiles;
    public int smallMissilesCount = 100;

    void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            startWavePS.Emit(1);
            startParticles.Emit(smallMissilesCount);
        }

        if(Input.GetMouseButton(0))
        {
            var em = smallMissiles.emission;
            em.enabled = true;
        }
        else
        {
            var em = smallMissiles.emission;
            em.enabled = false;
        }
    }
}

 作成したScriptをLauncherにアタッチします。

f:id:Raspberly:20200609021423p:plain

 

その後、SineVFX/MagicMissilesAndLasers/Prefabs/CompleteEffects/FireMissilesをLauncherの子オブジェクトにします。
今回はFireMissilesを選びましたがここはお好みで。

f:id:Raspberly:20200609021554p:plain

 

FireMissilesの中にあるCursorとStaffは使わないので非アクティブまたは削除します。
また、FireMissilesやEffectのPositionとRotationを0にしておきましょう。

f:id:Raspberly:20200609021849p:plain

FireMissilesにアタッチされている、MouseTargetとAnimatorも無効化しておきます。
こちらも使いません。

f:id:Raspberly:20200609022136p:plain


LauncherにアタッチしたLauncherコンポーネントに、以下の画像のようにパーティクルをひもづけます。
それぞれ、発射時のエフェクトとミサイル本体のエフェクトです。

f:id:Raspberly:20200609022608p:plain

最後に、MissilesにアタッチされているHomingParticlesにTargetをひもづけます。
ミサイルはこのTargetに向かっていきます。

f:id:Raspberly:20200609022709p:plain

これで完成です。
マウス左クリックでミサイルを単発発射、ホールドで連射します。

f:id:Raspberly:20200609023839g:plain

他、入力方法を変えたり、ターゲットをロックオンする機能を入れたり、
エフェクト自体のカスタマイズをするなど自分好みに改造していきましょう!

 

 

デモシーンもそうですがポストプロセシングと相性がいいです。
アセットに付属しているPost-processing Profileをそのまま使うだけでとてもきれいになります。

Sfi-Fiがテーマですが、魔法使いに撃たせてもカッコイイですね。

f:id:Raspberly:20200609010047g:plain

ユニティちゃんのアニメーションはこちらを使いました。

 

 

その他

着弾後のエフェクトが地形を貫通する時

ElectroMissiles着弾時のエフェクトが地形を貫通することがありました。

f:id:Raspberly:20200609025400g:plain

これはParticleCollisionの設定が正しくない場合に起こります。
ElectroMissiles/Missiles/Explosion_EmbersのParticleSystemから、

f:id:Raspberly:20200609025353p:plain

Collisionを選択し、TypeをWorldにすると解決します。

f:id:Raspberly:20200609025743p:plain



 

 

 

参考資料

今回レーザー部分についてはやりませんでしたが、かもそばさんがunity1weekで活用しているようです。

r-ngtm.hatenablog.com

ParticleCollisionについてはかめくめさんのブログで解説されています。

gametukurikata.com

 

 

 

他のアセットの紹介記事はこちら↓

raspberly.hateblo.jp

 

 

 

※本記事にはAssetStoreアフィリエイトリンクが含まれています。

他、間違っている箇所、わかりにくい所がありましたらコメントにお願いします。

UniRxがusingできない時の対処法

UnityでUniRxを使うときに、UniRxをusingできない事態が発生したのでまとめました。

開発環境

Unity 2019.3.12f1

 

発生した問題

using UniRxを記述するとUniRxは見つからないと表示される。

f:id:Raspberly:20200603214236p:plain

 

状況

UniRxをアセットストアよりダウンロード、インポートをしている。
Visual Studio側ではUniRxは表示されている。

f:id:Raspberly:20200603214622p:plain
また、Unityでコンパイルエラーは起きていない。

f:id:Raspberly:20200603213845p:plain

 

解決法

その1 Visual Studioを更新しよう

実は去年にも同じ問題に直面しており、その時はVisual Studioを更新したら治りました。

f:id:Raspberly:20200603233613p:plain

f:id:Raspberly:20200603232413p:plain

当時参考にしたのがビビンバさんのこちらの記事です。

bibinbaleo.hatenablog.com

 

うら干物さんのブログでも取り上げられています。

www.urablog.xyz

 

 

その2 NuGetパッケージマネージャーからインストール

今回はその1の方法でusingできなかったので別の解決方法を探したところ、
Twitterでよさそうな方法を見つけました。

 

どうやらVisual StudioのNuGetパッケージマネージャーからインストールできるとのこと、
さっそくやってみます。

 

Visual Studioのメニューバーから。
ツール/NuGetパッケージマネージャー/ソリューションのNuGetパッケージの管理を選択。

f:id:Raspberly:20200603235216p:plain

するとNuGetソリューションというウインドウが出ますので、参照からUniRxを検索し選択します。

f:id:Raspberly:20200604000243p:plain

ウインドウ右側にインストールするパッケージ?の情報が表示されるので、
プロジェクトにチェックを入れインストールをします。

f:id:Raspberly:20200604000523p:plain

何か出ますがそのままOK

f:id:Raspberly:20200604000653p:plain

これで完了です。

 

無事参照できました。

f:id:Raspberly:20200604000813p:plain

 

まとめ

UniRxがusingできなくなったら、まずはVisual Studioを更新する。
それでもだめならNuGetパッケージマネージャーからインストールする。

 

その他

他対処方がまとめられているツイート。
上記の方法で解決しない場合によさそう。

 

 

 

 

間違っている所、わかりにくい所がありましたらコメントまでよろしくお願いします。

【アセット紹介】Fish School Bundle【Unity】

今回はアセットの紹介をしていきます。
紹介するのはFish School Bundle
魚の動きをシミュレートしコントロールするアセットです。

f:id:Raspberly:20200517230444p:plain

最近Subnauticaという海洋サバイバルゲームにハマっていまして、
丁度このアセットを持っていたのもあり記事にしてみました。

 

 

 

どんなアセット?

魚の群れをコントロールするアセットです。
背景素材や水中シーンの構築にぴったりです。


Amberjack Fish School for Unity


個別のアセットで売られているものをがセットになっています。

個別に買うと80ドル以上しますが、このバンドルなら半額以下で買えちゃいます。
さらにさらにタツノオトシゴもボーナスとしてついてきます。
セール対象の頻度としてはBird Flock Bundleほど多くはないようです。


Bird Flock Bundleについてはこちら

raspberly.hateblo.jp

 

用語解説

最初に、このアセットを使う上で覚えておいたほうがいい用語をまとめました。

WayPoint
鳥が飛行する際に目印にする目的地を指します。ここに向かって鳥は飛びます。

School
群れのことを指します。

 

 

 

開発環境

Unity2019.3.12f1

Fish School Bundle ver1.3.3

 

この記事ではDolphinsを使用します。

 

 

 

サンプルシーンの確認

アセットインポート完了時はこんな感じです。

f:id:Raspberly:20200531224107p:plain

DolphinsやAmberjackなど魚の種類ごとにフォルダが分かれています。
このあたりはBirdと同じですね。

 

魚ごとにサンプルシーンが用意されています。

f:id:Raspberly:20200531224016p:plain

 

Dolphins Demo SCN Avoidance」 シーン

水中をイルカが遊泳するシーンです。

f:id:Raspberly:20200531230711g:plain

遊泳しない確認用の3Dモデルも設置されています。

f:id:Raspberly:20200531225837p:plain

 

Sceneビューだとこんな感じ

f:id:Raspberly:20200531231406g:plain

魚たちは群れを作り青枠(WayPoint)を目指して飛行します。
青枠は水色枠内にランダムに生成されます。時間経過で再生成されます。

 

 

 

 

主要コンポーネント

このアセットを使いこなすうえで重要なコンポーネントを紹介します。

School Controller

魚の群れをコントロールするコンポーネントです。
Bird Flock BundleでいうところのFlock Controllerに当たります。
インスペクター用のエディタースクリプトが用意されているので、
表示されているパラメーター名とスクリプト内部の変数名が一致しないことに注意。

 

魚はシーン開始時に生成されます。

f:id:Raspberly:20200531232333p:plain

Frame Skipping

フレーム更新の頻度をどの程度スキップするか。(60fpsでは3~4、30 fpsでは2~3)
この値が小さいほど頻繁に更新されるようになります。逆に大きいとカクカクになります。

Fish Prefab

魚のプレハブを設定します。

 

Grouping

魚を生成時にグループ分けをする機能です。
通常時ではヒエラルキービューのルートに魚が大量に生成されます。
これだとちょっと見づらいなぁと思った時にこの機能を使いましょう。

f:id:Raspberly:20200531233433p:plain

 

Group To Schoolにチェックを入れることで、School Controllerがアタッチされたオブジェクトの子オブジェクトとして生成します。
折りたたむことで各段に見やすくなります。

f:id:Raspberly:20200531233732p:plain

f:id:Raspberly:20200531233640p:plain

Group to New GameObjectの場合は空のゲームオブジェクトを生成し、そこにグルーピングします。

 

Bubbles

魚が泳ぐ時に出る泡エフェクトに関する設定です。
泡の出る頻度などを変更できますが、この設定はランタイムで反映されないので注意。

f:id:Raspberly:20200531235245g:plain

 

Roaming Area

WayPointを作成する範囲を設定します。(水色の枠)
それぞれのパラメータはx,y,z軸になっていて、この範囲内にWayPointを作成します
このパラメータが全て0の場合WayPointは作成されません

f:id:Raspberly:20200531235832p:plain

 

Size of the flock

Bird Amoutは魚の総数。

School Width, Depth, Heightは魚を生成する範囲&WayPointの大きさです。上図の青枠。
Start Position Offsetは生成範囲のオフセット。

 

Speed and Movement

魚が泳ぐ速度などの設定できます。

 

Turn Speed

魚の回転速度(方向転換時)を設定できます。

 

Random Fish Size

設定したプレハブの3Dモデルの大きさを設定します。
逆に言うと、プレハブ側のスケールを上書きするので大きさを変えたい場合はここの数値を調整しましょう。

 

Fish Random Animation Speeds

アニメーション速度を設定できます。

 

Animation

鳥が再生するアニメーションの設定。
AnimationClip名とアニメーションの再生速度が設定できます。

 

Obstacle Avoidance

魚が障害物を回避する時の設定。
障害物のコライダーのレイヤー名やどの程度距離をとって回避、停止するかなど。

 

 

 

実際に試してみる

School Controllerの配置

School Controllerをアタッチしたオブジェクトをシーン内に追加しましょう。
といっても、すでにプレハブが用意されているのでこれをシーン内に追加するだけです。

f:id:Raspberly:20200601001203p:plain

シーンに追加したら、上記コンポーネントのパラメーターを調整するだけ。
ゲームを実行すると魚が生成されます。

f:id:Raspberly:20200601003954p:plain

f:id:Raspberly:20200601005643g:plain

 

 

海に置いてみる

せっかくなので海を作って配置してみましょう。
今回は海アセットでお馴染みAQUAS 2020を使います。

AQUASの使い方についてはこちらなど。

www.asset-sale.net

 

 

当然ですが、Area Sizeが海面の上にでないよう注意してください。
この海はデモシーンにおいてある海をそのまま使っています。

f:id:Raspberly:20200601011817p:plain

 ただプレハブを配置するだけでここまで見栄えがよくなりました。

f:id:Raspberly:20200601011829g:plain

 

 

 

 

その他

ギズモが荒ぶる場合

シーンビューでSchool Controllerがアタッチされているオブジェクトのギズモが荒ぶることがあります。

f:id:Raspberly:20200531221316g:plain

オブジェクトの中心がCenterの場合この現象が起きます
Pivotにしておきましょう。

f:id:Raspberly:20200531221255p:plain

 

サンビームエフェクト

このアセットには、水面から光が降り注いでいるようなエフェクトがおまけとしてついてきます。

f:id:Raspberly:20200531235548g:plain



 

 

 

 

 

まとめ

・Fish School Bundleは魚の群れをシミュレーションできるアセット
・プレハブをシーン内に置くだけで魚の群れを出現させることができる
・魚の行動範囲などノーコーディングで調整できる

 

ただしBird Flock Bundleに比べ使えるシーンが限定されることに注意。
ゲームの水中ステージとかなら需要あるのかも。
また、バンドルとはいえ魚の種類は少ないので本格的な海を舞台にしたゲームにはちょっと厳しいかも。
別途モデルを用意しておきましょう。

 

 

実際に使ってみて感じたことですが、処理負荷が大きいように感じました。
AQUASと一緒に使っているGIFを上に載せていますが、1100匹表示するのにドローコールが10000を超えています。(SetPass callsの方が重要なのかしら)
もしかしたらコツがあるのかも。

f:id:Raspberly:20200601014004p:plain

 

 

他のアセットの紹介記事はこちら↓

raspberly.hateblo.jp

そういえばAQUASをきちんと使ったことがないので近いうちにまとめたい。

 

 

 

 

 

 

 

他間違っている箇所、わかりにくい所がありましたらコメントにお願いします。