Unity

【Unity】他オブジェクトのスクリプトのメソッドがどうしても取ってこれない原因と対処法

投稿日:

概要

Unityでほかのスクリプトで定義されているObjectを取ってきたいシーンがありました。がVisual Studioでどうしても認識してくれず、かなり悩みましたのでその対処法についてメモします。

環境

Windows10
Unity 2020.1f.1


まず最初に確認すべきこと

他のゲームオブジェクトにアタッチされているスクリプトのメソッドを別のスクリプト内で呼び出して使用したい場合に、まず確認すべき事項として以下があります。

  • 取得元のclassがpublic classで宣言されているか
  • 取得元のclassで定義されているメソッドがpublicで宣言されているか

上記の条件を満たした上で以下の流れでコードを書けば問題なく呼び出すことができるはずです。

  • 取得したいスクリプトがアタッチされているオブジェクトをGameObject.Findなどで指定して取得する。
  • 取得したGameObjectのclassをGetComponentで取得する
  • 取得したclass.メソッド名で使用する

参考になったサイト

https://htsuda.net/archives/1702

しかし、何故か私のが触っていたスクリプトでは上手くいかず、Visual Studioが他オブジェクトのメソッドを認識せず、メソッドが見つからないというエラーが出っぱなしでした。



結論:名前空間を指定していなかった

なぜ認識してくれなかったか。

結論から言うと、classの上位で 名前空間(NameSpace)が宣言されていたにも関わらず、名前空間を指定していなかった ということが原因でした。

上位側で名前空間が定義されている場合、名前空間から指定しないとちゃんと相手先のclassやメソッドを認識してくれません。


エラーの実例

実例を踏まえて解説します。

まず、3D ObjectとしてSphere1とCube1というものを作成します。

Sphere1には以下のスクリプトをアタッチしてあるとします。このスクリプトは呼び出される側のスクリプトとします。

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

namespace TestNamespace
{
    public class OtherClass : MonoBehaviour

    {
        public void TestMethod()
        {
            Debug.Log("This is from other class");
        }

        // Start is called before the first frame update
        void Start()
        {

        }

        // Update is called once per frame
        void Update()
        {

        }
    }

}


次にCube1オブジェクトには以下のスクリプトをアタッチするとします。

これはSphere1にアタッチされているスクリプトからTestMethodを呼び出して使用するスクリプトです。

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

public class ThisClass : MonoBehaviour
{

    GameObject sphereObj;
    OtherClass otherClass;
    // Start is called before the first frame update
    void Start()
    {
        sphereObj = GameObject.Find("Sphere1");

    }

    // Update is called once per frame
    void Update()
    {
        otherClass = sphereObj.GetComponent<OtherClass>();
        otherClass.TestMethod();
    }
}

しかし、この時、Visual StudioではOtherClassを認識してくれてておらず、赤の波線がでています。当然このままコンパイルしてもこのオブジェクトは宣言されてません的なエラーが発生します。


原因

この原因はSphere1側にアタッチしたスクリプトで名前空間を定義しているからです。

namespace TestNamespace //これが名前空間
{
    ...
}

この場合は呼び出す側のスクリプトでも名前空間から指定してあげないといけません。具体的には以下のような形です。

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

public class ThisClass : MonoBehaviour
{

    GameObject sphereObj;
    TestNamespace.OtherClass otherClass; //名前空間から指定
    // Start is called before the first frame update
    void Start()
    {
        sphereObj = GameObject.Find("Sphere1");
        
    }

    // Update is called once per frame
    void Update()
    {
        otherClass = sphereObj.GetComponent<TestNamespace.OtherClass>();
        otherClass.TestMethod(); //名前空間から指定
    }
}


ちゃんと認識された。


まとめ

UnityでCreateからC#を作ると普通は名前空間が定義されていないため意識しないですが、他から持ってきたスクリプトなどでは名前空間が定義されていることがあります。そのような場合は名前空間からオブジェクトを指定する必要があります。C#に精通している人なら当たり前のことかもしれませんが、Unity初心者の私は少しハマってしまいました…

-Unity

執筆者:


comment

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

関連記事

【Unity】キャラクターにSimpleAnimationでアニメーションをつける

Contents1 概要2 環境3 使用するキャラクタオブジェクト4 Step1 : Animationの 入手5 Step2 : SimpleAnimationの取得6 Step3 : Inspec …

【Unity】Standard Assetsでサクッと人間をキー操作する

Contents1 目的2 環境3 STEP:1 地面(Terrian)の作成4 STEP:2 キャラの設置5 STEP:3 スクリプトのアタッチ6 STEP:4 Inspectorの設定7 STEP …

【Unity】error CS0619:’GUIText’ is obsolete:’GUIText has been removed. Use UI.Text instead.’が出た時の対処法

Contents1 目的1.0.1 2020/9 追記2 環境3 発生現象4 対処方法 目的 UnityでC#スクリプトを記述してゲームオブジェクトにAttachしようとしたときにerror CS06 …

【Unity】 キーボードでキャラクターを操作する

Contents1 概要2 環境3 目的4 Step1 : コンポーネント類の追加4.1 Rigidbodyの追加4.2 Colliderの追加5 Step2 : Main Cameraの設定6 St …

【Unity】一定範囲に入ると追ってくるスクリプト

Contents1 目的2 環境3 完成系4 Step1 : プレイヤーの配置5 Step:2 追いかけてくるオブジェクトの配置6 Step : 3 スクリプトの作成7 Step : 4 動作確認 目 …

言語切り替え

カテゴリー