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

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,提问作者Мирончук Максим

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:35:49