武器を切り替えられる円形のメニューを作ってみます。今回は取得した武器の画像を円形に並べてみました。
まず、武器メニューのためのCanvasを作って、スクリプトを付けました。
このスクリプトには、武器の追加/削除と、画像の位置を設定するメソッドがあります。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WeaponMenu : MonoBehaviour
{
List<Goods> weapons = new List<Goods>();
static WeaponMenu instance;
public static WeaponMenu GetInstance()
{
return instance;
}
private void Awake()
{
instance = this;
}
public void AddWeapon(Goods goods)
{
weapons.Add(goods);
UpdatePosition();
}
public void RemoveWeapon(Goods goods)
{
if(weapons.Contains(goods))
{
goods.DestroyItem();
weapons.Remove(goods);
UpdatePosition();
}
}
void UpdatePosition()
{
// 画像の間隔
float angle = 360f / weapons.Count;
// 真上の位置
Vector2 pos = Vector2.up * 150f;
foreach (Goods weapon in weapons)
{
// 位置をセット
weapon.SetPosition(pos.x, pos.y);
// 次の位置を時計回りに回転
pos = Quaternion.Euler(0, 0, -angle) * pos;
}
}
}
アイテムを取得した時に、武器ならアイテム画像を上のCanvasの子にしたり、アイテムをインベントリでなく武器メニューのリストに入れます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Inventory : MonoBehaviour
{
// ...
List<Goods> inventory = new List<Goods>();
// アイテムを取得するメソッド
public void Obtain(Obtainable item)
{
// アイテムの存在を確認
if (ItemManager.GetInstance().HasItem(item.GetItemName()))
{
Item itemInfo = ItemManager.GetInstance().GetItem(item.GetItemName());
// ...
// 武器のとき
if (itemInfo.GetIsWeapon())
{
WeaponMenu.GetInstance().AddWeapon(goods);
}
// 武器以外のとき
else
{
inventory.Add(goods);
}
// ...
}
}
// ...
}
武器かどうかはScriptableObjectで設定しておきます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
[Serializable]
[CreateAssetMenu(fileName = "Item", menuName = "CreateItem")]
public class Item : ScriptableObject
{
[SerializeField] string itemName;
[SerializeField] Sprite icon;
[SerializeField] string information;
[SerializeField] bool isWeapon;
public string GetItemName()
{
return itemName;
}
public Sprite GetIcon()
{
return icon;
}
public string GetInformation()
{
return information;
}
public bool GetIsWeapon()
{
return isWeapon;
}
}
参考:https://gametukurikata.com/program/scriptableobjectitemdatabase
リストに入れているスクリプトは、アイテム画像を表示するImageオブジェクトに付いています。そのスクリプトがアイテムのゲームオブジェクトも持っているので、アイテムを削除するときは、Imageとアイテムの両方を削除しています。
// 表示位置をセット
public void SetPosition(float x, float y)
{
RectTransform rt = GetComponent<RectTransform>();
Vector2 pos = rt.anchoredPosition;
pos.x = x;
pos.y = y;
rt.anchoredPosition = pos;
}
public void DestroyItem()
{
Destroy(gameObject); // Imageを破壊
Destroy(itemObject); // アイテムを破壊
}
これで取得した武器の画像を円形に表示できました。