Ursina框架:实现3D按钮仅在相机特定半径内可点击
Ursina 3D按钮点击距离限制方案
要解决按钮远距离可点击的问题,核心是在触发点击或交互逻辑前,先判断相机与按钮的距离是否在设定范围内,以下是两种实用方法:
方法一:在点击事件中添加距离判断
适合快速修改现有按钮,仅限制点击逻辑,不影响悬停高亮:
from ursina import * app = Ursina() # 设定允许点击的最大半径(可根据需求调整) MAX_CLICK_RANGE = 10 def handle_horror_button_click(): # 计算相机与按钮的直线距离 distance = horror_gamemode.distance_to(camera) if distance <= MAX_CLICK_RANGE: print("按钮触发:进入恐怖模式") # 这里编写按钮的实际功能逻辑 else: print(f"距离过远(当前距离:{round(distance, 1)}),无法点击") horror_gamemode = Button( parent = scene, model = 'cube', texture = None, color = color.black, highlight_color = color.dark_gray, scale = 1, position = (3, -49, 4), collider = 'mesh', on_click = handle_horror_button_click ) app.run()
方法二:自定义限制范围的按钮类
重写按钮的输入处理逻辑,同时限制点击、悬停高亮等所有交互,体验更连贯:
from ursina import * app = Ursina() MAX_INTERACT_RANGE = 10 class RangeLimitedButton(Button): def input(self, key): # 先判断是否在交互范围内,超出则直接跳过所有输入处理 if self.distance_to(camera) > MAX_INTERACT_RANGE: return # 调用父类的input方法,保留原本的点击、高亮逻辑 super().input(key) # 使用自定义按钮类创建实例 horror_gamemode = RangeLimitedButton( parent = scene, model = 'cube', texture = None, color = color.black, highlight_color = color.dark_gray, scale = 1, position = (3, -49, 4), collider = 'mesh' ) # 绑定点击逻辑 def on_button_click(): print("在有效范围内点击按钮") horror_gamemode.on_click = on_button_click app.run()
说明
distance_to()是Ursina Entity自带的方法,可直接计算两个实体间的直线距离- 两种方法的核心都是通过距离判断拦截无效交互,可根据需求选择:仅限制点击选方法一,要完整限制所有交互选方法二
内容的提问来源于stack exchange,提问作者Мирончук Максим
相关产品推荐
相关产品推荐

