itLinkedInPocketCopyUnityでは、データの取り扱いに特別なクラスが用意されています。うまく活用することで、依存性の低いコードを記述することができます。次のような点がこれまで扱ってきたスクリプトとの違いです。難しく感じるかもしれませんが、チュートリアルを通して効果を実感していきましょう。異なるタイプのデータを保持するために特別に設計された特殊なスクリプトです。従来のC#スクリプトとは異なり、GameObjectに直接アタッチする必要はなく、実際にアタッチすることもできません。他のスクリプトインスタンスに依存しないデータへのアクセスを可能にするクラスです。スクリプトインスタンスから独立した大量の共有データを格納できます。GameObject間でデータを共有するのに活用できます。実行中に変化する可能性のある大量のデータを処理するプロジェクトに最適です。プログラムに精通していないデザイン担当やサウンド担当が、自由に置き換えることができるようにScriptableObjectにSpriteやPrefab、AudioClipを保存する場所として活用できます。基本チュートリアルチュートリアルを通して、検証してみましょうチュートリアルでは、ゲーム中に登場する敵キャラの様々な情報(最大HPなど)を取得するためのデータの作成を想定しています。メモリの使用量の削減、依存性の低いコードの作成を学習の目的としています。プロジェクトの作成プロジェクト名ScriptableObjectTestで3Dプロジェクトを作成します。オブジェクトの作成Cubeオブジェクトを1つ作成します。名前はSlimeにします。名前をGameSceneにします。ScriptableObjectの作成まず雛形となるC#スクリプトを作成し、次にScriptableObjectを作成する手順になります。Unityが生成作成したコードを次の手順で変更/追記します。MonoBehavioursの継承をScriptableObjectの継承に置き換えます。Start()メソッドとUpdate()メソッドを削除します。フィールドを宣言します。maxHp;}Scirptableオブジェクトでゲームオブジェクト型を扱いたい場合Unityで使える様々な型をアウトレット接続で代入することができますが、Scene内(ヒエラルキー内)のオブジェクトはアウトレット接続できません。Prefabからオブジェクトを作成するサンプルのように、GameObject型で変数宣言し、Prefabをアウトレット接続(D&D)します。Createのメニューを作成この時点でScriptableObjectは使用可能ですが、この雛形(テンプレート)オブジェクトを何度も使用できるようにしたいと思います。Unityの拡張エディタの機能を使って、Unityエディターのメニュー項目に組み込みましょう。Publicクラス行のすぐうえにCreateAssetMenu属性(アトリビュート)を追加します。メニュー名もここで指定することができます。maxHp;}スクリプトを保存してUnityに戻ります。ScriptableObjectアセットを作成プロジェクトウィンドウで、CreateメニューにEnenyParamというサブメニューが追加されていますので選択します。(右クリックのメニューからか、プロジェクトウィンドウの左上の「+メニュー」から選択できます)今回は、スライム用のパラメータセットという意味で、名前を変更しておきましょう。アイコンが次のように変化しているのを確認します。オブジェクト)のアイコンです。ScriptableObjectに値を代入プロジェクトウィンドウのSlimeParamを選択し、インスペクターで表示されているMaxHpに値を設定します。参考(ScriptableObjectのファイル形式)ファイルの拡張子は、.assetになります。テキストファイルなのでメモ帳でも開くことができます。フォーマットは、yamlフォーマットです。これは、Unityのシーンファイル(.unity)と同じです。注目して欲しいのは最後の行ですね。maxHpの値が保存されているのがわかります。10ScriptableObjectを別のスクリプトにアウトレット接続して使うでは、この作成したパラメータセットを使ってみることにしましょう。そのために、新しくのスクリプトを作成します。Slimeオブジェクトにアタッチします。SlimeStatus.csEnemyParam型のSlimeParamを宣言しています。Statausスクリプトを見てみましょう。Paramにアウトレット接続で、値を代入できますね。ここに、先ほど作ったSlimeParamをD&Dしてみましょう。スクリプトの型を代入する方法と同じです。SlimeParamには、maxHpフィールドがありますよね。pubulic修飾子がついているので、アクセスできます。実行結果コンソールに次のように表示されると思います。(どのようなアクションで表示されるかはコードから考えてみてください)まとめ継承を使う場合、派生クラスで基本クラスのメンバーが使えるので、派生クラスのコード行が短くなります。作成されるインスタンスは、基本クラスのコードも含まれますのでメモリをその分消費してしまします。多量にオブジェクトを作成する場合、この使用量がバカにできないことがあります。その点、ScriptableObjectであれば新たに多量のメモリを使用することはありません。扱いも慣れればそれほど難しくないので、経験を通して活用できるようにしましょう。応用チュートリアル実際にサンプルを使って試してみましょうサンプルコードmaxHp以外でも、次のように様々な宣言を使うことで多種多様な情報を保存することができます。今回は、作成されたファイルを、Resourcesフォルダへ保存してみましょう。フォルダは最初作られていないので、その場合は名前を間違えないように新規作成します。}}SlimeStatus.cs(応用のため、テスト内容を更新しています)Resourcesフォルダ(リソースフォルダ)から、動的にデータを読み出しています。これは、このコードが実行されるまで、メモリの利用がなされないということです。}}ScriptableObjectのインスペクターデータをサンプルにように入力してみました。参考(ScriptableObjectのファイル形式)ファイルの拡張子は、.assetになります。テキストファイルなのでメモ帳でも開くことができます。フォーマットは、yamlフォーマットです。これは、Unityのシーンファイル(.unity)と同じです。注目して欲しいのは最後の行ですね。maxHp、gender、itemsの各値が保存されているのがわかります。“\u68CD\u68D2′′は、日本語が、文字コードで表記されているところになります。0クラス図EnemyParamスクリプトのリファクタリング(Gender列挙型とItemクラスを別スクリプトへ書き出した場合)見やすくするため、Gender列挙型とItemクラスをEnemyParamクラス内に所有していますが、他のクラスで活用したい場合、これを外部にファイルに書き出してもいいです。difensivePower;}クラス図まとめ応用のサンプルを通して、ScriptableObjectの汎用性が見えてきたでしょうか?ここで、最初に記述されている、特徴についてもう一度確認してみましょう。理解が深まったのではないでしょうかその他のCreateAssetMenuアトリビュート今回、メニューに使うアトリビュートとして、menuNameを使いました。"EnemyParam")]メニュー作成で表示される項目はmenuName以外にも次のようなカスタマイズが可能です。ファイルとしてプロジェクト内に簡単に作成と格納ができます。派生型をマークします。...抽象クラスからの継承を使ったUnityでの移動方法の学習unityでの移動(瞬間移動)には、2種類があります。コメントをキャンセルメールアドレスが公開されることはありません。付いている欄は必須項目ですコメント名前メールアドレスウェブサイト上に表示された文字を入力してください。コメントデータの処理方法の詳細はこちらをご覧ください。Unity【Unity】オプション設計のサンプルUnityでオプション登録を実装するためのサンプルコードです。