- 投稿日:2020-11-19T21:37:05+09:00
【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の使用方法
流れとしては
ScriptableObject
派生クラスの作成ScriptableObject
派生のクラスをアセット化- パラメータを設定
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
これで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
を使用して効率的に行っていきましょう!参考
- 投稿日:2020-11-19T18:15:59+09:00
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#iosUnityで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 ~/.cocoapodsHomebrewでcocoapodsをインストールし直す
ターミナルで以下のコマンドをすべて実行する。
brew install cocoapods rm '/usr/local/bin/pod' brew unlink cocoapods brew link --overwrite cocoapodsUnityを再起動してもう一度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
- 投稿日:2020-11-19T17:03:23+09:00
【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 //{ //もしもタスクオブジェクトの(実績条件の)達成量が達成規定よりも上回ったら //報酬を与える } }これで、実績システムは完成となります。
おわりに
実績システムの大枠は作れたのですが、やはり中身がどれだけ充実できているかという所だと思うので、中身を書くときに見やすいコードを意識してい書いていきたいものです。
- 投稿日:2020-11-19T17:03:23+09:00
ゲームの実績システムを実装してみた。【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 //{ //もしもタスクオブジェクトの(実績条件の)達成量が達成規定よりも上回ったら //報酬を与える } }これで、実績システムは完成となります。
おわりに
実績システムの大枠は作れたのですが、やはり中身がどれだけ充実できているかという所だと思うので、中身を書くときに見やすいコードを意識してい書いていきたいものです。
- 投稿日:2020-11-19T15:22:04+09:00
Unityにてgitignoreを更新してもLibraryファイルが消えない時の対策
原因
Unity2019あたりから、GitHubで生成されるgitignoreだとうまくコミットから除外できなくなる
/[Ll]ibrary/ //ちゃんとはじいてる… /[Tt]emp/ /[Oo]bj/ /[Bb]uild/ /[Bb]uilds/ /[Ll]ogs/ /[Mm]emoryCaptures/対策
①いったんプロジェクトのLibraryフォルダを取り出す
②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が表示されなくなります。
これでLibraryがコミットに表示されなければ成功です!お疲れ様です!
今回は、gitignoreでLibraryがはじけない時の対応策を紹介しました。
チームメンバーの一人が、もっと前に対策を見つけていたのですが、メンバー全員そのことを忘れていたので、備忘録として今回は記事にしました。
少しでも役に立てば幸いです(;・∀・)
他の記事も見てみる
- 投稿日:2020-11-19T11:51:40+09:00
STYLYでVR湯婆婆を実装してみる
※ 湯婆婆の画像は スタジオジブリのサイト で配布されているものを使用しています。はじめに
最近流行ってる Javaで湯婆婆を実装してみる をVRでやってみました。
たぶん、 視聴機材は湯婆婆史上一番高額 だと思います。
視聴方法
完成品はこちらです!VRゴーグルをお持ちの方は、 STYLYをインストール してご覧になってください。
VRゴーグルをお持ちでない方でも、PCがあればWebブラウザで見れるので、是非ご覧になってください!
契約書だよ。そこに名前を書きな。
VR空間に入ると以下の図のようなテキストボックスが浮かんでいます。VR用のコントローラーでテキストボックスを選択すると英字キーボードが空中に現れるので、名前を入力してください。
残念ながら英数字しか入力できない仕様です。
贅沢な名だねぇ。
テキストボックスの右側にある
記
を選択すると、下にメッセージが出ます!新しい名前は入力された英数字の中からランダムで一文字選ばれます!
残念ながら日本語が入力できないので、新しい名前は必ず英数字一文字になります!
解説
主に以下の技術を使っています。
- 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
VRシーンが起動した直後に、結果のパネルは表示されてほしくないので、
Activate Game Object
のActivate
のチェックボックスをOFFにしておきます。ScanName
記
ボタンがクリックされると、こちらが発火します。テキストボックスはUnityの
InputField
で実装しており、ここでは、UI Input Field Get Text
でその値を取得し、変数name
に代入します。MakeNewName
次に、変数
name
の文字数をGet String Length
で数え、変数nameLength
に代入します。
Random Int
で0
~nameLength
の整数をランダムで生成し、変数newNameIndex
に代入します。ここでInclusive Max
のチェックボックスをOFFにしておきます。(後工程で不正なインデックス参照が発生してしまう可能性を排除するためです。)
Get Substring
で変数name
の中からnewNameIndex
番目の文字を取り出し、変数newName
に代入します。これで、新しい名前が生成できました!
PrintNewName
Activate Game Object
で非表示状態にしていた結果パネルを表示状態に切り替えます。
Build String
でname
やnewName
を結合して文章を生成し、UI Text Set Text
で出力します!クラッシュ湯婆婆の再現
名無しでボタンをクリックすると、
フン。というのかい。贅沢な名だねぇ。 今からお前の名前はだ。いいかい、だよ。分かったら返事をするんだ、!!という感じになり、とくにクラッシュしません!残念!
感想
PlayMakerのようなビジュアルスクリプティングでも湯婆婆を実現できることがわかって嬉しかったです。
追記:湯婆婆ARも作ってみた
同じ要領でAR版も作ってみました。
スマートフォンをお持ちの方は、 STYLY Mobile をインストール してから、以下のリンク先に表示されたQRコードを読み込んでみてください。
以下のように、ARで湯婆婆を見れます!
そして、 スマホだとなぜか日本語入力ができます!
- 投稿日:2020-11-19T10:56:23+09:00
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
を見ると追加されている
Exsamplesから様々なDemoをImportすることもできる
導入できれば,MRTKの設定をするウィンドウが出てくるので,Applyを押す.
4.シーンを作成
まずはHoloLens2のカメラを導入する.
Main Cameraが消えて下の2つが追加される.
次にボタンなどのToolを導入する.
Mixed Reality ToolKit/Toolbox
を押すとMRTK Toolboxのウィンドウが出てくる.
これを利用することで簡単にobjectを配置することができる.
クリックするだけで任意のボタンなどを追加可能です.
実装例
MRTK v2.5.1でボタン置いてみた#MRTK #Unity #HoloLens2 pic.twitter.com/dAoN0KmZnj
— ゆーま (@sagirin262) November 19, 2020PS. アップグレード
以前のバージョンを使用しているプロジェクトのアップデート方法はこちらに解説されています.
削除によるエラーやアップグレードがうまくいっていないと以前の状態に戻すことができない場合があります.
【※プロジェクト自体のバックアップを取っておくとよい】フォルダを削除する
・MRTK/Core
・MRTK/Example
・MRTK/Extensions
エラーでうまくいかないなら
MRTK
を削除して,新しいバージョンのunitypackage
3つをImportし直してください.あとがき
以前通り
unitypackage
ファイルからの導入も可能です.
Installation Guide
DL先:Releases - Github
やり方は以前の記事を参考にしてください.