ロールプレイングビデオゲームを作成していて、統計、プロパティなどをさまざまなアイテムに割 Unity prefabsを使用してこれを実行し、プレハブの個々のコピーの値を変更することはできますが、これはタスクを実行するのに不便な方法です。 まず第一に、この方法は、あなたが大規模なゲームを作ることを計画している場合は、節約する必要があるかもしれない何か、あなたの記憶の多くを使 さらに、ゲーム内のオブジェクトに変更を加える必要がある場合、プレハブのコピーがいくつかある場合、それを行うのは効率的ではありません。 これは特に、より大きなチームで作業する場合に問題になるため、他のチームメンバーの変更を容易にしたいと思うでしょう。 あなたがチームにいなくても、この方法はあなたが働くにつれてあなたにとって難しいでしょう。
このような状況で物事を容易にするために、あなたの処分でスクリプト可能なオブジェクトを持っています。 スクリプト可能なオブジェクトとは何ですか? 簡単に言えば、それらはデータコンテナです。 Unity開発者は、これらのコンテナの基本的なテンプレートを作成し、各オブジェクトに含める情報を定義します。 次に、そのテンプレートからScriptableオブジェクトが作成され、Unityゲームオブジェクトによって使用されます。 上記の例では、単一のScriptableオブジェクトを使用して、項目のさまざまなプロパティを定義できます。 次に、そのScriptableオブジェクトは、アイテムのすべてのコピーによって参照されます。 以前は、アイテムの統計情報を変更する場合は、アイテムのすべてのコピーの値を変更する必要がありました。 Scriptableオブジェクトを使用すると、1つのオブジェクト(Scriptableオブジェクト)を変更するだけで、そのScriptableオブジェクトからデータを取得するすべてのオブジェク
これらのことを実際に見て、新しいプロジェクトを作成することは常に役に立ちます。 このプロジェクトでは、スクリプト可能なオブジェクトと、それらがどのように役立つかを示しています。 このプロジェクトは、3つのキャラクターを表すための3つのゲームオブジェクトで構成されています。 各文字は、スクリプト可能なオブジェクトからいくつかの値を継承します。 これらの値は、最大ヘルス、攻撃、防御、速度、および文字の名前と色です。 単純なユーザーインターフェイスにはこれらの値が表示されるため、スクリプト可能なオブジェクトを適用した結果を簡単に確認できます。 今、あなたは最終的な目標を持っていることを、それは作成を取得する時間です。
Project Setup
これらのアイデアを新しいプロジェクトに実装すると仮定して、Unity Hubアプリケーションを開き、図1に示すように新しいプロジェクトを作成し
図1:新しいプロジェクトの作成
次のウィンドウで、プロジェクトに任意の名前を付け、ファイルパスを決定します。 このプロジェクトは任意のテンプレートで実行できますが、この例では図2に示すように3Dプロジェクトテンプレートを使用します。 それはあなたが一緒にフォローしたい場合は、このテンプレートを使用することをお勧めします。
図2:プロジェクト名、タイプ、および場所の設定
プロジェクトが作成されたら、整理したいと思うでしょう。 Assetsウィンドウで、図3に示すように、ウィンドウを右クリックしてCreate->Folderに移動して、3つのフォルダを作成する必要があります。Materials、Scriptable Objects、およびScriptsというフォルダに名前を付けます。
図3: 新しいフォルダを作成する
あなたがここにいる間、それは先に行くと三つの材料を作って取得することをお勧めします。 これらのマテリアルは、スクリプト可能なオブジェクトが指定したマテリアルに続いて、異なるオブジェク これらのマテリアルを作成するには、Materialsフォルダに移動して再度右クリックし、今回はCreate->Materialを選択します。 素材に名前を付けるときは、その色と相関する名前を付けることをお勧めします。 例えば、この最初の材料は赤という名前にすることができます。 この色を設定するには、新しく作成されたマテリアルを選択し、”インスペクタ”ウィンドウに移動する必要があります。 [Albedo]フィールドには、図4に示すカラーピッカーがあり、クリックしてカラーピッカーを開くことができます。
図4:カラーピッカーを開く
カラーピッカーで小さな円を動かすか、カラーピッカーウィンドウの下半分にRGB値を直接入力することによって、色が変更されます。 上記の例では、RGB値は255,0,0になります。 その後、さらに2つのマテリアルを作成し、その色を割り当てる必要があります。 この例では、緑と青を使用しますが、任意の色にすることができます。
今、このゲームが行われる実際のシーンを作成する時間が来ます。 これは、二つの主要な部分で構成されています–様々なスクリプト可能なオブジェクトに与えられた統計情報と文字を表す三つのカプセルを表示す 「文字」は最も簡単な部分なので、そこから始めることができます。 Hierarchyウィンドウに移動し、Createボタンをクリックして、図5に示す3D Object->Capsuleを選択するだけです。 これを3回行うか、最初のオブジェクトをコピーし、必要に応じて名前を付けることもできます。 この例では、カプセルにChar1、Char2、Char3という名前を付けます。
図5:capsuleオブジェクトの作成
位置を変更する必要があるため、互いに重ならないようにします。 オブジェクトの位置を変更するには、階層内のオブジェクトを選択し、インスペクタでトランスフォームコンポーネントに移動します。 次に、x、y、およびzの位置決めフィールドを変更して、オブジェクトを必要な場所に移動します。
図6: オブジェクトの位置の編集
表1は、この例の3つのカプセルすべての正確な位置を示しています。
表1: 世界のすべてのオブジェクトとその位置
オブジェクト |
Xの位置 |
Y位置 |
Zポジション |
チャー1 |
|||
チャー2 |
|||
チャー3 |
もちろん、ご希望の場合は、これらの数字のいずれかを調整して自由に感じます。 次は、スクリプト可能なオブジェクトに与えられた値を表示するユーザーインターフェイスです。 開始するには、階層の[作成]ボタンをクリックする必要がありますが、今回はUI->Canvasを選択します。 次に、新しいキャンバスオブジェクトを選択した状態で、再度作成ボタンをクリックし、今回は空の子を作成を選択します。 最後に、もう一度作成ボタンをクリックし、今回はUI->Textを選択します。 新しく作成したテキストオブジェクトを空のゲームオブジェクトにドラッグし、Ctrl+Dを使用してテキストを4回複製して、GameObjectの下に合計5つのテキ これが完了すると、階層は図7のようになります。
図7:現在の階層
各テキストオブジェクトは、Scriptableオブジェクトを介して指定された名前と統計に相関し、それらの統計はmaximum health、attack、defense、およびspeedです。 テキストオブジェクト名を表す値に変更すると便利です。 したがって、最初のテキストオブジェクトはname_textと呼ぶことができ、2番目のテキストオブジェクトはattack_textと呼ぶことができます。 さらに、ユーザーインターフェイスがどのように見えるかを視覚的に提供するために、デフォルトのテキストを変更する必要があります。 これは、インスペクタのテキストコンポーネントに移動し、テキスト値を変更することによって行われます。 そして最後に、それらがすべてお互いの上に積み重ねられないように位置を調整します。 これを簡単にするために、表2はすべての異なるオブジェクト名とそれぞれの値を示しています。
表2:すべてのテキストオブジェクトとそのデフォルトのテキストと配置値
GameObject(Canvasの下)の名前をChar1Descriptionなどのもう少し説明的な名前に変更し、親オ 2つの重複の名前をChar2DescriptionとChar3Descriptionに変更し、3つのオブジェクトを配置して、カプセルオブジェクトの上に配置します。 この例では、Char1Descriptionを-300のX位置に、Char2Descrptionを0に、Char3Positionを250に配置します。 すべてのYおよびZ位置の値は0のままです。
ちょっと長い道のりでしたが、プロジェクトのセットアップは完了です! プログラミングが進むにつれて、スクリプト可能なオブジェクトがどのように作成されるかをコード化して確認する時が来ました。 Assetsウィンドウで、Scriptsフォルダーに移動し、右クリックしてCreate->C#Scriptに移動して、2つの新しいスクリプトを作成します。 これらのスクリプトは、CharStatsとLoadStatsと呼ばれる必要があります。 これらが作成されたら、CharStatsスクリプトで開始するので、このスクリプトをダブルクリックしてVisual Studioを開き、コーディングプロセスを開始します。
CharStats Script
スクリプト可能なオブジェクトを作成するには、まずマテリアルとスクリプトの作成に使用したCreate
メニューに追加する必要があります。 これを行うには、属性CreateAssetMenu
を使用し、メニュー内のデフォルトのファイル名と場所を指定します。 また、継承元のクラスCharStats
を変更する必要があります。 デフォルトでは、Unityプロジェクト内のすべてのC#クラスはMonoBehaviour
から継承されますが、このスクリプトは代わりにScriptableObject
から継承する必要があります。
menuName
を設定すると、サブメニューの使用を示すスラッシュ文字が使用されることに注意してください。 あなたがしたい場合は、スラッシュを削除し、単に作成メニューをさらにナビゲートすることなく、プレイヤーユニットオプションが存在することがで この場合、サブメニューは主に、スクリプト可能なオブジェクトを任意の方法で整理できることを示すために追加されました。 この場合、メニューはCreate->Character Creation->Player Unitsです。 必要に応じて、別のスクリプト可能なオブジェクトで、同じパスからオブジェクトを作成できますが、Itemなどの異なる作成オプションを使用できます。
スクリプト可能なオブジェクトであるため、デフォルトのStart
メソッドとUpdateメソッドは必要ないため、それらを削除できます。 このオブジェクトの主な目的は、別のオブジェクトに与えられたデータを保持することですが、スクリプト可能なオブジェクトがデータを保持するだけではなく、どのように行うことができるかを示すために、2つのカスタムメソッドも作成されています。 データといえば、このオブジェクトが保持するデータを定義するためのコードは次のようになります:
1
2
3
4
5
6
|
パブリック文字列charName;
パブリックint攻撃;
パブリックint防衛;
パブリックint速度;
パブリックint maxHealth;
パブリックマテリアルnewColor;
|
前述のように、各スクリプト可能オブジェクトには、4つの異なる統計の名前といくつかの値が含まれています。 また、スクリプト可能なオブジェクトが適用された後の文字の新しい色に関する情報も保持します。 それぞれの値はUnityエディターで定義されており、もちろん、作成されたオブジェクトごとに異なります。
二つの方法はシンプルに保たれています。 一つは、単に文字がロードされたことを示すメッセージをデバッグコンソールに出力します。 このメッセージは、LoadStats
スクリプトのStart
メソッドで出力されます。
1
2
3
4
|
パブリックボイドPrintMessage()
{
デバッグ。Log(“”+charName+”文字がロードされました。”);
}
|
RandomizeStats
, 第二の方法は、名前が示すように正確に行います。 Scriptableオブジェクトの値を1~20の間の乱数に変更します。 後で、新しい値を使用してユーザーインターフェイスを自動的に更新するようにプロジェクトをプログラムします。 しかし、それは最も興味深い部分でさえありません! つまり、ゲームが終了するまで、セッションでは同じままになります。 これは、通常は古いオブジェクトが削除され、新しいシーンが開かれると新しいオブジェクトがリロードされるため、複数のシーンで構成されるゲームを作 ただし、シーン間の移行では、スクリプト可能なオブジェクトデータは変更されません。 さらに、Unityエディターで作業している間は、エディター自体が閉じられるまでデータは同じままになります。 つまり、エディタからゲームを実行している間にスクリプト可能なオブジェクト内のデータに加えられた変更は、データ自体に変更が加えられない限り、
これがCharStatsスクリプトにあるすべてです。 それはかなり単純に見えるかもしれませんが、プロジェクトは完了していません。 独自のメソッドとデータを使用してスクリプト可能なオブジェクトを作成する機能をプログラムしましたが、capsuleキャラクタはこれらのオブジェク 彼らが懸念している限り、スクリプト可能なオブジェクトは存在しません。 これを修正するには、Loadstatsスクリプトを開き、オブジェクトがスクリプト可能なオブジェクトのデータを使用してユーザーインターフェイスを更新し、色を変 コードは図8のようになります。
図8:完全なCharStatsスクリプト
LoadStatsスクリプト
このスクリプトが継承するクラスの場所を変更する心配はありません。 デフォルトのMonoBehaviour
は正確に必要なものです。 代わりに、先頭に新しいusingステートメントを含めます。
1
|
UnityEngineを使用します。UI;
|
これを含めると、ユーザーインターフェイスからテキストを取得し、スクリプト可能なオブジェクトにある値を表示するように更新できます。 さて、クラス自体に、変数で始まります。
1
2
3
4
5
6
7
8
|
// scriptable object
public CharStats charStat;
public Text nameText;
public Text attackText;
public Text defenseText;
public Text speedText;
public Text maxHealthText;
public MeshRenderer currentColor;
|
コメントに記載されているように、charStat
変数は使用されるスクリプト可能なオブジェクトです。 ここでは、これらのスクリプト可能なオブジェクトを取得することは、他の変数を宣言することと変わらないことがわかります。 スクリプトの後半では、オブジェクト内の変数とメソッドを取得し、このスクリプトでそれらを使用します。 実際、CharStats
にあるPrintMessage
メソッドは、現在LoadStats
Start
メソッドで使用されています。
1
2
3
4
5
|
ボイドスタート()
{
DisplayStats();
charStat.PrintMessage();
}
|
他の外部スクリプトと同様に、charStat
の後にPrintMessage
を呼び出して、そのスクリプト可能なオブジェクトで見つかったメソッドを取得するだけです。 これは、すべてが類似または同一の動作を持つオブジェクトがある場合に特に有用であることが証明されます。 この場合、この例のように、デバッグコンソールにメッセージを印刷することも、開発者にとって役立ちます。 何か問題が発生し、スクリプト可能なオブジェクトに障害があると疑われる場合は、デバッグコンソールメッセージを使用して問題を見つけることがで
今、DisplayStats
が存在しないというエラーがあります。 これを修正するには、Update
メソッドの下に移動し、このコードを追加します。
ここでは、Scriptableオブジェクトに格納されている値が再生されます。 以前に宣言されたすべてのテキスト変数? 表示するデータが与えられるので、エディタで設定した疑問符にはいくつかの値が表示されるようになりました。 また、実際には統計ではありませんが、currentColor.material
を呼び出してScriptableオブジェクトに設定されたmaterialに設定することで、文字の色が変更されます。
2番目のcharStats
メソッドRandomizeStats
はまだ使用されていないので、その場所を見つける必要があります。 Update
メソッドでは、プログラムはスペースバーが押されているかどうかをチェックします。 それがあれば、RandomizeStats
を呼び出し、Scriptableオブジェクトにいくつかの新しい値を与えます。 その後、DisplayStat
が再び呼び出され、新しい値が表示されます。
1
2
3
4
5
6
7
8
|
ボイド更新()
{
if(入力します。GetKeyDown(KeyCode.スペース))
{
チャーシュタットRandomizestats();
DisplayStats();
DisplayStats()();
}
}
|
これでLoadStats
スクリプトが終了し、このプロジェクトのコーディング部分が終了します。 コードは図9のようになります。 ここでは、スクリプト可能なオブジェクトをいくつか作成し、LoadStats
を使用してカプセルオブジェクトに適用し、この新しい機能を試してみるだけです。 もちろん、Unityエディターに戻る前に作業内容を保存してください。
図9:Loadstatsスクリプトの完了
プロジェクトの完了
スクリプト可能なオブジェクトを使用するには、まずそれらを作成する必要があります。 図10に示すように、AssetsウィンドウのScriptable Objectsフォルダの下で右クリックし、Create->Character Creation->Player Unitsに移動します。
図10: 新しいプレーヤーユニット、スクリプト可能なオブジェクトの作成
オブジェクトには任意の名前を付けることができます。 この例では、これらのオブジェクトを従来のロールプレイングゲームクラスに基づいているため、戦士、ハンター、メイジがあります。 新しいオブジェクトを選択し、”インスペクタ”ウィンドウに移動して、さまざまなフィールドに値を指定します。 新しいカラーフィールドに入力するには、Materialsフォルダに移動し、図11に示すように、目的のマテリアルをクリックしてフィールドにドラッグします。
図11: オブジェクトの新しいカラー素材を設定する
さらに二つのスクリプト可能なオブジェクトを作成し、以前と同じようにして、異なるフィールドに異なる値を与えます。 それが完了したら、階層ウィンドウに移動し、charオブジェクトのいずれかを選択します。 次に、図12に示すように、AssetsウィンドウのScriptsフォルダに移動し、LoadStatsを検索し、Inspectorウィンドウにドラッグして、loadstatsスクリプトをコンポーネントとして指定します。
図12:オブジェクトへのLoadStatsスクリプトのアタッチ
次に、LoadStatsフィールドを入力する必要があります。 まず、最初の”character”で使用するスクリプト可能なオブジェクトを見つけて、図13に示すようにChar Statフィールドに適用します。 スクリプト可能なオブジェクトは、”アセット”ウィンドウの”スクリプト可能なオブジェク
図13:スクリプト可能オブジェクトChar1がデータ
を取得する場所を設定すると、テキストフィールドに入力されます。 階層では、キャンバスを展開した後、現在編集している文字記述オブジェクトと相関する文字記述オブジェクトを展開します。 たとえば、Char1を編集すると、Char1Descriptionを展開する必要があります。 次に、親オブジェクトの下にあるテキストオブジェクトを取得し、図14に示すように対応するフィールドに適用します。
図14:すべてのテキストフィールドの設定
テキストフィールドが塗りつぶされたら、オブジェクトのメッシュレンダラーを取得するだけで、マテリアル インスペクタウィンドウでメッシュレンダラーコンポーネントをクリックしてドラッグし、図15のように現在のカラーフィールドにドラッグするだけです。
図15: 現在のカラーフィールドを設定する
他の二つの文字オブジェクトについて前のいくつかの手順を繰り返すと、プロジェクトが完了します。 準備ができたら、エディタの上部にある再生ボタンをクリックし、三つのほぼ同一のオブジェクトには、それらに接続されている非常に異なる値を持 何らかの理由で何かが正しく見えない場合は、最初にチェックする場所はスクリプト可能なオブジェクトであり、表示される値と色が必要なものであることを確認します。 新しい色フィールドも再確認することを忘れないでください。
これらの数字と色はすべてスクリプト可能なオブジェクトから来ており、それ自体は単一のテンプレートから来ています。 さらにスクリプト可能なオブジェクトを作成し、オブジェクトのLoad StatsコンポーネントのChar Statフィールドにプラグインして、非常に異なる文字を持つこと ゲームの実行中(図16)に、デバッグコンソールの左下隅に、キャラクタがロードされたことを示すメッセージが表示されます。 他に2つのメッセージがありますが、完全なデバッグコンソールを開かないと、1つのメッセージしか表示できません。 また、あなたの文字のためのいくつかの完全に新しい統計情報を取得するには、スペースバーを押すことができます。 ゲームを停止してから再実行すると、ランダムに生成した値が持続し、スクリプト可能なオブジェクトの永続性が示されます。 オブジェクトに値を手動で入力するか、エディタを閉じて再度開くことによって、元の値に戻ります。
図16:動作中のスクリプト可能オブジェクト
結論
当然、多くのタイプのオブジェクトに対して複数のタイプのスクリプト可能オブジェクトを作成 この例では、文字クラスを介しての使用を示しましたが、前述のitemsの例もあります。 それも、このようなアーケードゲームで見つかったものを連想させるパワーアップなど、はるかに小さなオブジェク スクリプト可能なオブジェクトを使用すると、クリーンで簡単なシステムを作成し、いくつかのキーストロークでデータを変更してロードし、結果をほぼ瞬時に また、複数のオブジェクトに対して1つのテンプレートを使用できるため、スクリプト可能オブジェクトを使用すると、作成するスクリプトの数が少なくなります。 プロジェクトが大きいか小さいか、チームに多くのメンバーがいるか、自分だけがいるかにかかわらず、スクリプト可能なオブジェクトは、すべての人の開発を少し楽にすることができます。