I keep on getting an error saying that the object is not set to an instance of an object on line 108 of my terrain generator code (cubeCorner = …). Here is my project: https://github.com/AstroneerKing/Terrex.
when you create a thread there are several buttons between title and description,
among those is a “insert code”. It would be wiser if you’d copy/paste certain part of code(or whole script if necessary)
with which you need help. : - )
even in this thread of yours, down below the description you have edit button, so you can paste for now i think the line 108. : - )
but in general, if there would be an null reference error here:
if (Sphere.someComponent == something)
{
//code
}
then either sphere or sphere’s component Or that something is null. Not set from somewhere
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(MeshFilter))]
public class TerrainGenerator : MonoBehaviour
{
float IsoSurfaceLevel = 0f;
[SerializeField]int wSize;
Density density;
Vector3 vertexPos;
[SerializeField]bool isBlocky;
protected int[] WindingOrder { get; private set; }
List<int> meshTriangles;
int totalNumTris;
Vector4[] cubeCorners;
int TraingleLoop = 0;
List<Vector3> vertices;
Mesh mesh;
MeshCollider meshCollider;
MarchTable table;
private void Awake() {
cubeCorners = new Vector4[8];
meshTriangles = new List<int>();
totalNumTris = 0;
vertices = new List<Vector3>();
density = GetComponent<Density>();
table = GetComponent<MarchTable>();
meshCollider = GetComponent<MeshCollider>();
}
void Start()
{
if(Application.isPlaying)
{
generateTerrain();
}
}
void generateTerrain()
{
if(mesh == null)
{
mesh = new Mesh();
GetComponent<MeshFilter>().mesh = mesh;
}
if(meshTriangles != null && vertices != null)
{
meshTriangles.Clear();
vertices.Clear();
}
mesh.Clear();
for (int i = -wSize; i < wSize; i++)
{
for (int j = -wSize; j < wSize; j++)
{
for (int k = -wSize; k < wSize; k++)
{
if (i+1 >= wSize || j+1 >= wSize || k+1 >= wSize) continue;
march(i,j,k);
}
}
}
if(meshTriangles == null){
return;
}
meshTriangles.Reverse();
mesh.vertices = vertices.ToArray();
mesh.SetTriangles(meshTriangles, 0);
mesh.RecalculateNormals();
meshCollider.sharedMesh = mesh;
}
Vector3 interpolateVerts(Vector4 v1, Vector4 v2)
{
float t = (IsoSurfaceLevel - v1.w) / (v2.w - v1.w);
return v1 + t * (v2 - v1);
}
void march(int i, int j, int k)
{
cubeCorners = new Vector4[8] {
new Vector4 (i, j, k, density.generateDensity(new Vector3 (i, j, k))),
new Vector4 (i + 1, j, k, density.generateDensity(new Vector3 (i + 1, j, k))),
new Vector4 (i + 1, j, k + 1, density.generateDensity(new Vector3 (i + 1, j, k + 1))),
new Vector4 (i, j, k + 1, density.generateDensity(new Vector3 (i, j, k + 1))),
new Vector4 (i, j + 1, k, density.generateDensity(new Vector3 (i, j + 1, k))),
new Vector4 (i + 1, j + 1, k, density.generateDensity(new Vector3 (i + 1, j + 1, k))),
new Vector4 (i + 1, j + 1, k + 1, density.generateDensity(new Vector3 (i + 1, j + 1, k + 1))),
new Vector4 (i, j + 1, k + 1, density.generateDensity(new Vector3 (i , j + 1, k + 1))) };
int cubeIndex = 0;
for (int x = 0; x < 8; x++)
{
if(cubeCorners[x].w < IsoSurfaceLevel)
{
cubeIndex |= 1 << x;
}
}
int[] triangulation = table.triangulation[cubeIndex];
int h = 0;
int numTris = 0;
foreach(int edgeIndex in triangulation)
{
if(edgeIndex == -1)
{
numTris = h/3;
break;
}
h++;
}
for (int e = 0; e < 5; e++)
{
if (table.triangulation[cubeIndex][3 * e] < 0) break;
for (int v = 0; v < 3; v++)
{
int idx = vertices.Count;
int indexA = table.cornerIndexAFromEdge[table.triangulation[cubeIndex][3*e + v]];
int indexB = table.cornerIndexBFromEdge[table.triangulation[cubeIndex][3*e + v]];
if(isBlocky)
{
vertexPos = (cubeCorners[indexA] + cubeCorners[indexB])/2;
}
else
{
vertexPos = interpolateVerts(cubeCorners[indexA], cubeCorners[indexB]);
}
meshTriangles.Add(idx);
vertices.Add(vertexPos);
}
}
TraingleLoop += numTris;
}
public void requestMeshUpdate()
{
if(Application.isPlaying)
{
generateTerrain();
}
}
void OnDrawGizmos()
{
if(cubeCorners == null) return;
if(vertices == null) return;
// int x = 0;
// foreach(Vector4 cubecorner in cubeCorners)
// {
// Gizmos.color = Color.Lerp(Color.black, Color.white, cubecorner[x]);
// if(x == 5)
// {
// x = 0;
// }
// Gizmos.DrawSphere(cubecorner, 0.1f);
// }
foreach(Vector3 vertex in vertices)
{
Gizmos.color = Color.blue;
Gizmos.DrawSphere(vertex, 0.05f);
}
}
void OnValidate()
{
if(Application.isPlaying)
{
requestMeshUpdate();
}
}
}
There is my code… sorry for the trouble.
This is the line where I am getting an error:
cubeCorners = new Vector4[8] {
new Vector4 (i, j, k, density.generateDensity(new Vector3 (i, j, k))),
new Vector4 (i + 1, j, k, density.generateDensity(new Vector3 (i + 1, j, k))),
new Vector4 (i + 1, j, k + 1, density.generateDensity(new Vector3 (i + 1, j, k + 1))),
new Vector4 (i, j, k + 1, density.generateDensity(new Vector3 (i, j, k + 1))),
new Vector4 (i, j + 1, k, density.generateDensity(new Vector3 (i, j + 1, k))),
new Vector4 (i + 1, j + 1, k, density.generateDensity(new Vector3 (i + 1, j + 1, k))),
new Vector4 (i + 1, j + 1, k + 1, density.generateDensity(new Vector3 (i + 1, j + 1, k + 1))),
new Vector4 (i, j + 1, k + 1, density.generateDensity(new Vector3 (i , j + 1, k + 1))) };
It looks like the only object that you are referencing in that line is density. Are you sure that
density = GetComponent<Density>();
actually found the component that it was supposed to?