noutarins
@noutarins (nou tarins)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

別のプロジェクトにあるメソッドが使えません。

解決したいこと

UnityとC#、vsです。
別のプロジェクトにあるメソッドを使うためにGetcomponentを使いましたが、使えるメソッドと使えないメソッドがあり、その違いが判らず、困っています。違いと解決方法を教えてください。

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

使いたいメソッドが書いてある方

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ItemManager : MonoBehaviour
{

    // アイテムデータベース
    [SerializeField]
    private ItemDataBase itemDataBase;
    // アイテム数管理
    private Dictionary<WeponDate, int> numOfWepon = new Dictionary<WeponDate, int>();
    private Dictionary<AccesaryDate, int> numOfAccessory = new Dictionary<AccesaryDate, int>();
    private Dictionary<ProtectDate, int> numOfProtect = new Dictionary<ProtectDate, int>();
    private Dictionary<OtherItemDate, int> numOfOtherItem = new Dictionary<OtherItemDate, int>();

    // Use this for initialization
    void Start()
    {



        //任意のアイテム番号の、アイテムの個数を設定する関数。


        void SetWeponNumber(int objectnumber, int numofwepon)
        {
            numOfWepon[GetWeponByNumber(objectnumber)] = numofwepon;
        }

    }



    // 名前でアイテムを取得
    public WeponDate GetWepon(string searchName)
    {
        return itemDataBase.GetWeponLists().Find(itemName => itemName.GetItemName() == searchName);
    }
    //serch by number
    public WeponDate GetWeponByNumber(int searchNumber)
    {
        return itemDataBase.GetWeponLists().Find(objectNumber => objectNumber.GetobjectNumber() == searchNumber);
    }



}

メソッドを呼び出すほう

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CreateSlotScript : MonoBehaviour
{

    private void Start()
    {
        GetComponent<ItemManager>().GetWeponByNumber(1010101);
    }




    void Update()
    {

    }
}

この時、GetWeponと、GetWeponByNumberメソッドは呼び出せるのですが、
SetWeponNumberは候補に出てこないため、呼び出せません。解決策を教えてください。

0

1Answer

SetWeponNumberメソッドが、Startメソッド内で宣言されているから。
これはローカル関数と呼ばれるもので、宣言したメソッド内だけで使用したい場合に用いられるものです。

今回の目的は、他プロジェクトから呼びたいと言うことなので、Startメソッドから出してItemManagerクラスに定義すれば使えるようになるはず。

1Like

Comments

  1. @noutarins

    Questioner

    外側に出したら呼び出せました!本当にありがとうございます。
    しかし重ねて質問なのですが、メソッドを呼び出すほうで、startメソッド内でしか呼び出せません。こちらの問題の原因もわかりますでしょうか?
    メソッドを呼び出すほうで
    public void caller()
    {
    GetComponent<ItemManager>().GetWeponByNumber(1010101);
    GetComponent<ItemManager>().SetWeponNumber(1010101, 1);
    }

    のようにしたら、呼び出せました、これはつまり、Getcomponentメソッドは何かほかのメソッドの中でしか使えないということなのでしょうか?
  2. Getcomponent メソッドは MonoBehaviorで定義されたメソッドなので、MonoBehaviorの派生クラスで定義したメソッド内でしか使えない。
    (ということを聞きたいのか意図がよく掴めない・・・)
  3. @noutarins

    Questioner

    なるほど、わかりました。
    ありがとうございます

Your answer might help someone💌