You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何删除存储在字典中的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 21:27:07