Don't know why my code is failing at this line

Godot Version

V4.3.stable

Question


I do not know why my code is failing at line 26 here saying that MeshNode is Nil.

@tool
extends Node3D
class_name TerrainNode

enum TerrainType {NORMAL_TERRAIN, ROUGH_TERRAIN, WATER_TERRAIN, POISON_TERRAIN, LAVA_TERRAIN}
@export var CurrentTerrain = TerrainType.NORMAL_TERRAIN
@export var TerrainMesh = load("res://Scenes/Primary/TerrainBlocks/PlaceHolder/PHTerrainNormal1.tscn"):
	get:
		return TerrainMesh
	set(Mesh):
		TerrainMesh = Mesh
		UpdateMesh()

@onready var MeshNode  = $PhTerrainNormal2

# Called when the node enters the scene tree for the first time.
func _ready() -> void:
	pass

# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
	pass

func UpdateMesh() -> void:
	var NewMesh = TerrainMesh.instantiate()
	MeshNode.queue_free()
	MeshNode = NewMesh
	add_child(MeshNode)

Maybe you should only call UpdateMesh if it is not set to null

set(Mesh):
	TerrainMesh = Mesh
	if MeshNode:
		UpdateMesh()

That didn’t change anything unfortunately, same error in the same place. MeshNode specifically will not let me queue_free().

You must be calling UpdateMesh elsewhere too then.

You could add a similar check to the function itself

func UpdateMesh() -> void:
	var NewMesh = TerrainMesh.instantiate()
	if MeshNode:
		MeshNode.queue_free()
	MeshNode = NewMesh
	add_child(MeshNode)

export is called after onready, so when youre referencing an onready var from an export, the export var doesnt exist yet. at least thats what i can tell at a glance

This will stop the error, but will not allow me to queue_free the old mesh node. The whole idea is to have a way to quick swap out the mesh node being used in this scene.

I finally got it. I set up the node to make it spawn the mesh node itself instead of grabbing the one that is placed there in editor. Using this it works naturally.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.