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

Godot 4 3D GDScript:如何获取碰撞对象及检测碰撞状态

碰撞检测与对象名称获取实现方案

核心前提准备

  • 确保玩家对象和目标对象都添加了碰撞体组件(如Unity的Collider、Godot的Area2D/CollisionShape2D),根据需求选择:要无阻挡触发就开触发器,要物理阻挡就用普通碰撞
  • 确认目标对象与玩家的图层在碰撞矩阵中设置为可检测,避免图层屏蔽导致检测失效

分引擎实现示例

Unity(C#)

在目标对象上挂载以下脚本,监听碰撞/触发事件:

using UnityEngine;

public class TriggerVariableChanger : MonoBehaviour
{
    public int targetVariable = 0;

    // 触发器进入(无物理阻挡)
    private void OnTriggerEnter(Collider other)
    {
        string colliderName = other.gameObject.name;
        if (colliderName == "Player")
        {
            targetVariable += 1;
            Debug.Log($"触发对象:{colliderName},当前变量值:{targetVariable}");
        }
    }

    // 普通碰撞进入(有物理阻挡)
    private void OnCollisionEnter(Collision collision)
    {
        string colliderName = collision.gameObject.name;
        if (colliderName == "Player")
        {
            targetVariable += 1;
            Debug.Log($"碰撞对象:{colliderName},当前变量值:{targetVariable}");
        }
    }
}
  • 触发器模式需勾选碰撞体的Is Trigger;普通碰撞模式需至少一方带Rigidbody(静态对象可勾Kinematic)

Godot(GDScript)

给目标对象添加Area2D+CollisionShape2D,挂载脚本:

extends Area2D

var target_variable = 0

func _on_body_entered(body):
    var collider_name = body.name
    if collider_name == "Player":
        target_variable += 1
        print("触发对象:%s,当前变量值:%d" % [collider_name, target_variable])

# 需在编辑器中手动连接Area2D的body_entered信号到该函数
  • 若要物理碰撞而非触发,改用CollisionObject2D节点,监听body_collision_entered信号

Phaser 3(JavaScript)

在场景中设置碰撞检测逻辑:

class GameScene extends Phaser.Scene {
    constructor() {
        super('GameScene');
        this.targetVariable = 0;
    }

    create() {
        this.player = this.physics.add.sprite(100, 100, 'player');
        this.targetObj = this.physics.add.sprite(300, 300, 'target');

        // 碰撞检测(带物理阻挡)
        this.physics.add.collider(this.player, this.targetObj, this.onCollide, null, this);
        // 或重叠检测(类似触发器):
        // this.physics.add.overlap(this.player, this.targetObj, this.onCollide, null, this);
    }

    onCollide(player, target) {
        let colliderName = target.name;
        this.targetVariable += 1;
        console.log(`碰撞对象:${colliderName},当前变量值:${this.targetVariable}`);
        // 如需单次触发,可移除碰撞检测:
        // this.physics.world.removeCollider(player.body.colliders[0]);
    }
}

实用注意事项

  • 优先用**标签(Tag)**替代名称判断,复制对象会自动给名称加后缀(如Target(1)),标签更稳定
  • 变量建议存在全局管理类或玩家对象中,避免每个目标单独维护
  • 开启引擎的碰撞调试视图(如Unity Gizmos、Godot可见碰撞形状),确认碰撞体范围正确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 01:55:02