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

Ursina引擎中如何实现实体碰撞检测并返回布尔值

Ursina引擎实体碰撞检测实现方案

Ursina内置了成熟的碰撞检测接口,你只需要做少量修改就能拿到需要的布尔值结果,实现步骤如下:

  • 给参与碰撞的实体添加collider属性启用碰撞检测,你使用的是cube模型,直接用collider='box'即可完美匹配碰撞体积
  • 如果你需要单独检测玩家和特定宝可梦的碰撞,建议用列表存储批量生成的宝可梦实例,方便后续遍历
  • 调用实体的intersects()方法,返回结果的hit属性就是你需要的布尔值:碰撞到有效碰撞体时为True,未碰撞时为False

修改后的完整可运行代码
from ursina import *
import random

#variables
speed = 0.05
number_of_pokemon = 10

app = Ursina()

#textures
player_texture = load_texture('pokemon orange assets/player.png')
pokemon_texture1 = load_texture('pokemon orange assets/pokemon.png')
pokemon_texture2 = load_texture('pokemon orange assets/pokemon2.png')
pokemon_texture3 = load_texture('pokemon orange assets/pokemon3.png')
grass_texture = load_texture('pokemon orange assets/grass.png')
textbox_texture = load_texture('pokemon orange assets/textbox.png')
missingno_texture = load_texture('pokemon orange assets/missingno.png')

pokemontextures = [pokemon_texture1, pokemon_texture2, pokemon_texture3]
# 存储所有宝可梦实例的列表
pokemon_list = []

#entitys: pokemon(s), player, textbox, battles
# 给玩家添加box碰撞体
player = Entity(model = 'cube', texture = player_texture, scale = (1,1,0), position = (0,0,-0.1), collider='box')
#textbox = Entity(model ='cube', texture = textbox_texture, scale = (5,1,0), position = (0,-3,0))

#spawns pokemon
number = random.uniform(0,100)
if number == 100:
    for i in range (100):
         # 给宝可梦添加box碰撞体,并存入列表
         pokemon = Entity(model ='cube', texture = missingno_texture, scale = (1,2,0), position = (random.uniform(-10,10),random.uniform(-10,10),-0.1), collider='box')
         pokemon_list.append(pokemon)
else:
    for i in range(number_of_pokemon):
        # 给宝可梦添加box碰撞体,并存入列表
        pokemon = Entity(model ='cube', texture = random.choice(pokemontextures), scale = (1.5,1.5,0), position = (random.uniform(-5,5),random.uniform(-4,4),-0.1), collider='box')
        pokemon_list.append(pokemon)

#spawns grass (不给草添加碰撞体,就不会被纳入碰撞检测)
for y in range(20):   
    for x in range(20):
        grass = Entity(model ='cube', texture = grass_texture, scale = (1,1,0), position = (x - 10,y - 10,0))

#movement
def update():
    player.x += held_keys['d'] * speed 
    player.x -= held_keys['a'] * speed 
    player.y += held_keys['w'] * speed 
    player.y -= held_keys['s'] * speed 
    # 输出碰撞布尔值,未碰撞时输出False,碰撞到宝可梦时输出True
    print(player.intersects().hit)
    # 如果需要单独检测碰撞到了哪个宝可梦,打开下方注释即可
    # for p in pokemon_list:
    #     if player.intersects(p).hit:
    #         print("碰撞到特定宝可梦")

app.run()

如果你不需要检测和草地的碰撞,不要给草地实体添加collider属性即可,碰撞检测会自动忽略没有碰撞体的实体。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:45:00