[unity]'XXX' is inaccessible due to its protection level

今までアクセスできていたクラス、メソッドにアクセス出来なくなった…。
原因は2つ考えられます。

初心者がやりがちなパターン

クラスやメソッド、プロパティに public を付け忘れ、別のクラスから呼ぼうとした場合このエラーになります。
Visual Studio では ClassA.CallFunc() はアクセスできない保護レベルになっています。と日本語でエラーになっていると思います。

public static void CallFunc() にするとエラーは出なくなります。

なぜつける必要があるかについては C# のルールですので、これを機に勉強するといいかもしれません。

ClassA

using UnityEngine;

public class ClassA : MonoBehaviour
{
    // これのせいでエラーになる
    static void CallFunc()
    {
      Debug.Log("Function Called.");
    }
}

ClassB

using UnityEngine;

public class ClassB : MonoBehaviour
{
    void Start()
    {
        ClassA.CallFunc();
    }
}

中級者がハマりがちなパターン

中級者の場合 public 付け忘れはまず考えられないと思いますが(protected や internal はワンチャン…?)、Assembly Definition でやらかしてしまう事があります。

この場合、2つのエラーメッセージを確認しました。

エラーその1

The type or namespace name 'ClassA' could not be found (are you missing a using directive or an assembly reference?)

こちらの方が直球のメッセージなのでわかりやすいですね。
Visual Studio 側では Assembly Definition を認識していないせいか、ちょっと見当違いのエラーメッセージになります。

エラーその2

'ClassA' is inaccessible due to its protection level

タイトルと同じく、こちらのエラーが出る場合もあるようです。なぜエラーその1にならないのかについては正直よくわかりませんでした…。

対処法

AssemblyB AssemblyA を参照する必要があるので、インスペクタで参照設定を行います。

Assembly Definition Referenses ボタンを押し、AssemblyA をドラッグしてください。
最後に Apply ボタンを押します。

Visual Studio で参照設定するのは無意味ですので、やめましょう。

Assembly Definition を変更するとちょくちょく unity が固まってしまったり、コンパイルに失敗することがあるので、念のためエディタを再起動するといいかもしれません。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA