Ursina中如何为Entity对象设置自定义碰撞器并调整大小?
Ursina树木碰撞盒缩小无效的解决方法
问题核心错误
你之前的尝试存在两个关键问题:
- 修改碰撞盒大小时用**世界坐标(
spawnTree.position)**计算尺寸,这会导致碰撞盒偏移到完全错误的位置,自然看不到效果; - 手动创建
BoxCollider时,center参数传了世界坐标,但它需要的是相对于树木实体的本地坐标,这直接导致碰撞盒和树木完全错位,所以玩家碰不到。
正确实现方式
方式一:在树类初始化时直接定义自定义碰撞盒
修改tree类,直接在初始化阶段创建合适大小的BoxCollider,无需依赖默认的collider='box':
from ursina import Entity, BoxCollider, Vec3 class tree(Entity): def __init__(self, position): super().__init__( model="Assets/SimpleTree.fbx", texture="Assets/Treesnow.png", scale=0.007, position=position, double_sided=True ) # 手动创建碰撞盒,size数值根据模型实际缩放调整,示例用Vec3(0.4, 6, 0.4) # center设为(0,3,0),让碰撞盒居中在树干区域 self.collider = BoxCollider(self, center=Vec3(0, 3, 0), size=Vec3(0.4, 6, 0.4))
方式二:修改默认box碰撞器的尺寸
如果坚持用默认的collider='box',可以在实体创建后修改碰撞盒的scale或直接设置size,注意要用本地坐标数值:
# 生成树木的代码修改 if chance > 0.5: spawnTree = tree(position=(i+randint(2, 6), 0, j+randint(2, 6))) # 缩小碰撞盒,scale是相对于默认碰撞盒的比例,比如0.3就是缩小到30% spawnTree.collider.scale = Vec3(0.3, 1, 0.3) # 也可以直接设置size,同样用本地坐标数值 # spawnTree.collider.size = Vec3(0.4, 6, 0.4)
额外调试技巧
初始化Ursina时开启editor_ui=True,可以直观看到碰撞盒的位置和大小,方便快速调整数值,找到既能让玩家穿行又不会过度穿模的尺寸。
内容的提问来源于stack exchange,提问作者lvl1_coder
相关产品推荐
相关产品推荐

