Trigger 如何設定觸發條件

[复制链接]
查看2857 | 回复6 | 2019-4-19 15:41:35 | 显示全部楼层 |阅读模式
我設了一個 Trigger Box,想說當玩家走進這個空間就顯示提示圖片
目前測試結果,當玩家走進來是沒問題顯示提示圖片沒問題
但問題是當敵人也走進來的時候也會顯示,不知如何修改
判定只有玩家進入才會觸發

///////////////// AManual_Trigger.h /////////////////

#include "CoreMinimal.h"
#include "Engine/TriggerBox.h"
#include "Manual_Trigger.generated.h"

UCLASS()
class ACTGAME_API AManual_Trigger : public ATriggerBox
{
    GENERATED_BODY()
            
protected:

    // Called when the game starts or when spawned
    virtual void BeginPlay() override;

public:



    // constructor sets default values for this actor's properties
    AManual_Trigger();

    // overlap begin function
    UFUNCTION()
        void OnOverlapBegin(class AActor* OverlappedActor, class AActor* OtherActor);

    // overlap end function
    UFUNCTION()
        void OnOverlapEnd(class AActor* OverlappedActor, class AActor* OtherActor);
   


    // Reference UMG Asset in the Editor
    UPROPERTY(EditAnywhere)
        TSubclassOf<class UUserWidget> HelpWidgetClass;

    // declare widget
    class UUserWidget* InfoWidget;

};



///////////////// AManual_Trigger.cpp /////////////////

#include "Manual_Trigger.h"
#include "DrawDebugHelpers.h"
#include "Blueprint/UserWidget.h"


AManual_Trigger::AManual_Trigger()
{
    //Register Events
    OnActorBeginOverlap.AddDynamic(this, &AManual_Trigger::OnOverlapBegin);
    OnActorEndOverlap.AddDynamic(this, &AManual_Trigger::OnOverlapEnd);
}

void AManual_Trigger::BeginPlay()
{
    Super::BeginPlay();

    DrawDebugBox(GetWorld(), GetActorLocation(), GetActorScale() * 100, FColor::Cyan, true, -1, 0, 5);
}



void AManual_Trigger::OnOverlapBegin(AActor * OverlappedActor, AActor * OtherActor)
{
    InfoWidget = CreateWidget<UUserWidget>(GetWorld(), HelpWidgetClass);
    if (OtherActor && (OtherActor != this))
    {
        InfoWidget->AddToViewport();
    }
}

void AManual_Trigger::OnOverlapEnd(AActor * OverlappedActor, AActor * OtherActor)
{
    if (OtherActor && (OtherActor != this))
    {
        InfoWidget->RemoveFromViewport();
    }

}


letian100 | 2019-4-20 21:30:32 | 显示全部楼层
看不懂,只会用蓝图  On Actor Begin Overlap 事件   
回复 支持 反对

使用道具 举报

rrfetch | 2019-4-21 20:39:19 | 显示全部楼层
一般我们可以把 OtherActor 再细化一下。
比如你的玩家是你创建的 APlayer 类,可以

  1. APlayer * myPlayer = Cast<APlayer>(OtherActor);

  2. if (myPlayer && (myPlayer != this))
  3. {
  4.    InfoWidget->AddToViewport();
  5. }
复制代码


如果有多个同样的类型,比如多个 ATank 类的敌人,那你可以在编辑器里给每个 Tank 分配
一个唯一的 Tag,然后用 ActorHasTag() 函数在游戏中查询

http://api.unrealengine.com/INT/API/Runtime/Engine/GameFramework/AActor/ActorHasTag/index.html



  1. if (OtherActor && (OtherActor != this))
  2. {
  3.     if (OtherActor->ActorHasTag(TEXT("BossTank")))
  4.     {
  5.         InfoWidget->RemoveFromViewport();
  6.     }
  7. }

复制代码

评分

参与人数 1能量币 +16 收起 理由
letian100 + 16 很给力!技术贴,感谢分享

查看全部评分

回复 支持 反对

使用道具 举报

mknmknmk | 2019-4-23 14:43:31 | 显示全部楼层
组件 ,接口 ,actor tag 和 componet tag, 多态
回复 支持 反对

使用道具 举报

cow1330 | 2019-4-26 17:56:52 | 显示全部楼层
tag 有辦法在C++中先預設嗎,我打算先在操作腳色,先加上TAG 「PLAYER」
目前找到的語法是 ComponentTags.Add(FName("PLAYER"));
但試了一直無法直接加上,可以請教該如何設嗎 我的命名是 CharacterBase.h
回复 支持 反对

使用道具 举报

pilindec1 | 2019-6-11 14:24:21 | 显示全部楼层
虽然我只是用蓝图,但其实只要你把玩家和敌人的tag 分开,或姐 弄两个属性(玩家和敌人)这样,你的对像目标只对玩家有效就好
回复 支持 反对

使用道具 举报

GameRay | 2019-7-30 12:00:48 | 显示全部楼层
通过属于玩家类还是怪物类
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

36

主题

77

回帖

256

积分

初阶编码师

积分
256