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

为何CollisionShape2D的位置在理应不可修改后仍发生变化?

问题:所有碰撞盒位置与最后一个碰撞盒重合

我为cursor节点编写了如下GDScript代码:

extends Node2D

# @onready var parent = $".",
@export var lineTemplate: PackedScene = preload("res://scenes/Gameplay/linemaker/lineTemplate.tscn")
@export var collisionTemplate: PackedScene = preload("res://scenes/Gameplay/linemaker/hitbox.tscn")

@onready var lineContainer := lineTemplate.instantiate()
@onready var line := lineContainer.get_node("Line2D")

# Called when the node enters the scene tree for the first time.
func _ready() -> void:
    Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)

# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
    position = get_global_mouse_position()
    
func _input(event: InputEvent) -> void:
    if event.is_action_pressed("drawEvent"):
        addLinePoint(position)
        
func addLinePoint(mousePosition: Vector2) -> void:
    line.add_point(mousePosition)
    if line.get_point_count() == 1:
        get_parent().add_child(lineContainer)
    if line.get_point_count() > 1:
        var collision = collisionTemplate.instantiate()
        collision.shape.a = line.get_point_position(line.get_point_count()-2)
        collision.shape.b = line.get_point_position(line.get_point_count()-1)
        collision.name = "Segment%sHitbox" % (line.get_point_count()-1)
        lineContainer.add_child(collision)

相关场景、lineTemplate、hitbox的布局已配置完成。

出现的问题:所有碰撞盒的位置均与最后一个碰撞盒重合,例如Segment1Hitbox与Segment2Hitbox、Segment3Hitbox位置完全相同,开启“Visible Collision Shapes”后该问题清晰可见。

我曾推测是变量引用问题,尝试改用数组存储碰撞盒,但修改后的代码并未改善问题:

extends Node2D

# @onready var parent = $".",
@export var lineTemplate: PackedScene = preload("res://scenes/Gameplay/linemaker/lineTemplate.tscn")
@export var collisionTemplate: PackedScene = preload("res://scenes/Gameplay/linemaker/hitbox.tscn")

@onready var lineContainer := lineTemplate.instantiate()
@onready var line := lineContainer.get_node("Line2D")

var collision: Array[CollisionShape2D] = [collisionTemplate.instantiate()]

# Called when the node enters the scene tree for the first time.
func _ready() -> void:
    Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)

# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
    position = get_global_mouse_position()
    
func _input(event: InputEvent) -> void:
    if event.is_action_pressed("drawEvent"):
        addLinePoint(position)
        
func addLinePoint(mousePosition: Vector2) -> void:
    line.add_point(mousePosition)
    if line.get_point_count() == 1:
        get_parent().add_child(lineContainer)
    if line.get_point_count() > 1:
        collision.append(collisionTemplate.instantiate())
        collision[line.get_point_count() - 2].shape.a = line.get_point_position(line.get_point_count()-2)
        collision[line.get_point_count() - 2].shape.b = line.get_point_position(line.get_point_count()-1)
        collision[line.get_point_count() - 2].name = "Segment%sHitbox" % (line.get_point_count()-1)
        lineContainer.add_child(collision[line.get_point_count() - 2])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 20:27:21