如何使用 Ursina 实现敌人碰撞并在 Ursina 中更改子弹方向?

How do I implement enemy collision using Ursina and change bullet direction in Ursina?

我正在做一个 Ursina 游戏,当我去敌人碰撞时,它会出现这样的错误:

Traceback (most recent call last):
  File "C:\Users\Minerva Panganiban\AppData\Local\Programs\Python\Python39\lib\site-packages\ursina\main.py", line 126, in _update
    __main__.update()
  File "C:/Users/Minerva Panganiban/OneDrive/Desktop/Python/Ursinale.py", line 128, in update
    destroy(bullet, enemy)
  File "C:\Users\Minerva Panganiban\AppData\Local\Programs\Python\Python39\lib\site-packages\ursina\ursinastuff.py", line 48, in destroy
    s = Sequence(
  File "C:\Users\Minerva Panganiban\AppData\Local\Programs\Python\Python39\lib\site-packages\ursina\sequence.py", line 42, in __init__
    self.generate()
  File "C:\Users\Minerva Panganiban\AppData\Local\Programs\Python\Python39\lib\site-packages\ursina\sequence.py", line 52, in generate
    self.duration += arg.duration
TypeError: unsupported operand type(s) for +=: 'int' and 'Entity'
Traceback (most recent call last):
  File "C:/Users/Minerva Panganiban/OneDrive/Desktop/Python/Ursinale.py", line 136, in <module>
    app.run()
  File "C:\Users\Minerva Panganiban\AppData\Local\Programs\Python\Python39\lib\site-packages\ursina\main.py", line 234, in run
    super().run()
  File "C:\Users\Minerva Panganiban\AppData\Local\Programs\Python\Python39\lib\site-packages\direct\showbase\ShowBase.py", line 3325, in run
    self.taskMgr.run()
  File "C:\Users\Minerva Panganiban\AppData\Local\Programs\Python\Python39\lib\site-packages\direct\task\Task.py", line 546, in run
    self.step()
  File "C:\Users\Minerva Panganiban\AppData\Local\Programs\Python\Python39\lib\site-packages\direct\task\Task.py", line 500, in step
    self.mgr.poll()
  File "C:\Users\Minerva Panganiban\AppData\Local\Programs\Python\Python39\lib\site-packages\ursina\main.py", line 126, in _update
    __main__.update()
  File "C:/Users/Minerva Panganiban/OneDrive/Desktop/Python/Ursinale.py", line 128, in update
    destroy(bullet, enemy)
  File "C:\Users\Minerva Panganiban\AppData\Local\Programs\Python\Python39\lib\site-packages\ursina\ursinastuff.py", line 48, in destroy
    s = Sequence(
  File "C:\Users\Minerva Panganiban\AppData\Local\Programs\Python\Python39\lib\site-packages\ursina\sequence.py", line 42, in __init__
    self.generate()
  File "C:\Users\Minerva Panganiban\AppData\Local\Programs\Python\Python39\lib\site-packages\ursina\sequence.py", line 52, in generate
    self.duration += arg.duration
TypeError: unsupported operand type(s) for +=: 'int' and 'Entity'

看报错,没找到问题

这是我正在制作的游戏的代码:

from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController

app = Ursina()

class Ground(Entity):
    def __init__(self):
        super().__init__(
            parent = scene,
            model = 'plane',
            texture = "Cube",
            scale = 500,
            position = Vec3(0, 0, 0),
            collider = 'plane')

class Cube(Entity):
    def __init__(self):
        super().__init__(
            parent = scene,
            model = 'cube',
            texture = "Sun",
            scale = 50,
            position = Vec3(250, 0, 250),
            collider = 'box')

class Cube2(Entity):
    def __init__(self):
        super().__init__(
            parent = scene,
            model = 'cube',
            texture = "Sun",
            scale = 50,
            position = Vec3(-250, 0, -250),
            collider = 'box')

class Cube3(Entity):
    def __init__(self):
        super().__init__(
            parent = scene,
            model = 'cube',
            texture = "Sun",
            scale = 50,
            position = Vec3(-250, 0, 250),
            collider = 'box')

class Cube4(Entity):
    def __init__(self):
        super().__init__(
            parent = scene,
            model = 'cube',
            texture = "Sun",
            scale = 50,
            position = Vec3(250, 0, -250),
            collider = 'box')

class Sky(Entity):
    def __init__(self):
        super().__init__(
            parent = scene,
            model = 'sphere',
            texture = "Bla",
            scale = 2050,
            double_sided = True)

class Weapon(Entity):
    def __init__(self):
        super().__init__(
            parent = camera.ui,
            model = 'cube',
            texture = "Untitled",
            scale = 0.5,
            rotation = Vec3(0, 0, 5),
            position = Vec3(0, 0, 0))

    def active(self):
        self.rotation = Vec3(0, 45, 5)
        self.position = Vec3(0, 0, 1)

    def passive(self):
        self.rotation = Vec3(0, 0, 5)
        self.position = Vec3(0, 0, 0)

player = FirstPersonController(model='cube',
                            texture = "face",
                            scale=0.75,
                            collider = 'box',
                              speed = 2.255)
camera.z = -5
ground = Ground()
cube = Cube()
cube2 = Cube2()
cube3 = Cube3()
cube4 = Cube4()
sky = Sky()
weapon = Weapon()

window.title = 'Ursinale'
window.borderless = False
window.fullscreen = False
window.exit_button.visible = False
window.fps_counter_enabled = True
window.color = color.black

enemy = Entity(parent = scene,
                 model = 'cube',
                 texture = "ArcataPonte1",
                 position = Vec3(2000, 2000, 2000),
                 scale = 25,
                 collider = 'box')
enemy.add_script(SmoothFollow(target=player,
                                offset=[0,0,0],
                                speed = 0.255))

bullet = None
def input(key):
    global bullet
    if key == 'left mouse down':
        bullet = Entity(parent=weapon, model='cube', scale=.1, color=color.black, collider='box')
        bullet.world_parent = scene
        bullet.animate_position(bullet.position+(bullet.forward*500), curve=curve.linear, duration=2)
        destroy(bullet, delay=2)

def update():
    global enemy
    if bullet and bullet.intersects(enemy).hit:
        hit_info = bullet.intersects(enemy)
        print('enemy hit')
        destroy(bullet, enemy)
        enemy = None

    if held_keys['left mouse']:
        weapon.active()
    else:
        weapon.passive()

app.run()

所以是有什么错误,还是 Ursina 被窃听了?另一个问题是如何将子弹的方向更改为玩家所面对的方向?

destroy(bullet, enemy) 是错误的。第二个参数是延迟,应该是一个数字,而不是一个实体。