---@class BP_Key_C:AActor ---@field Plane UStaticMeshComponent ---@field StaticMesh UStaticMeshComponent ---@field Key USceneComponent ---@field ParticleSystem UParticleSystemComponent ---@field Scene USceneComponent ---@field Sphere USphereComponent ---@field DefaultSceneRoot USceneComponent ---@field RotatorSpeed float ---@field KeyColor FLinearColor ---@field bIsRealKey bool --Edit Below-- ---@type BP_Key_C local BP_Key = { bEnableKeyPickup = true; BeginPos = {X= 0., Y = 0., Z = 0.}; IsVisibility = true; -- 丢到地上 false则为丢在玩家正前方 bThrowToGround = false; }; function BP_Key:ReceiveTick(DeltaTime) self.SuperClass.ReceiveTick(self, DeltaTime); if not UGCGameSystem.IsServer() then self.Key:K2_AddLocalRotation({Pitch = 0., Yaw = DeltaTime * self.RotatorSpeed, Row = 0.}) end end function BP_Key:ReceiveBeginPlay() self.SuperClass.ReceiveBeginPlay(self); if self:HasAuthority() then self.BeginPos = VectorHelper.ToLuaTable(self:K2_GetActorLocation()) self.Sphere.OnComponentBeginOverlap:Add(self.SphereOverlap, self) UGCEventSystem.AddListener(EventEnum.ResetKey, self.ResetKey, self) UGCEventSystem.AddListener(EventEnum.KeyOwnerDead, self.LeaveBehindKey, self) UGCEventSystem.AddListener(EventEnum.KeyOwnerChange, self.KeyOwnerChange, self) else if UGCGameSystem.GameState then self:SetKeyVisibility(UGCGameSystem.GameState:GetKeyOwner() <= 0) end UGCLogSystem.Log("[BP_Key_ReceiveBeginPlay]") local TraceWidget = UserWidget.NewWidgetObjectBP(UGCSystemLibrary.GetLocalPlayerController(), ObjectPathTable.TraceTargetKey_Class) TraceWidget:AddToViewport(WidgetConfig.EUILayerGroup.Medium) self:SetTargetTraceWidget(TraceWidget) TraceWidget:SetKey(self, self.KeyColor) UGCLogSystem.Log("[BP_Key_ReceiveBeginPlay] Finish") end end function BP_Key:KeyOwnerChange(NewOwnerPlayerKey) if self.bIsRealKey then -- UGCLogSystem.Log("[BP_Key_KeyOwnerChange] NewOwnerPlayerKey:%d", NewOwnerPlayerKey) if NewOwnerPlayerKey < 0 then self:EnableKeyPickup(true) end end end function BP_Key:LeaveBehindKey(TargetPos) if self.bIsRealKey then -- UGCLogSystem.Log("[BP_Key_LeaveBehindKey]") if TargetPos then -------------------- if self.bThrowToGround then local EndPos = {X = TargetPos.X, Y = TargetPos.Y, Z = TargetPos.Z - 3000} local ObjectTypes = {ECollisionChannel.ECC_WorldStatic}; local bHit, HitResult = KismetSystemLibrary.LineTraceSingleForObjects(self, TargetPos, EndPos, ObjectTypes, false, {}, EDrawDebugTrace.None) if bHit then TargetPos = HitResult.ImpactPoint end end -------------------- self:K2_SetActorLocation(TargetPos) UGCSendRPCSystem.ActorRPCNotify(nil, self, "K2_SetActorLocation", VectorHelper.ToLuaTable(TargetPos)) end -- self:EnableKeyPickup(true) end end function BP_Key:ResetKey() UGCLogSystem.Log("[BP_Key_ResetKey]") self:K2_SetActorLocation(self.BeginPos) UGCSendRPCSystem.ActorRPCNotify(nil, self, "K2_SetActorLocation", self.BeginPos) self:EnableKeyPickup(true) UGCSendRPCSystem.ActorRPCNotify(nil, self, "SetKeyVisibility", true) end function BP_Key:EnableKeyPickup(IsEnable) if IsEnable ~= self.bEnableKeyPickup then self.bEnableKeyPickup = IsEnable if self.bEnableKeyPickup then UGCSendRPCSystem.ActorRPCNotify(nil, self, "SetKeyVisibility", true) UGCSendRPCSystem.ActorRPCNotify(nil, self, "SetTargetWidgetVis", true) else UGCSendRPCSystem.ActorRPCNotify(nil, self, "SetKeyVisibility", false) end end end function BP_Key:GetbEnableKeyPickup() return self.bEnableKeyPickup end function BP_Key:SetKeyVisibility(InIsVisibility) self.IsVisibility = InIsVisibility self.DefaultSceneRoot:SetVisibility(self.IsVisibility, true) end -- (OverlappedComponent:UPrimitiveComponent,OtherActor:AActor,OtherComp:UPrimitiveComponent,OtherBodyIndex:int32,bFromSweep:bool,SweepResult:FHitResult) function BP_Key:SphereOverlap(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex, bFromSweep, SweepResult) if self.bEnableKeyPickup == false then return end if OtherActor.PlayerKey and OtherActor:IsAlive() then self:EnableKeyPickup(false) UGCSendRPCSystem.ActorRPCNotify(nil, self, "SetKeyVisibility", false) if self.bIsRealKey then -- 玩家捡到真的钥匙 UGCGameSystem.GameState:UpdateKeyOwner(OtherActor.PlayerKey) UGCSendRPCSystem.RPCEvent(nil, EventEnum.AddTip, TipConfig.TipType.PlayerPickRealKey, OtherActor.PlayerKey) else -- 玩家捡到假的钥匙 UGCSendRPCSystem.ActorRPCNotify(nil, self, "SetKeyVisibility", false) UGCSendRPCSystem.ActorRPCNotify(nil, self, "SetTargetWidgetVis", false) UGCSendRPCSystem.RPCEvent(nil, EventEnum.AddTip, TipConfig.TipType.PlayerPickFakeKey, OtherActor.PlayerKey) end end end function BP_Key:SetTargetTraceWidget(Widget) self.TargetWidget = Widget self:SetTargetWidgetVis(self.IsVisibility) end function BP_Key:GetTargetWidget() return self.TargetWidget end function BP_Key:SetTargetWidgetVis(IsShow) if self.TargetWidget then if IsShow then self.TargetWidget:SetVisibility(ESlateVisibility.SelfHitTestInvisible) else self.TargetWidget:SetVisibility(ESlateVisibility.Hidden) end end end --- 设置是否位置真的钥匙 function BP_Key:SetIsRealKey(IsReal) self.bIsRealKey = IsReal end function BP_Key:GetIsRealKey() return self.bIsRealKey end return BP_Key;