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

如何在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()

代码说明

  1. 时间判断逻辑:通过last_switch_minute记录上次切换的分钟,只有当当前分钟是6的倍数且与上次不同时,才触发切换,避免同一时间点多次触发。
  2. 迷宫生成与销毁:generate_maze函数负责生成不同布局的迷宫,switch_maze函数批量销毁当前迷宫的所有实体,再生成新迷宫,确保场景干净。
  3. UI优化:只创建一次timer_text,在update中仅更新其text属性,避免不必要的内存占用。
  4. 扩展性:generate_maze函数可以轻松扩展更多迷宫类型,只需新增maze_type的判断分支即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:02:02