【问题标题】:How to change the collision shape for individual instances?如何更改单个实例的碰撞形状?
【发布时间】:2022-07-29 08:28:53
【问题描述】:

我正在开发一款游戏,其中一个关卡被分隔成多个房间,而摄像头被限制在当前房间内,这意味着摄像头不会“渗入”相邻的房间。房间是一个场景 RoomBase,由 Positions RoomLimitTopLeft 和 RoomLimitBottomRight(定义相机的限制)和一个检测玩家何时进入房间的 Area2D 组成。由于每个房间的大小和出口都会很谨慎,我创建了一个脚本,将 Area2D 的 CollisionShape 拉伸到房间的大小。

RoomBase.gd

const ROOM_TRANS_LIMIT = 16
onready var limit_tl = $RoomLimitTopLeft # Position
onready var limit_br = $RoomLimitBottomRight # Position
onready var room_transition = $RoomTransition # Area2D
onready var room_transition_coll = $RoomTransition/CollisionShape2D

func setRoomTransition():
    var width = limit_br.position.x - limit_tl.position.x - 2*ROOM_TRANS_LIMIT
    var height = limit_br.position.y - limit_tl.position.y - 2*ROOM_TRANS_LIMIT

    self.room_transition.position = Vector2(limit_br.position.x/2, limit_br.position.y/2)
    self.room_transition_coll.shape.set_extents(Vector2(width/2, height/2))

此代码将 Area2D 的位置置于其房间的中心,并将其碰撞延伸到几乎覆盖整个房间,这仅适用于一个房间。但是,如果一个关卡由多个房间组成,最新的房间实例会覆盖之前的碰撞形状。例如,如果房间 1 是水平的,房间 2 是垂直的,那么房间 1 将共享 2 的垂直碰撞形状。

是否可以在不影响任何其他场景的情况下更改单个场景实例的碰撞?

【问题讨论】:

  • 顺便说一下,你可以输入你的变量。例如onready var room_transition:Area2d = $RoomTransition。见Static typing in GDScript

标签: godot gdscript


【解决方案1】:

我不确定这是否是问题所在,但据我了解,您在每个房间都使用相同的 Shape2D。如果它们都使用相同的Shape2D,并且您修改了Shape2D,则更改将反映在所有这些中。

您可以从代码中duplicate Shape2D(或使其在检查器中唯一)。这样你就有了不同的Shape2D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多