Почему мой аргумент float[] передается, возвращая null

(отредактировано для большего контекста) Когда я передаю плавающие массивы Amplifiers и Frequencies в мои функции, соответствующие аргументы, они передаются как null в функцию. Вот пример кода:

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

[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshCollider))]
public class MeshGenerator: MonoBehaviour
{

    Mesh mesh;

    Vector3[] vertices;
    int[] triangles;
    float[] Amplifiers;
    float[] Frequencies;

    public int xSize = 20;
    public int zSize = 20;
    public int Layers = 1;
    public float Seed = .3f;
    float rNum = 1f;

    void Start()
    {
        mesh = new Mesh();
        GetComponent<MeshFilter>().mesh = mesh;

        CreateShape();
        UpdateMesh();
        float[] Frequencies = new float[Layers];
        float[] Amplifiers = new float[Layers];
        for (int i = 0; i < Layers; i++)
        {
            Amplifiers[i] = Random.Range(1.5f, 2.5f);
            Frequencies[i] = Random.Range(.25f, .4f);
        }
    }
    
    private void Update()
    {
        rNum = Random.Range(1f, 2.5f);
    }

    float TerrainPerlin(int layers, float[] ampArray, float[] freqArray, int x, int y, float seed)
    {
        if (ampArray == null || freqArray == null)
        {
            Debug.Log("Amplifier Array or Frequency Array is null");
            return Mathf.PerlinNoise(x * .3f, y * .3f) * 2f;
        }
        if (ampArray.Length != layers || freqArray.Length != layers)
        {
            Debug.Log("Amplifier Array or Frequency Array and the amount of Layers aren't equal");
            return Mathf.PerlinNoise(x * .3f, y * .3f) * 2f;
        }

        float result = 0;
        for (int i = 0; i < layers; i++)
        {
            result += Mathf.PerlinNoise(x * (freqArray[i] + seed), (y * freqArray[i]) + seed) * ampArray[i];
        }
        return result;
    }

    void CreateShape()
    {
        vertices = new Vector3[(xSize + 1) * (zSize + 1)];

        for (int i = 0, z = 0; z <= zSize; z++)
        {
            for (int x = 0; x <= xSize; x++)
            {
                //float y = Mathf.PerlinNoise(x * seed, z * (seed * 1.5f)) * (amplifier * rNum);
                float y = 0f;
                y = TerrainPerlin(Layers, Amplifiers, Frequencies, x, z, Seed);
                vertices[i] = new Vector3(x, y, z);
                i++;
            }
        }

        triangles = new int[xSize * zSize * 6];

        int vert = 0;
        int tris = 0;
        for (int z = 0; z < zSize; z++)
        {
            for (int x = 0; x < xSize; x++)
            {
                triangles[tris + 0] = vert + 0;
                triangles[tris + 1] = vert + xSize + 1;
                triangles[tris + 2] = vert + 1;
                triangles[tris + 3] = vert + 1;
                triangles[tris + 4] = vert + xSize + 1;
                triangles[tris + 5] = vert + xSize + 2;

                vert++;
                tris += 6;
            }
            vert++;
        }
    }
    void UpdateMesh()
    {
        mesh.Clear();

        mesh.vertices = vertices;
        mesh.triangles = triangles;

        mesh.RecalculateNormals();
        mesh.RecalculateBounds();

        MeshCollider meshCollider = gameObject.GetComponent<MeshCollider>();
        meshCollider.sharedMesh = mesh;
        mesh.Optimize();
    }

    void OnDrawGizmos()
    {
        if (vertices == null)
            return;

        for (int i = 0; i < vertices.Length; i++)
        {
            Gizmos.DrawSphere(vertices[i], .1f);
        }
    }
}

До того, как я добавил нулевую обработку и консольные сообщения, это была ошибка, которую я получал

NullReferenceException: Object reference not set to an instance of an object
MeshGenerator.TerrainPerlin (System.Int32 layers, System.Single[] ampArray, System.Single[] freqArray, System.Int32 x, System.Int32 y, System.Single seed) [at Assets/Scripts/MeshGenerator.cs:51]

Контекст того, что я пытаюсь сделать: я пытаюсь создать процедурный ландшафт в единстве. Я смог использовать для этого один слой шума Перлина, однако я хочу использовать несколько октав шума Перлина для создания сетки ландшафта, поэтому У меня может быть лучше выглядящая местность с горами и холмами и больше деталей. Однако, когда я пытаюсь использовать свою функцию со случайно сгенерированными массивами, она просто возвращает нулевые значения аргументам.


person GamersGotPower    schedule 08.07.2021    source источник
comment
как вы определили усилители и частоты?   -  person TDao    schedule 08.07.2021
comment
я только что отредактировал это, чтобы иметь больше контекста, извините за это.   -  person GamersGotPower    schedule 08.07.2021
comment
Вы объявляете float[] Amplifiers = new float[Layers];. Это не то же самое Amplifiers, что и float[] Amplifiers; в классе. Это новый Amplifiers.   -  person Llama    schedule 08.07.2021
comment
изменение способа объявления массива ничего не делает, если я удаляю объявление вверху, это вызывает больше проблем, а если я удаляю float[] Amplifiers = new float[Layers];, это ничего не меняет.   -  person GamersGotPower    schedule 08.07.2021
comment
А если сделать Amplifiers = new float[Layers]; или this.Amplifiers = new float[Layers]; в Start? Это то, что предлагается в связанных вопросах.   -  person Llama    schedule 08.07.2021
comment
Добавляя к комментарию @Llama, вы также, кажется, вызываете CreateShape › TerrainPerlin перед инициализацией усилителей, частот.   -  person MarkSouls    schedule 08.07.2021
comment
@MarkSouls, если бы я создал переменную с плавающей запятой, которая создала бы функцию TerrainPerlin с плавающей запятой до того, как я вызову CreateShape, могло бы это изменить результат   -  person GamersGotPower    schedule 08.07.2021
comment
Ах, теперь я вижу проблему, спасибо @MarkSouls   -  person GamersGotPower    schedule 08.07.2021