You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修复Python Ursina体素游戏中的NameError及Texture析构异常?

嘿,我帮你搞定这两个Ursina体素游戏开发里的问题,先解决那个让程序直接崩掉的致命错误,再处理那些烦人的析构警告:

一、修复致命的NameError(程序终止问题)

这个错误的核心原因是你没有正确初始化Ursina应用实例,也没启动应用。看你的代码里这两行:

app = Ursina  # 只引用了类,没创建实例
# ...
app.run  # 只引用了方法,没调用它

Ursina的render全局对象是在Ursina()实例初始化时才会被创建的,没实例化的话,render根本不存在,所以FirstPersonController内部调用self.get_position(render)时就会触发NameError

修复步骤:

把这两行改成带括号的调用,正确创建并启动应用:

app = Ursina()  # 创建Ursina应用实例
# ...
app.run()  # 调用run方法启动应用

二、修复Texture类析构异常(大量被忽略的AttributeError)

这个是Ursina旧版本的小bug:当Texture对象被垃圾回收时,__del__方法会尝试删除self._cached_image,但这个属性可能还没被初始化,或者已经被提前清理了,所以抛出了被忽略的异常。

解决办法二选一:

  1. 升级到最新版Ursina(推荐):官方已经修复了这个问题,打开终端运行:
    pip install --upgrade ursina
    
  2. 临时手动修复:找到你的Ursina安装目录下的texture.py(路径是C:\Users\POM\AppData\Local\Programs\Python\Python310\lib\site-packages\ursina\texture.py),修改__del__方法,先检查属性是否存在再删除:
    def __del__(self):
        if hasattr(self, '_cached_image'):  # 先判断属性是否存在
            del self._cached_image
        # 保留原方法的其他代码
    

完整修复后的代码

把你的代码修正后应该是这样:

from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController

app = Ursina()  # 修复:创建Ursina实例
class Voxel(Button):
    def __init__(self, position = (0,0,0)):
        super().__init__(
            parent = scene,
            position = position,
            model = 'cube',
            texture = 'white_cube',
            color = color.white,
            highlight_color = color.lime,
            origin_y = 0.5,
            scale = 0.5
        )

for z in range(8):
    for x in range(8):
        voxel = Voxel(position = (x,0,z))

player = FirstPersonController()
voxel = Voxel()
app.run()  # 修复:启动应用

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

火山引擎 最新活动