コピー2019.10.23ゲーム製作の際に、敵の種類やアイテムごとのパラメータをデータベースとして実装したい時がよくあります。方法は様々ですが、どれも難しそう、とっつきにくそうなイメージがあります。そのため今回は、スクリプトで実装可能かつUnityのインスペクタ側で編集可能なシンプルなデータベースの実装例を紹介していきます。実装方法スクリプトの準備データベース部分のソースコードデータベースアセットの作成と入力データベースから値を取得DataBaseManagerのソースコードGetDataBaseValueのソースコードまとめ実装方法スクリプトの準備まず、入力の受け皿となるデータベースを作成していきます。新しいC#スクリプトを作成し以下のように記述しました。[CreateAssetMenu]という属性を追加しています。これにより、Unity上で新しいフォルダやマテリアルなどを作成する際と同じ手順で新規データベースを作成することができます。ScriptableObjectになっています。これは公式のドキュメントによるとスクリプトインスタンスから独立した大量の共有データを格納できるクラスUnityのスクリプトレファレンスより引用というものであり、メリットとして、独立して機能することによりスクリプトをオブジェクトに張り付ける必要がなく、アセットとして簡単に利用できることなどが挙げられるため、今回用いています。このScriptableObjectのもっと詳しい情報は、ScriptableObjectとは【Unity】【ScriptableObject】という記事が非常に参考になりました。クラス内では、データベースの値を他のスクリプトから参照する為の実装を行っています。クラス内から見るとメソッドのように振舞うもの、つまり内外部のどちらでも値を参照可能で更新も可能というものです。このプロパティが「=>」記号を用いてexampleを指定することで、privateのexampleの値を取得しています。他のスクリプトでこの値を利用したい際は、このプロパティをメソッドとして呼ぶことにより値が取得可能です。(正直自分もそれほど理解していないです)。ここでは、単に他のスクリプトから値を利用したいだけなので、もちろん別の実装方法でも可能です。今回は簡潔に書けるという理由から、これを利用しました。11行目以降から、structを用いて構造体を定義しています。この構造体内の変数がデータベースにおけるデータの部分になります。構造体の定義時に[System.Serializable]を追加しています。これにより、インスペクタ上に構造体(またはクラス)を表示することができます。[System.Serializable]と同じくインスペクタ上に表示する機能があります。要するにインスペクタ上でパラメータを操作したい場合はシリアライズすればよい、というイメージです。データベースアセットの作成と入力スクリプトでデータベースの実装までが終わったので、Unity上でデータベース内に値を入力していきます。新しいデータベースを作成します。プロジェクトのCreateから新しいExampleデータベースを作成し適当な名前を付けます。作成したデータベースをクリックし、インスペクタ側で好きなように値を入力します。データベースを参照する為に、”Resources”という名前でフォルダを作成し、先ほどのデータベースアセットを入れておきます。これでデータベース自体の準備は完了です。最後にデータベース自体が完成したので実際に値を取得したいと思います。今回の方法では、データベースのデータを個別IDから選択するマネージャークラス(DataBaseManagerスクリプト)と実際に値を取得するクラス(GetDataBaseValueスクリプト)の二つの実装を行います。readonlyは、基本的に読み取り専用の定数として扱うことを示しています。readonlyを使用します。7行目ではDataBaseManagerのコンストラクタを作成し、Resources.Load()メソッドを使って、先ほど作成したデータベースアセットを読み込んでいます。10行目以降のGetExampleData()メソッドでは、データベースのidと引数を照らし合わせて、個別のデータベースを選択しています。GetDataBaseValueのソースコード最後に完成したDataBaseManagerにidを投げて、得られたデータベースからパラメータを取得してみます(取得した値をDebug.Log()でコンソール上にさせて確認しています)。Startメソッド内で、DataBaseManagerクラスのGetExampleDataメソッドを呼びだしExample型の変数に代入します。後は、データベース内の好きな値を8行目のように取得可能です。Idが1のデータベースからNameを取得しているまとめScriptableObjectを継承したスクリプトを利用することで、プロジェクト上に存在しなくても、参照可能な情報を用意することが可能になります。これによって実装したデータベースには、値を逐次更新することができないというデメリットがありますが、インスペクタ上で簡単にパラメータを編集できるので、ロジックが単純なゲームの製作の際には有用性が高いと思います。コピーkanizabuzaをフォローするkanizabuzananzo関連記事Ray[Unity]キャラクターとの視線の送りあい前回のレーザービームでなんとなくRayの使い方がわかったので、これを応用して、「視線を送るとキャラクターがこっちを見てくれる」ようなものを作ってみました。Gestureというジェスチャーをインタフェースとして登録できるフリーのアセットがあることを最近知ったので、今回はそれを使って「ジェスチャーで剣を召喚する」ことにチャレンジしてみました。イメージとしては手でなぞった部分に沿...Ray[Unity]視線でキャラクターを動かす相変わらずVRで何を作るべきか思いつかず悩んでいたのですが、そういえばUnityのVRチュートリアルで「視線でキャラクターを動かす」プログラムがあったことを思い出したので、なんとなく実際に再現してみることにしました。※これは前回の記事「VRで使えるシンプルなフラッシュライト作成」の続きです。前回、VR用にフラッシュライトを作ってみたのですが、これを実際に何かしらのプログラムに導入する際に、トリガーボタンが誤反応するといった事態が起こりました。他...Particle[Unity]VRで使えるそれっぽい銃を作りたい~レーザー編~前回Instantiateを使って弾を生成する方式の銃を作りました。今回はそれを少しだけ改変して、他のパターンであるレーザータイプの銃を作っていきます。前回同様Colliderで「握られている」状態を検知しトリガーが引...Ray[Unity]VRでの簡易的なテレポートとりあえずVR開発の一つの目標として色々なVR上での移動方法の作成に挑戦することにしました。今回はその移動方法の一つとしてVRChatなどでよくあるような「ポインターで場所を指定するテレポート」を作ってみました。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。Gesture1Instantiate2light2Particle1Ray4Unity10UnityC#1Unity_Asset1VR7ミニゲーム3アーカイブ2019年10月22019年8月12018年9月12018年7月42018年6月42018年4月1タイトルとURLをコピーしました。