如何在Ursina中基于时间创建与销毁实体(迷宫Runner开发)
解决Ursina中基于真实时间的迷宫定时切换问题
你的核心需求是每6分钟基于系统时间切换迷宫,当前代码存在几个问题:每帧重复创建Text会导致内存泄漏,时间判断逻辑会在秒为0的多帧内重复触发,且迷宫切换的逻辑不够灵活。下面是优化后的实现方案:
关键优化点
- 避免每帧重复创建UI元素,仅更新文本内容
- 记录上次切换的时间,确保每次时间节点只触发一次切换
- 封装迷宫生成与销毁逻辑,方便扩展更多迷宫类型
- 用列表统一管理当前迷宫的所有实体,批量销毁更高效
修改后的完整代码示例
from ursina import * from datetime import datetime import random app = Ursina() # 存储当前迷宫的所有实体,方便批量销毁 current_maze = [] # 记录上次切换迷宫的分钟数,防止重复触发 last_switch_minute = datetime.now().minute # 只创建一次Text元素,后续更新内容 timer_text = Text(position=(.78, .43), origin=(0,0), scale=2, background=True) def generate_maze(maze_type): """根据类型生成不同布局的迷宫""" new_maze = [] # 示例:两种不同的迷宫布局,可扩展更多类型 if maze_type == 1: base_block = Entity(model='cube', origin_y=0, scale=(1,7,1), collider='box', color=color.hsv(0,0,random.uniform(.9,1))) new_maze.append(duplicate(base_block, x=0, z=4, y=2)) new_maze.append(duplicate(base_block, x=4, z=4, y=2)) elif maze_type == 2: base_block = Entity(model='cube', origin_y=0, scale=(1,7,1), collider='box', color=color.hsv(0.5,0,random.uniform(.9,1))) new_maze.append(duplicate(base_block, x=0, z=0, y=2)) new_maze.append(duplicate(base_block, x=4, z=0, y=2)) # 销毁基础块,避免残留 destroy(base_block) return new_maze def switch_maze(): """切换迷宫:销毁当前迷宫,生成新迷宫""" global current_maze # 批量销毁当前迷宫的所有实体 for entity in current_maze: destroy(entity) # 根据当前时间模12选择迷宫类型(每6分钟切换一次,循环两种类型) current_minute = datetime.now().minute maze_type = 1 if (current_minute // 6) % 2 == 0 else 2 current_maze = generate_maze(maze_type) print(f"已切换到迷宫类型{maze_type}") def update(): global last_switch_minute t = datetime.now() hour, minute, second = t.hour, t.minute, t.second # 更新计时器文本,无需每帧创建新Text remaining_min = 6 - (minute % 6) timer_text.text = f"{str(remaining_min).zfill(2)}:{str(60 - second).zfill(2)}" # 判断是否到达6分钟切换节点,且只触发一次 if minute != last_switch_minute and minute % 6 == 0: last_switch_minute = minute switch_maze() # 原有的射击逻辑保留 if held_keys['left mouse']: shoot() # 初始化第一个迷宫 current_maze = generate_maze(1) app.run()
代码说明
- 时间判断逻辑:通过
last_switch_minute记录上次切换的分钟,只有当当前分钟是6的倍数且与上次不同时,才触发切换,避免同一时间点多次触发。 - 迷宫生成与销毁:
generate_maze函数负责生成不同布局的迷宫,switch_maze函数批量销毁当前迷宫的所有实体,再生成新迷宫,确保场景干净。 - UI优化:只创建一次
timer_text,在update中仅更新其text属性,避免不必要的内存占用。 - 扩展性:
generate_maze函数可以轻松扩展更多迷宫类型,只需新增maze_type的判断分支即可。
内容的提问来源于stack exchange,提问作者mnar0630
相关产品推荐
相关产品推荐

