20201119のUnityに関する記事は7件です。

【Unity】今更ScriptableObject入門

最初に

どうも、ろっさむです。

今回は「Unityを使っているなら皆知ってるよね?え?知らないの?なんで?」レベルの機能である「ScriptableObject」についてまとめていこうと思います。
僕は知りませんでした。

ScriptableObjectとは

ゲームやアプリの中で変化せず、あちこちで共用するデータを格納する時に便利なクラスです。例えば、敵のパラメータがよく例として挙げられています。

個別のゲームオブジェクト等にアタッチはせず、都度アセットをロードして使用することになります。なので余計なオブジェクトがなく、エンジン側からのコールバックを殆ど受け取りません。

敵Aのステータスとして仕様書側でHP100と決まっていた場合、コード上でHPを定義する場合に以下の手法があります(実際パラメータとなるとHPだけじゃなくて色んな情報が入ってきます)。

  • ハードコーディング(クラス内に直接書く)
class EnemyA
{
    // これだとEnemyAのインスタンスの数だけHP分のメモリも確保されていく
    const int MaxHP = 100;
}
class EnemyA
{
    // これだとEnemyAが画面上にいなくてもメモリ上にはEnemyAのHP分のメモリは確保されてしまう
    public static int MaxHP = 100;
}
  • CSVで定義して読み込む
// これもEnemyAのインスタンスの数分csvを読み込む必要があったり、csvをコードで読み取りやすい形式に変更が必要
敵名,MaxHP,xxx.....
Goblin,100,xxx.....

他にもJsonなどで実装できますが、もう一つの手法としてScriptableObjectを知っておくと良いかもしれません。
ScriptableObjectを継承したパラメータ定義用クラスを作成し、Unityのアセットとして扱うことでEnemyAのインスタンスがどれだけ作られてもパラメータの数値等を参照する際にはパラメータ定義用アセットを一つ見ればわかるようになります。また、EnemyAが出現しないマップなど、EnemyAが画面上に出てこない場合はそもそも読み込まなければメモリも確保されません。つまり、無駄にメモリを確保しなくてもよくなるわけですね。また、パラメータ部分だけ別アセットとして用意している状態となるので、コンフリクトもしづらく、値の調整も行いやすくなります。

パラメータ調整の他にも表情のblendshapeの名前リストの格納や、UIに使用するテキストデータ等にも使用することができるでしょう。応用すればイベントシステムも作成することができるようです。

ScriptableObject自体はUnityエディタでもよく使用されているようなので、使いこなすことができれば様々な恩恵が受けられそうです。

また、ScriptableObject は一応ゲーム中に変化するデータを扱う事も出来ますが、実機ではゲームが終了した後にデータは全て初期値に戻るため、セーブデータ的な使い方はできません(イベント期間中のステータスバフなどなら使えるかもしれませんが)。逆にエディタ上で値を変更すると、そのままアセットに直保存されます。「エディタ上で実行中にパラメータ等の値を変更してゲームバランスを調整する」という工程がこの仕様によって非常に楽に進めることができます。

具体的には、アセットファイルへの書き込みは AssetDatabaseクラスから行われ、スクリプト側からパラメータ等の値を変更した際には明示的に AssetDatabase の SaveAsset() を呼び出す必要があります。ただ、このSaveAsset()は実機での起動中は呼び出すことができません(UnityEditor.dllへの参照がないため)。

このように、マスターデータの更新の頻度がそこまで高くなく、ゲーム内に組み込みたい場合には ScriptableObject は役に立ちます。逆に、ソシャゲのようなマスターデータの更新頻度が高く、チート対策も必要で…という場合にはデータが必要になるタイミングで都度Json形式などでサーバからデータをDLする仕組みの方が安心できます。

では実際にどのように作成して、使えば良いのか、というところですが、こちらもそこまで難しくはありません。

ScriptableObjectの使用方法

流れとしては

  1. ScriptableObject派生クラスの作成
  2. ScriptableObject派生のクラスをアセット化
  3. パラメータを設定
  4. ScriptableObject派生のクラスを使用

となります。
順番に見ていきましょう。

ScriptableObject派生のクラスを作成

単体のデータの塊だけを扱う(Enemy1種類につき1つのAsset)

こちらは簡単です。ScriptableObjectを派生したクラスを作成していきましょう。

using UnityEngine;

// CreateAssetMenu属性を使用することで`Assets > Create > ScriptableObjects > CreasteEnemyParamAsset`という項目が表示される
// それを押すとこの`EnemyParamAsset`が`Data`という名前でアセット化されてassetsフォルダに入る
[CreateAssetMenu(fileName = "Data", menuName = "ScriptableObjects/CreateEnemyParamAsset")]
public class EnemyParamAsset : ScriptableObject
{
    // データ群の先頭をstringにして名前等に設定するとInspectorで見たときに項目TOPに表示されるので見やすくなります。
    public string EnemyName = "スライム";

    // privateでも[SerializeField]をつけることでInspectorで確認できるようになります。
    [SerializeField]
    int MaxHP = 100;

    ...
}

複数のデータの塊を扱う(Enemy数種類を1つのAssetに含む)

もしもパラメータ自体が増えたり、複数種類のパラメータを一つのAssetの中に持ちたい場合には、別途データ用のstructやclasssを用意すると良いでしょう。

using UnityEngine;

[CreateAssetMenu(fileName = "Data", menuName = "ScriptableObjects/CreateEnemyParamAsset")]
public class EnemyParamAsset : ScriptableObject
{
    public List<EnemyParam> EnemyParamList = new List<EnemyParam>();
}

// System.SerializeField属性を使用することで、Inspector上で変更した値がアセットに保存されるようになります
[System.Serializable]
public class EnemyParam
{
    public string EnemyName = "スライム";

    [SerializeField]
    int MaxHP = 100;

    ...
}

ScriptableObject派生のクラスをアセット化

先ほどのコードであれば、Editor上からAssets > Create > ScriptableObjects > CreasteEnemyParamAssetという項目を押すことでEnemyParamAssetがDataという名前でアセット化されてassetsフォルダに入ります。

ただ、もし外部ファイル(json,csv...etc)からパラメータを読み込んでScriptabeObjects側に流し込む場合には、アセット化する機能を持つクラスとScriptableObjects派生クラスで分けて制作していく流れになるかと思います。

using UnityEngine;

public class EnemyParamAsset : ScriptableObject
{
    public List<EnemyParam> EnemyParamList = new List<EnemyParam>();
}

[System.Serializable]
public class EnemyParam
{
    public string EnemyName = "スライム";

    [SerializeField]
    int MaxHP = 100;

    ...
}
using System.IO;
using UnityEditor;
using UnityEngine;

// AssetDatabaseを使用しているため、ビルド時には含めないようにしないとビルドエラーが起きる
#if UNITY_EDITOR
public static class CreateEnemyParamDataAssetFromCsv
{
    private const string AssetPath = "Assets/Resources/Data/Enemy/";
    private const string CsvPath = "Assets/Data/Status/Enemy/xxxx.csv"

    // MenuItem属性を付けることでEditorの上部メニューに`ScriptableObjects > CreateEnemyParamAsset`が表示されます
    // 押下すると`CreateEnemyParamDataAsset()`が実行されます
    [MenuItem("ScriptableObjects/CreateEnemyParamAsset")]
    private static void CreateEnemyParamDataAsset()
    {
        var enemyParamAsset = CreateInstance<EnemyParamAsset>();

        // この辺で外部ファイルパスを用いてデータを読みこみ、
        // 作成したenemyParamAssetに値を流し込む処理を挟む....
        // 例えばenemyParamAsset.EnemyParamList.Add(hogeParam); 的な

        // 流し込んだ後は実際に作成します
        // ここで作ったアセットの置き場所であるパスの指定もできます
        var assetName = $"{AssetPath}{enemyType}Data.asset";
        AssetDatabase.CreateAsset(enemyParamAsset, assetName);

        // Asset作成後、反映させるために必要なメソッド
        AssetDatabase.Refresh();
    }
}
# endif

外部ファイルを読み込んでScriptableObjects側に流し込む方法だと、外部ファイルの値がマスターデータ扱いで、ScriptableObjectはそのマスターデータをゲームに流し込むためのクッション扱いになります。
この方法には以下のメリット・デメリットがあります。

メリット:

  • 外部ファイルでの値がマスターデータとなり、gitなどでの変更差分を確認することができる。
  • Editor上でアセット自体の値の書き換えを行うと即座にアセットに反映されて前の値は消されてしまうが、マスターデータは別にあるため、以前の値がわからなくなるということがなくなる。
  • 複数人でのパラメータ調整がしやすくなる

デメリット:

  • マスターデータからScriptableObjectに反映させるコード上の実装の手間がある
  • Editor上でアセット自体の値の書き換えを行って調整した際に、値をマスターデータ側に反映させる作業が必要になる。

ちなみにcsv等の外部ファイルからScriptableObjectを作成する無料アセットも存在しているのでチェックしてみると良いかもしれません。

https://assetstore.unity.com/packages/tools/integration/csv-serialize-135763?aid=1101l4PmM&utm_source=aff
image.png

これでAssetが指定したフォルダ下に作られるようになりました!
後は実際にInspectorなどから必要に応じてアセットの値を直接変更できます。

ScriptableObject派生のクラスを使用

あとは使い方ですが、こちらもシンプルにResources.Load等でデータを取得して使用するだけです。

public class EnemyBase : MonoBehaviour
{
    public enum EnemyType
    {
         Goblin,
         ...
    }

    EnemyType enemyType;

    public void ReadEnemyDataAsset()
    {
        var path = $"Data/Enemy/{enemyType.ToString()}";
        var enemyData = Resources.Load(path) as EnemyParamAsset;

        // あとは読み込んだ値を使って諸々セットなどの処理を行う
        ...

    }
}

もしくは可能そうならEditor上でScriptableObjectのアセットをアタッチする方法もあります。

最後に

ScriptableObjectは知ってみると非常に使い勝手が良く、Unityの実行速度にも優しい応用のきく機能です。
データ管理と使用は使えそうなら ScriptableObject を使用して効率的に行っていきましょう!

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UnityにadMobを入れてiOSビルドした時にxcworkspaceが生成されない

環境

macOS Catalina 10.15.7
unity Version 2019.4.14f1 Personal
GoogleMobileAds-v5.4.0.unitypackage

現象

UnityでiOS、Android向けのアプリを作っていて、広告を表示するためにAdMobを導入した。
公式サイトのやり方にしたがってMobile Ads Unityプラグインをダウンロード、インポートした。
https://developers.google.com/admob/unity/start#ios

UnityでFile->Build Settings->BuildからiOSプロジェクトをビルドした。
以前他のアプリにAdMobをインポートした際には、この時xcworkspaceが自動で生成されていたが、今回はなぜか生成されなかった。
xcodeprojファイルを開いてビルドすると、下記エラーが出て失敗した。

'GoogleMobileAds/GoogleMobileAds.h' file not found

解決方法

cocoapodsがうまく動いていないらしい。
gemでインストールしていたcocoapodsをアンインストールして、homebrewでインストールし直した。

cocoapodsをアンインストールする

ターミナルで以下を実行する。

sudo gem uninstall cocoapods -n /usr/local/bin

さらにcocoapods関連のものをすべて表示する。

gem list --local | grep cocoapods

私の環境では以下のように実行結果が表示された。

cocoapods-core (1.8.4)
cocoapods-deintegrate (1.0.4)
cocoapods-downloader (1.3.0)
cocoapods-plugins (1.0.0)
cocoapods-search (1.0.0)
cocoapods-stats (1.1.0)
cocoapods-trunk (1.4.1)
cocoapods-try (1.1.0)

これらをすべてアンインストールしていく。

sudo gem uninstall cocoapods-core -n /usr/local/bin
sudo gem uninstall cocoapods-deintegrate -n /usr/local/bin
sudo gem uninstall cocoapods-downloader -n /usr/local/bin
sudo gem uninstall cocoapods-plugins -n /usr/local/bin
sudo gem uninstall cocoapods-search -n /usr/local/bin
sudo gem uninstall cocoapods-stats -n /usr/local/bin
sudo gem uninstall cocoapods-trunk -n /usr/local/bin
sudo gem uninstall cocoapods-try -n /usr/local/bin

すべてSuccessfully uninstalledと表示されてアンインストールされたはず。
一応もう一度listを表示してすべてアンインストールされたことを確認する。

gem list --local | grep cocoapods

.cocoapodsを削除する。

rm -rf ~/.cocoapods

Homebrewでcocoapodsをインストールし直す

ターミナルで以下のコマンドをすべて実行する。

brew install cocoapods
rm '/usr/local/bin/pod'
brew unlink cocoapods
brew link --overwrite cocoapods

Unityを再起動してもう一度iOSビルドしたらちゃんとxcworkspaceが生成されていた。

参考

https://qastack.jp/superuser/686317/how-to-fully-uninstall-the-cocoapods-from-the-mac-machine
https://stackoverflow.com/questions/61116512/cocoapods-installation-failed-failed-to-build-gem-native-extension

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity】ゲームの実績システムを実装してみた。

ゲームの実績システムを実装してみた。【Unity】

UnityでスマホアプリのStgを作っているのですが、実績システムを実装するにあたって、自分がどうやって作ったかを
備忘録的に書いていきたいと思います。

そもそも実績システムとは...

自分がプレイ中にした行動に対して一定の規定をクリアしたら報酬がもらえるシステム。
どうすれば実績システムが作れるかを考えていきます。

まず、実績システムを作るために、2つの要素が必要と考えました。

1 プレイした時に実績としてデータが保存される機構。
2 保存されたデータを取得し、一定の規定をクリアしたら報酬を与える機構。

この二つの要素をクリアすれば実績システムが作れたといえると思います。
まず、1番目のプレイした時に実績としてデータが保存される機構を作っていきました。

実績保存クラス.C#
public class SaveAchievement : MonoBehaviour
{
    public static SaveAchievement saveAchievement;
    public int enemyKillCount,gameoverCount,clearCount;
}

ここでは、実績を保存するためのスクリプトを作りました。
public staticで宣言することによって他のスクリプトから取得することを容易にし、
敵を倒したときの変数、ゲームオーバーになった時の変数、クリアした時の変数を
用意したので準備はばっちりです。ここに他のスクリプトから値を足していくことで
実績システムを作れると思います(敵を倒したときにSaveAchievementのenemyKillCountに
+1するというようなコードを書く)

2番目の保存されたデータを取得し、一定の規定をクリアしたら報酬を与える機構も作りました。

実績報酬クラス.C#
public class RewardAchievement : MonoBehaviour
{
    int enemyKillJudgment = 10;//実績規定
    if(enemykillCount <=enemyKillJudgment //{
    //もしもタスクオブジェクトの(実績条件の)達成量が達成規定よりも上回ったら    
        //報酬を与える
    }
}

これで、実績システムは完成となります。

おわりに

実績システムの大枠は作れたのですが、やはり中身がどれだけ充実できているかという所だと思うので、中身を書くときに見やすいコードを意識してい書いていきたいものです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ゲームの実績システムを実装してみた。【Unity】

ゲームの実績システムを実装してみた。【Unity】

UnityでスマホアプリのStgを作っているのですが、実績システムを実装するにあたって、自分がどうやって作ったかを
備忘録的に書いていきたいと思います。

そもそも実績システムとは...

自分がプレイ中にした行動に対して一定の規定をクリアしたら報酬がもらえるシステム。
どうすれば実績システムが作れるかを考えていきます。

まず、実績システムを作るために、2つの要素が必要と考えました。

1 プレイした時に実績としてデータが保存される機構。
2 保存されたデータを取得し、一定の規定をクリアしたら報酬を与える機構。

この二つの要素をクリアすれば実績システムが作れたといえると思います。
まず、1番目のプレイした時に実績としてデータが保存される機構を作っていきました。

実績保存クラス.C#
public class SaveAchievement : MonoBehaviour
{
    public static SaveAchievement saveAchievement;
    public int enemyKillCount,gameoverCount,clearCount;
}

ここでは、実績を保存するためのスクリプトを作りました。
public staticで宣言することによって他のスクリプトから取得することを容易にし、
敵を倒したときの変数、ゲームオーバーになった時の変数、クリアした時の変数を
用意したので準備はばっちりです。ここに他のスクリプトから値を足していくことで
実績システムを作れると思います(敵を倒したときにSaveAchievementのenemyKillCountに
+1するというようなコードを書く)

2番目の保存されたデータを取得し、一定の規定をクリアしたら報酬を与える機構も作りました。

実績報酬クラス.C#
public class RewardAchievement : MonoBehaviour
{
    int enemyKillJudgment = 10;//実績規定
    if(enemykillCount <=enemyKillJudgment //{
    //もしもタスクオブジェクトの(実績条件の)達成量が達成規定よりも上回ったら    
        //報酬を与える
    }
}

これで、実績システムは完成となります。

おわりに

実績システムの大枠は作れたのですが、やはり中身がどれだけ充実できているかという所だと思うので、中身を書くときに見やすいコードを意識してい書いていきたいものです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityにてgitignoreを更新してもLibraryファイルが消えない時の対策

原因

Unity2019あたりから、GitHubで生成されるgitignoreだとうまくコミットから除外できなくなる

/[Ll]ibrary/          //ちゃんとはじいてる…
/[Tt]emp/
/[Oo]bj/
/[Bb]uild/
/[Bb]uilds/
/[Ll]ogs/
/[Mm]emoryCaptures/

対策

①いったんプロジェクトのLibraryフォルダを取り出す

Qiita20201119_1.png
このファイルをいったん別の場所に移動しておく。

②Libraryフォルダを移動したことをコミットプッシュする

③プロジェクトのgitignoreを開いて、Libraryをはじくように書き換える

[Ll]ibrary/          
/[Tt]emp/
/[Oo]bj/
/[Bb]uild/
/[Bb]uilds/
/[Ll]ogs/
/[Mm]emoryCaptures/

/[Ll]ibrary/となっていたものを、[Ll]ibrary/に書き換える。つまり、先頭の/(スラッシュ)を消してやるとLibraryの変更を表示しなくなります。

④Libraryフォルダを元の場所に戻す

①で取り出したLibraryフォルダを、もとあった場所に戻すとコミットにLibraryが表示されなくなります。
Qiita20201119_1.png
これでLibraryがコミットに表示されなければ成功です!

お疲れ様です!

今回は、gitignoreでLibraryがはじけない時の対応策を紹介しました。
チームメンバーの一人が、もっと前に対策を見つけていたのですが、メンバー全員そのことを忘れていたので、備忘録として今回は記事にしました。
少しでも役に立てば幸いです(;・∀・)
他の記事も見てみる

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

STYLYでVR湯婆婆を実装してみる

image.png
※ 湯婆婆の画像は スタジオジブリのサイト で配布されているものを使用しています。

はじめに

最近流行ってる Javaで湯婆婆を実装してみる をVRでやってみました。

たぶん、 視聴機材は湯婆婆史上一番高額 だと思います。

視聴方法

完成品はこちらです!VRゴーグルをお持ちの方は、 STYLYをインストール してご覧になってください。

湯婆婆VR

VRゴーグルをお持ちでない方でも、PCがあればWebブラウザで見れるので、是非ご覧になってください!

契約書だよ。そこに名前を書きな。

VR空間に入ると以下の図のようなテキストボックスが浮かんでいます。VR用のコントローラーでテキストボックスを選択すると英字キーボードが空中に現れるので、名前を入力してください。

残念ながら英数字しか入力できない仕様です。

image.png

贅沢な名だねぇ。

テキストボックスの右側にある 記 を選択すると、下にメッセージが出ます!

新しい名前は入力された英数字の中からランダムで一文字選ばれます!

残念ながら日本語が入力できないので、新しい名前は必ず英数字一文字になります!

image-20201117221034467.png

解説

主に以下の技術を使っています。

  • STYLY : VR空間の作成・公開
  • Unity : テキストボックス等のGUI部品の作成
  • PlayMaker : 名前生成アルゴリズムの作成

STYLYとは?

STYLYはVR・ARの空間を作成・共有できるプラットフォームです。お手軽にVR空間が作れます。詳しくは STYLY公式ページ をご覧ください。

湯婆婆のような文字列の加工処理をSTYLY上でやる場合、PlayMakerというものが必要になるので、それも使います。PlayMakerについて、詳しくはこちらをご覧ください。

【Unity入門】Playmakerを使った初めてのゲーム作り 概要とインストール

PlayMakerアルゴリズム

以下の図のように、4段階の状態遷移で実現しました。

  • InitState : 初期化処理です。結果のパネルを非表示にします。 START をトリガーにします。

  • ScanName : テキストボックスから名前を取得する処理です。ボタンクリックをトリガーにします。

  • MakeNewName : 新しい名前を生成する処理です。 ScanName の FINISHED がトリガーです。

  • PrintNewName : 新しい名前を表示する処理です。 MakeNewName の FINISHED がトリガーです。

InitState

image.png

VRシーンが起動した直後に、結果のパネルは表示されてほしくないので、 Activate Game Object の Activate のチェックボックスをOFFにしておきます。

ScanName

image.png

記 ボタンがクリックされると、こちらが発火します。

テキストボックスはUnityの InputField で実装しており、ここでは、 UI Input Field Get Text でその値を取得し、変数 name に代入します。

MakeNewName

image.png

次に、変数 name の文字数を Get String Length で数え、変数 nameLength に代入します。

Random Int で 0 ~ nameLength の整数をランダムで生成し、変数 newNameIndex に代入します。ここで Inclusive Max のチェックボックスをOFFにしておきます。(後工程で不正なインデックス参照が発生してしまう可能性を排除するためです。)

Get Substring で変数 name の中から newNameIndex 番目の文字を取り出し、変数 newName に代入します。

これで、新しい名前が生成できました!

PrintNewName

image.png

Activate Game Object で非表示状態にしていた結果パネルを表示状態に切り替えます。

Build String で name や newName を結合して文章を生成し、 UI Text Set Text で出力します!

クラッシュ湯婆婆の再現

名無しでボタンをクリックすると、

フン。というのかい。贅沢な名だねぇ。
今からお前の名前はだ。いいかい、だよ。分かったら返事をするんだ、!!

という感じになり、とくにクラッシュしません!残念!

感想

PlayMakerのようなビジュアルスクリプティングでも湯婆婆を実現できることがわかって嬉しかったです。

追記:湯婆婆ARも作ってみた

同じ要領でAR版も作ってみました。

スマートフォンをお持ちの方は、 STYLY Mobile をインストール してから、以下のリンク先に表示されたQRコードを読み込んでみてください。

湯婆婆AR

以下のように、ARで湯婆婆を見れます!

image.png

そして、 スマホだとなぜか日本語入力ができます!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UnityでMRTK v2.5.1を導入する【HoloLens2】

まえがき

2020年10月にMRKTがv2.5.1に更新されました.【Releases】
v2.5.0からの変更点はこちら.
個人的にはPackage Managerからの導入が可能になったのが気になったので今回はこちらを試していきたいと思います.

本題

機器概要

機器名 バージョン
Windows10 ---
Unity 2019.3.2f.1
MRTK 2.5.1

導入

以前の記事の導入を参考に設定する.

手順

※詳しくは公式ページに記載されています.

1.projectの作成

2.HoloLens2用の設定をする

以前の記事のHoloLens2用に設定を参考に設定する.

3.パッケージの追加

projectを作成したらエクスプローラーを開き,以下のファイルを編集する.
{projectフォルダ}/Packages/manifest.json
追記する内容は以下の通り

manifest.json
{
  "scopedRegistries": [
    {
      "name": "Microsoft Mixed Reality",
      "url": "https://pkgs.dev.azure.com/aipmr/MixedReality-Unity-Packages/_packaging/Unity-packages/npm/registry/",
      "scopes": [
        "com.microsoft.mixedreality",
        "com.microsoft.spatialaudio"
      ]
    }
  ],
  "dependencies": {
    "com.microsoft.mixedreality.toolkit.examples": "2.5.1",
    "com.microsoft.mixedreality.toolkit.foundation": "2.5.1",
    "com.microsoft.mixedreality.toolkit.tools": "2.5.1",
  {以下に他のパッケージのバージョン設定が続く}
}

もし他にscopedRegistriesに他のパッケージ情報がある場合は以下のように記述する

manifest.json
{
  "scopedRegistries": [
    {
      "name": "Microsoft Mixed Reality",
      "url": "https://pkgs.dev.azure.com/aipmr/MixedReality-Unity-Packages/_packaging/Unity-packages/npm/registry/",
      "scopes": [
        "com.microsoft.mixedreality",
        "com.microsoft.spatialaudio"
      ]
    }
  ],
  [
    {
      "name": "**************",
      "url": "*********************************",
      "scopes": [
        "************************",
      ]
    }
  ],
  "dependencies": {
   {パッケージのバージョン設定が続く}
  }
}

記述した後にWindow/Package Managerを見ると追加されている
image.png
Exsamplesから様々なDemoをImportすることもできる
image.png

導入できれば,MRTKの設定をするウィンドウが出てくるので,Applyを押す.
image.png

4.シーンを作成

まずはHoloLens2のカメラを導入する.
image.png
Main Cameraが消えて下の2つが追加される.
image.png

次にボタンなどのToolを導入する.
Mixed Reality ToolKit/Toolboxを押すとMRTK Toolboxのウィンドウが出てくる.
image.png

これを利用することで簡単にobjectを配置することができる.
image.png
クリックするだけで任意のボタンなどを追加可能です.
image.png

実装例

適当にデモっぽいものを作成
image.png

PS. アップグレード

以前のバージョンを使用しているプロジェクトのアップデート方法はこちらに解説されています.
削除によるエラーやアップグレードがうまくいっていないと以前の状態に戻すことができない場合があります.
【※プロジェクト自体のバックアップを取っておくとよい】

フォルダを削除する
・MRTK/Core
・MRTK/Example
・MRTK/Extensions

名前が異なる場合は以下を参照
image.png

エラーでうまくいかないならMRTKを削除して,新しいバージョンのunitypackage3つをImportし直してください.

あとがき

以前通りunitypackageファイルからの導入も可能です.
image.png

Installation Guide
DL先:Releases - Github
やり方は以前の記事を参考にしてください.

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む