0

(edited for more context) When I pass my Amplifiers and Frequencies float arrays into my functions corresponding arguments it is passed as null in the function. Here is a code sample:

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);
        }
    }
}

Before i added the null handling and console messages this was the error i was getting

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]

Context on what I am trying to do: I'm trying to make procedural terrain in unity I have been able to use a single layer of Perlin Noise to do that however I want to use multiple octaves of Perlin Noise to generate a terrain mesh so I can have better looking terrain that has mountains and hills, and more detail. However when I try to use my function with randomly generated arrays it just returns null values to the arguments.

0 Answers0