碰撞(Collision)和触发事件(Trigger)

本文详细介绍了Unity中碰撞和触发器的相关事件及其使用方法。包括碰撞开始、持续碰撞、碰撞结束以及触发器的进入、停留和退出等事件的具体实现,并通过代码示例展示了如何在游戏开发中应用这些事件。

这里写图片描述


这里写图片描述


这里写图片描述


这里写图片描述

代码实例

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour
{

    void Start()
    {

    }

    void Update()
    {

    }

    void OnCollisionEnter(Collision other)
    {
        // 碰撞开始时会调用一次
        //Debug.Log("碰撞开始");
    }

    void OnCollisionStay(Collision other)
    {
        // 持续碰撞时会一直调用
        //Debug.Log("持续碰撞");

        // 检测和谁发生了碰撞
        if (string.Equals("Cube (1)", other.gameObject.name))
        {
            Debug.Log("产生火花");
        }
    }
    void OnCollisionExit(Collision other)
    {
        // 碰撞结束时会调用一次
        //Debug.Log("碰撞结束");
    }



    // 触发器的三个事件
    void OnTriggerEnter(Collider other)
    {
        // 刚刚进入触发范围时调用一次
        Debug.Log("进入触发范围");
    }

    void OnTriggerStay(Collider other)
    {
        // 一直在触发范围时持续调用
        Debug.Log("在触发范围");
    }

    void OnTriggerExit(Collider other)
    {
        // 离开触发范围时调用一次
        Debug.Log("离开触发范围");
    }
}
### 实现 UE5 中开启碰撞后瞬间触发事件 在 Unreal Engine 5 (UE5) 中,为了实现在启用碰撞之后立即触碰触发事件的功能,可以利用 `OnComponentBeginOverlap` `OnComponentEndOverlap` 函数来监听物体进入离开触发区域的行为。以下是具体方法: #### 使用蓝图实现 如果通过蓝图开发,则可以通过以下方式设置触发器行为: 1. 创建一个静态网格体组件并将其标记为可触发(Set as Trigger)。 2. 添加事件节点 `Event Begin Overlap` 来处理当其他对象首次接触该触发器时的动作[^3]。 ```blueprint // 节点连接逻辑如下: Static Mesh Component -> Set to Simulate Physics or Kinematic if needed. Collision Presets -> Custom Collision Response Table with appropriate channels set up. Add Event: "Begin Overlap" Input Components: - Overlapped Component - Other Actor - Other Comp - Direction Vector Action Block inside this event can include any desired functionality such as spawning effects, playing sounds etc., which should occur immediately once overlap starts. ``` #### 编码实现 C++ 对于更复杂的场景或者需要脚本控制的情况,在C++中定义自定义类继承于AActor或其他基础类别,并重写虚函数用于捕捉这些交互时刻: ```cpp #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "MyTriggerVolume.generated.h" UCLASS() class MYPROJECT_API AMyTriggerVolume : public AActor { GENERATED_BODY() public: // Sets default values for this actor's properties AMyTriggerVolume(); protected: UPROPERTY(VisibleAnywhere) class UBoxComponent* BoxCollider; virtual void BeginPlay() override; private: UFUNCTION() void OnOverlapBegin(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); }; AMyTriggerVolume::AMyTriggerVolume(){ PrimaryActorTick.bCanEverTick = true; BoxCollider = CreateDefaultSubobject<UBoxComponent>(TEXT("Box Collider")); RootComponent = BoxCollider; BoxCollider->SetGenerateOverlapEvents(true); } void AMyTriggerVolume::BeginPlay(){ Super::BeginPlay(); } void AMyTriggerVolume::OnOverlapBegin(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult){ if(!OtherActor || !OtherComp){return;} GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("An Object has entered the volume!")); } ``` 以上代码片段展示了如何创建一个简单的触发体积以及响应其上的重叠事件[^4]。 #### 关键注意事项 - **确保碰撞通道配置正确**: 需要确认所使用的Actor设置了合适的物理材质与反应规则以便能够检测到预期类型的实体之间的相互作用[^5]. - **性能优化考量**:频繁调用的回调可能带来额外开销,因此建议仅针对必要的游戏物件激活此类功能,并考虑延迟执行某些视觉反馈以减少即时运算负担。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值