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

Python Ursina引擎如何通过坐标销毁对应Entity实体

实现思路

以下是不同场景下的可行实现方案,可根据你的项目规模和性能需求选择:

1. 全量遍历法(适合小型项目、实体数量≤1000的场景)

  • 逻辑最简单,全局维护一个存储所有实体的列表all_entities,调用getter时遍历所有实体,匹配坐标后返回对应实体,无匹配返回None即可
  • 伪代码示例:
def get_entity_by_pos(x: float, y: float, z: float) -> Entity | None:
    for entity in all_entities:
        # 若实体存在碰撞体积,可改为判断坐标是否落在实体碰撞盒范围内
        if entity.x == x and entity.y == y and entity.z == z:
            return entity
    return None
  • 优点:无额外维护成本,实现门槛极低,适合Demo、小型游戏等轻量场景
  • 缺点:查询时间复杂度为O(n),实体量上涨后性能会快速下降

2. 空间哈希法(适合绝大多数中大型项目、实体分布离散的场景)

  • 提前维护一个哈希映射表,键为坐标三元组(x,y,z)(可根据项目精度需求对坐标做取整处理,避免浮点误差),值为对应坐标的实体/实体列表
  • 实体生成、移动、销毁时同步更新哈希表的映射关系,getter直接查询哈希表即可,时间复杂度为O(1)
  • 伪代码示例:
# 全局维护的空间哈希索引
pos_entity_map: dict[tuple[float, float, float], Entity] = {}

# 实体生成时触发
def on_entity_spawn(entity: Entity) -> None:
    pos_key = (entity.x, entity.y, entity.z)
    pos_entity_map[pos_key] = entity

# 实体移动时触发
def on_entity_move(entity: Entity, old_pos: tuple[float, float, float], new_pos: tuple[float, float, float]) -> None:
    if old_pos in pos_entity_map and pos_entity_map[old_pos] == entity:
        del pos_entity_map[old_pos]
    pos_entity_map[new_pos] = entity

# 目标getter方法
def get_entity_by_pos(x: float, y: float, z: float) -> Entity | None:
    return pos_entity_map.get((x,y,z), None)
  • 优点:查询性能极高,实现难度适中,适配绝大多数3D/2D游戏、仿真场景
  • 注意:如果允许同坐标存在多个实体,将哈希表的值改为list[Entity]类型即可

3. 八叉树/四叉树法(适合超大型开放场景、实体量过万的场景)

  • 2D场景用四叉树、3D场景用八叉树做空间层级划分,将空间按规则拆分为不同层级的区块,实体按位置挂载到对应区块节点上
  • 查询时仅需遍历目标坐标所属区块下的实体即可,时间复杂度为O(log n)
  • 优点:超大规模场景下性能远高于遍历法,内存占用也比空间哈希更友好
  • 缺点:实现复杂度高,需要自行处理实体移动时的节点迁移、区块动态拆分合并等逻辑,仅适合大型项目使用

基于上述getter即可实现你需要的destruction(x,y,z)函数:

def destruction(x: float, y: float, z: float) -> None:
    target = get_entity_by_pos(x,y,z)
    if target:
        # 执行项目自带的实体销毁逻辑,注意同步更新空间索引
        target.destroy()

内容的提问来源于stack exchange,提问作者Yves

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:54:02