質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

インスペクタで取得したクラスのフィールドにアクセスできない。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 197

mentanpinsan

score 17

前提・実現したいこと

GameObjectはAudioとLineです。
Lineにアタッチしたスクリプト(KochLine)からAudioにアタッチしたスクリプト(Audio2)のフィールド(_audioBandBuffer)にアクセスしたい。

発生している問題・エラーメッセージ

NullReferenceException: Object reference not set to an instance of an object
KochLine.Update () (at Assets/KochLine.cs:38)

Assets\KochLine.cs(14,21): warning CS0649: Field 'KochLine._lerpAudio' is never assigned to, and will always have its default value null

該当のソースコード

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

[RequireComponent(typeof(LineRenderer))]
public class KochLine : KochGenerator
{
    // Start is called before the first frame update
    LineRenderer _lineRenderer;
    // [Range(0, 1)]
    // public float _lerpAmount;
    Vector3[] _lerpPosition;
    public float _generateMultiplier;
    private float[] _lerpAudio;

    [Header("Audio")]
    public Audio2 _audio;
    public int[] _audioBand;

    void Start()
    {
        _lineRenderer = GetComponent<LineRenderer>();
        _lineRenderer.enabled = true;
        _lineRenderer.positionCount = _position.Length;
        _lineRenderer.SetPositions(_position);
        _lerpPosition = new Vector3[_position.Length];

    }

    // Update is called once per frame
    void Update()
    {
        if (_generationCount != 0)//eveyframe
        {
            int count = 0;
            for (int i = 0; i < _initiatorPointAmount; i++)
            {
                _lerpAudio[i] = _audio._audioBandBuffer[_audioBand[i]];
                for (int j = 0; j < (_position.Length - 1) / _initiatorPointAmount; j++)
                {

                    _lerpPosition[count] = Vector3.Lerp(_position[count], _targetPosition[count], _lerpAudio[i]);
                    count++;
                }
                // _lerpPosition[i] = Vector3.Lerp(_position[i], _targetPosition[i], _lerpAmount);
            }
            _lerpPosition[count] = Vector3.Lerp(_position[count], _targetPosition[count], _lerpAudio[_initiatorPointAmount - 1]);

            if (_useBezierCurves)
            {
                _bezierPosition = BezierCurve(_lerpPosition, _bezierVertexCount);
                _lineRenderer.positionCount = _bezierPosition.Length;
                _lineRenderer.SetPositions(_bezierPosition);
            }
            else
            {
                _lineRenderer.positionCount = _lerpPosition.Length;
                _lineRenderer.SetPositions(_lerpPosition);
            }
        }


    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(AudioSource))]
public class Audio2 : MonoBehaviour
{
    AudioSource _audioSource;
    public float[] _samples = new float[512];
    public float[] _freqBand = new float[8];
    public float[] _bandBuffer = new float[8];
    float[] _bufferDecrease = new float[8];
    float[] _freqBandHighest = new float[8];
    public float[] _audioBand = new float[8];//0-1
    public float[] _audioBandBuffer = new float[8];

    // Start is called before the first frame update
    void Start()
    {
        _audioSource = GetComponent<AudioSource>();
    }

    // Update is called once per frame
    void Update()
    {
        GetSpectrumAudioSource();
        MakeFrequencyBands();
        BandBuffer();
        CreateAudioBands();
    }

    void CreateAudioBands()
    {
        for (int i = 0; i < 8; i++)
        {
            if (_freqBand[i] > _freqBandHighest[i])
            {
                _freqBandHighest[i] = _freqBand[i];
            }
            _audioBand[i] = (_freqBand[i] / _freqBandHighest[i]);
            _audioBandBuffer[i] = (_bandBuffer[i] / _freqBandHighest[i]);
        }
    }

    void GetSpectrumAudioSource()
    {
        _audioSource.GetSpectrumData(_samples, 0, FFTWindow.Blackman);
    }

    void BandBuffer()
    {
        for (int g = 0; g < 8; g++)
        {
            if (_freqBand[g] > _bandBuffer[g])
            {
                _bandBuffer[g] = _freqBand[g];
                _bufferDecrease[g] = 0.005f;
            }
            if (_freqBand[g] < _bandBuffer[g])
            {
                _bandBuffer[g] -= _bufferDecrease[g];
                _bufferDecrease[g] *= 1.05f;
            }
        }
    }

    void MakeFrequencyBands()
    {
        int count = 0;
        for (int i = 0; i < 8; i++)
        {
            float average = 0;
            int sampleCount = (int)Mathf.Pow(2, i) * 2;
            if (i == 7)
            {
                sampleCount += 2;
            }
            for (int j = 0; j < sampleCount; j++)
            {
                average += _samples[count] * (count + 1);
                count++;
            }

            average /= count;

            _freqBand[i] = average * 10;

        }
    }
}

試したこと

エラーのKochLine.cs:38の該当箇所は
_lerpAudio[i] = _audio._audioBandBuffer[_audioBand[i]];
です。
LineオブジェクトのインスペクタにはAudioをドラッグアンドドロップしています。

補足情報(FW/ツールのバージョン)

unity最新版です。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

KochLineの_lerpAudioが初期化されていないのでは?
Audio2の_audioBandBufferの様に、必要な要素数分配列を確保する必要があります。

例:private float[] _lerpAudio = new float[8];

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/22 21:25

    ありがとうございました。C#に慣れてなくて忘れていました。

    キャンセル

0

エラー発生個所はコードの後ではなくコードの前、エラーの直後に書いて欲しい。上から下に読み進めるように文章を書いて欲しい。

「該当箇所」で null の可能性があるオブジェクトはコードをざっとみると _audio のみです。これくらいは明示しておいて欲しいです。

まず調べるべき事は、エラー発生個所の直前で本当に _audio が null なのかチェックすることです。そして、本当に _audio が null ならば、その gameObject の名前をログに出力しておきます。合わせて Start 関数内で _audio のオブジェクト名もログに出力しておきましょう。

質問者が把握している限り _audio にはオブジェクトをアサインしているはず、とのことですが、それを踏まえても以下のようなケースが考えられます。もちろん他にもあると思います。

  • アサインしておいたオブジェクトが破棄された
  • 全然関係ないオブジェクトに操作ミスで KochLine をアタッチしてしまい、そこには _audio をアサインしていなかった

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/22 21:27

    デバッグの仕方参考になりました。ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る