//tips
//クラス型 検証
参考として、シーン内に二人のprefabから生成したプレイヤーにアイテムを取得させ、各プレイヤーが保有するインベントリにアイテムを保持させる形を考えていく。
まずはprefabにするPlayerを作成する。移動スクリプトをアタッチし、Inventoryを追従して表示させるためのスクリプトをかく。
Screen Space – Overlayを使用した場合、UIの位置をキャラクターに合わせて変化させるために、キャラクターのワールド座標をスクリーン座標に変換してからUIに教える必要がある。
下記をPlayerの子要素にしたcanvasのInventoryにアタッチする。
using UnityEngine;
public class UIController : MonoBehaviour
{
[SerializeField]
private Transform targetTfm;
private RectTransform myRectTfm;
private Vector3 offset = new Vector3(-3f, 0, 0);
void Start()
{
myRectTfm = GetComponent<RectTransform>();
}
void Update()
{
myRectTfm.position
= RectTransformUtility.WorldToScreenPoint(Camera.main, targetTfm.position + offset);
}
}
このCameraを使用した描画ではz軸で前後関係を作ることはできないので、空間を固定するWorld Spaceの場合も考える。
using UnityEngine;
public class UIController_WorldSpace : MonoBehaviour
{
private RectTransform myRectTfm;
void Start()
{
myRectTfm = GetComponent<RectTransform>();
}
}
このプレイヤーをシーンに複製しても、インベントリーが対応できるようにInventoryに修正を加えていく。
ここで便利なのがprefabを選択した状態で右クリックするとunpack prefab completelyというボタンを使うことで瞬時にprefabを解除し、別の形に生成し直すことができる。
ここからはInventoryスクリプトとInventoryUIスクリプトの修正に入るが、下記点はいまだに疑問点として残っていることを忘れない。
Inventoryスクリプトの疑問点
・instance = this; 及びpublic static Inventory instance;で、newやinstanceの代わりにInventoryインスタンスを生成しているのか
・InventoryUI = GetComponent<InventoryUI>(); の箇所でInventoryUIのインスタンスは生成されていないがアクセスできるのはなぜか。
InventoryUIスクリプトの疑問点
・なぜ型を宣言しなくてもInventory.instance.items.Countが使用できるのか
Inventory,InventoryUI,CubeDスクリプトの修正版を作成していく。
まず一番シンプルで起点となっているCubeDのスクリプトから見ていく。
現在はInventory.instance.Add(item);と共有のInventory.instanceに対して処理を行なっていたので、個別のインベントリの内容に変更を加えられるようにCollider otherの接触情報を活用して接触者のインベントリという形に書き換えていく。
1.Playerがcubeと接触
2.cubeのCubeDスクリプトのOnTriggerEnter(Collider other)が発動
3.OnTriggerEnter(Collider other)の情報をもとにotherのインベントリーにアクセスし、items.Add(item);。
4.同時にインベントリはオブジェクトではないためシーンに表示させるためにはInventoryUIにslots[i]情報にアクセスさせ、アイテム画像を付加する必要がある
現在はprefabでinventoryを生成するのではなく、既にインベントリー上にある状態で進めているが、3の実体のないインベントリーがcubeからアクセスできず頓挫中。