import bpy import math import bmesh import random # This makes it easy to keep revising and running the script bpy.ops.object.select_all(action='SELECT') bpy.ops.object.delete(use_global=False) # ccmp = Color Component def random_ccmp(): return random.randrange(0, 1000) / 1000.0 def random_color(): return (random_ccmp(), random_ccmp(), random_ccmp(), 1.0) mat = bpy.data.materials.new(name="VertexColorMaterial") mat.use_nodes = True bsdf = mat.node_tree.nodes.get("Principled BSDF") color_node = mat.node_tree.nodes.new(type='ShaderNodeVertexColor') color_node.layer_name = "Col" mat.node_tree.links.new(color_node.outputs['Color'], bsdf.inputs['Base Color']) def create_colored_cube(stair): center = (0, stair * 2, stair) bpy.ops.mesh.primitive_cube_add(location=center) cube = bpy.context.active_object cube.scale = (2, 2, 0.25) bpy.ops.object.mode_set(mode='EDIT') mesh = bmesh.from_edit_mesh(cube.data) color_layer = mesh.loops.layers.color.new("Col") for i, face in enumerate(mesh.faces): face_color = random_color() for loop in face.loops: loop[color_layer] = face_color bmesh.update_edit_mesh(cube.data) bpy.ops.object.mode_set(mode='OBJECT') cube.data.materials.append(mat) # Globals in Python: Create a variable outside the function, say "global" inside stair = 0 def create_stair(): global stair # It'll make a local variable without this if bpy.context.mode != "OBJECT": return None create_colored_cube(stair) stair += 0.5 if stair < 30: return 0.2 return None bpy.app.timers.register(create_stair)