【Unity】円形の武器メニューを作る #1

投稿者: | 2021-01-25

武器を切り替えられる円形のメニューを作ってみます。今回は取得した武器の画像を円形に並べてみました。

まず、武器メニューのための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); // アイテムを破壊
}

これで取得した武器の画像を円形に表示できました。

コメントを残す

メールアドレスが公開されることはありません。