Unity備忘録47頁目「アイテムの装備」

江上宿六です。

 

アイテムを装備するというのがどういう状態かという事から考えますけど

装備品のメッシュをキャラに身につけさせる、という感じで良いでしょうかね。

もちろん能力値が変動するのであればそういった処理も必要になりますけど

今は別にキャラの方にもパラメータとか置いてないのでスルーです。

 

この辺を実現する為に取る手法ですが、今までの色んな機会でアイコンを

Instantiateしてきたのと同様にメッシュをInstantiateし、想定する位置に配置する

といういつものやつです。

f:id:y6yegami:20190729145416p:plain f:id:y6yegami:20190729152355p:plain

なんの変哲も無いブロードソードを用意しました。 これをキャラの持ち手の

子オブジェクトに設定します。

f:id:y6yegami:20190729151715p:plain → f:id:y6yegami:20190729152709p:plain

そしてキャラの手の位置に配置します。 そうしたらインスペクターから

Transform以外の項目をRemoveComponentで削除してしまいましょう。 

この空になったオブジェクトの子として武器などのメッシュをInstantiateする事で

装備の表示が出来るようになります。 名前もEquipとかに変えておきましょう。

 

この回りくどい方法についてですが、まず見た目で位置や角度を設定出来た方が

簡単だというのと、このEquipを作っておく事でメッシュに対する煩わしい制御を

回避する事が出来たりする事もありますので。

 

スクリプトを書く前にアイテムを定義しておきましょう。 Assets→Createの

CreateItemDataを選択してItemDataを生成して設定し、ItemDataBaseに登録します。

f:id:y6yegami:20190730124424p:plain

f:id:y6yegami:20190730124431p:plain

こんな感じですね。 だいぶ適当です。

f:id:y6yegami:20190731092701p:plain

装備する関数です。 Instantiateするのはアイテムデータに登録されたメッシュです。

ローカルの位置情報とかもちゃんと初期化しておきます。

f:id:y6yegami:20190731094148p:plain

更にこんな感じでインベントリの位置を指定して呼び出せるようにすると便利です。

あとはコマンドから"装備する"を選んだ時にこれを呼べば良いわけです。

f:id:y6yegami:20190731095104p:plain

呼び出し例です。 equipRHはGameObjectで、先ほどのEquipをFindしています。

cursorPosはUIで使ったcursorPosとscrollPosを足したインベントリカーソルの

絶対値なわけですが、紛らわしいのでリネームした方が良さそうですね。

f:id:y6yegami:20190731100723g:plain

ちゃんと武器を手に持ててますね。 ランタンでも同様にアイコンの方ではなく

メッシュの方を持ってくれます。

 

しかしまぁ、ここら辺で考えたり解決したりしなければいけない問題が山積みです。

 

まず装備アイテムをどう扱うか。 装備と同時にインベントリから削除して

データをそのEquipに移すみたいな考えも出来ますけど、多分これは駄目ですね。

単純にデータを参照しにくくなったり、それ用のスクリプトが必要になったり

面倒な事になりそうです。 なのでインベントリから削除せずに"装備中"という

状態でインベントリ内に置いておき、扱うのがベターなんじゃないかなと。

 

そうすると装備中という状態を何処で保持するか。 これはインベントリのリストの

元であるMyInventoryクラスというのが自然でしょうかね、アイテム名、レベル、

数に並べて装備中かどうか。 装備するのと同時にインベントリから削除せずに

そのリストの装備中フラグをtrueにしてやる、という感じで状態は作れそうです。

装備中のアイコンにはEマークを付けてやるとか云々。

 

あと装備品について、今は装備品というタイプしか無いんですけど、これ結局

装備する部位分だけ必要になりますよね、言われてみれば当たり前ですけど。

ドラクエ1でもそうだったくらいの当たり前さでした。

f:id:y6yegami:20190731110843p:plain

あと今回生じた最大とも言える問題なんですけど、武器とかキャラとかの

スケールの問題です。 これは考え無しに進めてきたツケ的な感じもありますが

まぁ、新たに別の記事でこの辺を書きたいと思います。

 

こんな感じですかね、最終的にあんまり自信が無い感じになりましたが。

日を跨いで書いたりしてるので統一感がないのもアレですね。