如何删除存储在字典中的Ursina Entity?我的世界复刻问题求助
问题分析与解决
核心原因
你的代码中调用了chunk.combine(auto_destroy=False),这个操作会将所有子方块的模型数据合并到父chunk的模型中。即便设置了auto_destroy=False保留方块实体,这些子方块的model会被置为None,不再参与渲染。此时字典里存储的方块实体对可见场景已无影响,调用destroy自然看不到任何效果。
解决方案1:不合并Chunk(简单直观,适合测试)
移除Chunk合并操作,让每个方块作为独立实体存在,销毁操作就能直接生效:
from ursina import * from ursina.prefabs.first_person_controller import FirstPersonController import random app = Ursina() player = FirstPersonController() # 创建玩家 player.y = 25 blocks_dictionary = {} # 存储方块的字典 def input(key): if key == 'm': mine_block(random.randint(0,4), random.randint(0,4), random.randint(0,4)) def mine_block(x,y,z): target_block = blocks_dictionary.get((x,y,z)) if target_block: destroy(target_block) del blocks_dictionary[(x,y,z)] # 销毁后从字典移除,避免重复操作 def generate_chunk(x, y, z): chunk = Entity(model=None) # 创建Chunk容器,无需提前设置collider for i in range(5): for j in range(5): for u in range(5): generate_block(x + i, y + u, z + j, chunk) def generate_block(x, y, z, parent): # 给每个方块添加collider,确保交互正常 block = Entity(position=(x, y, z), model='block.obj', texture='grass.png', collider='box') block.parent = parent # 将方块挂到Chunk下 blocks_dictionary[(x, y, z)] = block # 存入字典 generate_chunk(0,0,0) sky = Sky() # 创建天空 app.run()
解决方案2:保留Chunk合并(优化性能,接近原版MC)
如果要保留Chunk合并以提升性能,可以使用Ursina内置的Voxel预制件,它支持合并后的动态修改:
from ursina import * from ursina.prefabs.first_person_controller import FirstPersonController from ursina.prefabs.voxel import Voxel # 导入内置Voxel类 import random app = Ursina() player = FirstPersonController() player.y = 25 blocks_dictionary = {} chunk = None # 全局变量存储Chunk引用 def input(key): if key == 'm': x, y, z = random.randint(0,4), random.randint(0,4), random.randint(0,4) mine_block(x,y,z) def mine_block(x,y,z): target_voxel = blocks_dictionary.get((x,y,z)) if target_voxel: destroy(target_voxel) del blocks_dictionary[(x,y,z)] chunk.combine() # 重新合并Chunk,更新显示 def generate_chunk(x, y, z): global chunk chunk = Entity(model=None) for i in range(5): for j in range(5): for u in range(5): generate_block(x + i, y + u, z + j, chunk) chunk.combine() # 合并Chunk chunk.texture = 'grass.png' chunk.collider = 'mesh' # 设置Mesh碰撞体 def generate_block(x, y, z, parent): voxel = Voxel(position=(x, y, z), parent=parent) blocks_dictionary[(x, y, z)] = voxel generate_chunk(0,0,0) sky = Sky() app.run()
内容的提问来源于stack exchange,提问作者Little Developer
相关产品推荐
相关产品推荐

