UE4_代理示例_时钟

2023-11-11

时钟
TimeOfDayHandler
  注册代理,执行代理

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "GameFramework/Actor.h"
#include "TimeOfDayHandler.generated.h"

// 定义了带有两个参数的代理,FOnTimeChangedSignature
DECLARE_MULTICAST_DELEGATE_TwoParams(FOnTimeChangedSignature, int32, int32)

UCLASS()
class BLANKUECPP_API ATimeOfDayHandler : public AActor
{
    GENERATED_BODY()

public: 
    // Sets default values for this actor's properties
    ATimeOfDayHandler();

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

public: 
    // Called every frame
    virtual void Tick(float DeltaTime) override;

    // 钟表走的速度
    UPROPERTY()
       int32 TimeScale;

    UPROPERTY()
        int32 Hours;

    UPROPERTY()
        int32 Minutes;

    // 经过的时间
    UPROPERTY()
        float ElapsedSeconds;

    // 声明代理
    FOnTimeChangedSignature OnTimeChanged;

};

// Fill out your copyright notice in the Description page of Project Settings.

#include "BlankUECPP.h"
#include "TimeOfDayHandler.h"


// Sets default values
ATimeOfDayHandler::ATimeOfDayHandler()
{
    // Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
    PrimaryActorTick.bCanEverTick = true;

    // 让分钟当秒走
    TimeScale = 60;
    Hours = 0;
    Minutes = 0;
    ElapsedSeconds = 0.0f;

    RootComponent = CreateDefaultSubobject<UBillboardComponent>(TEXT("BillBoard"));


}

// Called when the game starts or when spawned
void ATimeOfDayHandler::BeginPlay()
{
    Super::BeginPlay();

}

// Called every frame
void ATimeOfDayHandler::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
    //GEngine->AddOnScreenDebugMessage(-1, 0.5f, FColor::Red, FString::Printf(TEXT("%f"),DeltaTime);
    ElapsedSeconds += (DeltaTime*TimeScale);
    if (ElapsedSeconds >= 60)
    {
        ElapsedSeconds -= 60;
        Minutes++;
    }

    if (Minutes >= 60)
    {
        Minutes -= 60;
        Hours++;
    }

    GEngine->AddOnScreenDebugMessage(-1, 0.5f, FColor::Red, FString::Printf(TEXT("M:%d H:%d"), Minutes,Hours));

    // 执行代理,传出两个参数,传给绑定当前代理的函数
    // 是这一条语句让DemoClock里边的时钟一直不断的执行
    OnTimeChanged.Broadcast(Hours, Minutes);
}


DemoClock
   加载素材资源,绑定代理

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "GameFramework/Actor.h"
#include "DemoClock.generated.h"

UCLASS()
class BLANKUECPP_API ADemoClock : public AActor
{
    GENERATED_BODY()

public: 
    // Sets default values for this actor's properties
    ADemoClock();

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

public: 
    // Called every frame
    virtual void Tick(float DeltaTime) override;

    // 目标绑定函数
    void TimeChanged(int32 Hours,int32 Minutes);

public:
    UPROPERTY()
        UStaticMeshComponent* ClockFace;

    UPROPERTY()
        UStaticMeshComponent* HourHand;

    UPROPERTY()
        UStaticMeshComponent* MinuteHand;

    UPROPERTY()
        USceneComponent* HourHandle;

    UPROPERTY()
        USceneComponent* MinuteHandle;

    FDelegateHandle DelegateHandle;


};

// Fill out your copyright notice in the Description page of Project Settings.

#include "BlankUECPP.h"
#include "DemoClock.h"
#include "TimeOfDayHandler.h"

// Sets default values
ADemoClock::ADemoClock()
{
    // Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
    PrimaryActorTick.bCanEverTick = true;

    // SceneComponent 这个叫场景组件
    RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("SceneRoot"));
    HourHandle=CreateDefaultSubobject<USceneComponent>(TEXT("HourHandle"));
    MinuteHandle= CreateDefaultSubobject<USceneComponent>(TEXT("MinuteHandle"));

    ClockFace = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("ClockFace"));
    HourHand= CreateDefaultSubobject<UStaticMeshComponent>(TEXT("HourHand"));
    MinuteHand= CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MinuteHand"));

    ConstructorHelpers::FObjectFinder<UStaticMesh> meshAsset(TEXT("StaticMesh'/Engine/BasicShapes/Cylinder.Cylinder'"));

    if (meshAsset.Object)
    {
        ClockFace->SetStaticMesh(meshAsset.Object);
        HourHand->SetStaticMesh(meshAsset.Object);
        MinuteHand->SetStaticMesh(meshAsset.Object);
    }

    ClockFace->SetupAttachment(RootComponent);
    ClockFace->SetRelativeTransform(FTransform(FRotator(0,0,90),FVector(0,0,0),FVector(2,2,0.5)));


    HourHand->AttachToComponent(HourHandle,FAttachmentTransformRules::KeepRelativeTransform);
    MinuteHand->AttachToComponent(MinuteHandle, FAttachmentTransformRules::KeepRelativeTransform);

    HourHandle->SetupAttachment(RootComponent);
    MinuteHandle->SetupAttachment(RootComponent);

    HourHand->SetRelativeTransform(FTransform(FRotator(0, 0, 0), FVector(0, 55, 25), FVector(0.1, 0.1, 0.5)));
    MinuteHand->SetRelativeTransform(FTransform(FRotator(0, 0, 0), FVector(0, 60, 50), FVector(0.1, 0.1, 1)));

}

// Called when the game starts or when spawned
void ADemoClock::BeginPlay()
{
    Super::BeginPlay();
    TArray<AActor*> TimeOfDayHandlers;
    // 获得关卡中所有的ATimeOfDayHandle类型的Actor,并把他们放到TimeOfDayHandlers的数      组中。
    UGameplayStatics::GetAllActorsOfClass(GetWorld(),ATimeOfDayHandler::StaticClass(),TimeOfDayHandlers);

    if (TimeOfDayHandlers.Num() != 0)
    {
        // auto 可以自动推断timeOfDayHandler的类型
        auto timeOfDayHandler = Cast<ATimeOfDayHandler>(TimeOfDayHandlers[0]);
        // 这个是绑定当前代理
        DelegateHandle = timeOfDayHandler->OnTimeChanged.AddUObject(this, &ADemoClock::TimeChanged);
    }
}

// Called every frame
void ADemoClock::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

}

void ADemoClock::TimeChanged(int32 Hours, int32 Minutes)
{
    HourHandle->SetRelativeRotation(FRotator(-30*Hours,0,0));
    MinuteHandle->SetRelativeRotation(FRotator(-6*Minutes,0,0));
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UE4_代理示例_时钟 的相关文章

  • 我可以使用反射更改 C# 中的私有只读字段吗?

    我想知道 由于很多事情都可以使用反射完成 我可以在构造函数完成执行后更改私有只读字段吗 注 只是好奇 public class Foo private readonly int bar public Foo int num bar num
  • 如何在 C# 事件中区分更改是由代码还是由用户进行?

    我有一个简单的TextBox一开始是空的 我有一个简单的事件 TextChanged 可以知道用户何时更改了其中的任何内容TextBox 但是 如果我自己在代码中对其执行任何操作 该事件就会触发 喜欢设置textbox Text Test
  • 实体框架代码优先 - 在另一个文件中配置

    使用 Fluent API 将表到实体的映射分开的最佳方法是什么 以便它全部位于单独的类中 而不是内联在 OnModelCreating 方法中 我目前在做什么 public class FooContext DbContext prote
  • 字节到二进制字符串 C# - 显示所有 8 位数字

    我想在文本框中显示一个字节 现在我正在使用 Convert ToString MyVeryOwnByte 2 但是 当字节开头有 0 时 这些 0 就会被删除 例子 MyVeryOwnByte 00001110 Texbox shows g
  • __FUNCTION__ 宏的 C# 版本

    有人对 C FUNCTION 宏的 C 版本有好的解决方案吗 编译器似乎不喜欢它 尝试使用这个代替 System Reflection MethodBase GetCurrentMethod Name C 没有 LINE or FUNCTI
  • 使用 VSTO 更改 Outlook 设置

    我刚刚花了大约 4 个小时试图弄清楚如何以编程方式检索 设置 Microsoft Outlook 2010 的 Outlook 设置 我所说的 设置 是指文件 选项 邮件下的设置 我想做的是检索用户设置的设置列表 自动化我们每天需要在某些消
  • 如何避免选择项目时 winforms 树视图图标发生变化

    我正在一个小型 C Winforms 应用程序中尝试树视图 我已经以编程方式将 ImageList 分配给树视图 并且所有节点都很好地显示了它们的图标 but当我单击一个节点时 它的图标会发生变化 变为 ImageList 中的第一个图像
  • 防止复制构造和返回值引用的分配

    如果我有一个函数返回对类实例的引用 但我无法控制其源 比如说list
  • 当格式字符串包含“{”时,String.Format 异常

    我正在使用 VSTS 2008 C Net 2 0 执行以下语句时 String Format 语句抛出 FormatException 有什么想法是错误的吗 这是获取我正在使用的 template html 的位置 我想在 templat
  • 在 C# 中赋值后如何保留有关对象的信息?

    我一直在问我的想法可能是解决方案 https stackoverflow com questions 35254467 is it possible in c sharp to get the attributes attached to
  • C++ Primer 5th Edition 错误 bool 值没有指定最小大小?

    bool 的最小大小不应该是 1 个字节吗 这有点学术性的东西 尽管它们会转换为数字 并且 与其他所有事物一样 它们最终将基本上由计算机内存中的数字表示 但布尔值不是数字 你的bool可以取值true 或值false 即使您确实需要至少 1
  • 标准 C 中的 sizeof 与 sizeof()? [复制]

    这个问题在这里已经有答案了 我看到一些直接使用 sizeof 的代码 想知道它是否是标准 C 令我惊讶的是 它运行得很好 这是一个例子 include
  • 为什么 C 函数不能返回数组类型?

    我是 C 语言新手 想知道 为什么 C 函数不能返回数组类型 我知道数组名是数组第一个值的地址 而数组是 C 中的二等公民 您自己已经回答了这个问题 数组是二等公民 C 按值返回 数组不能按值传递 因此不能返回它们 至于为什么数组不能按值传
  • 如何从枚举中选择随机值?

    给定 C 中的任意枚举 如何选择随机值 我没有找到这个非常基本的问题 我会在一分钟内发布我的答案作为任何人的参考 但请随意发布你自己的答案 Array values Enum GetValues typeof Bar Random rand
  • 用 C# 编写的带有点击移动的 WPF 游戏

    我试图将标签网格移动到鼠标的位置 就像冒险游戏中的移动一样 理想情况下 我会在途中删除并重新绘制它们 但是 现在我只想弄清楚如何将 int 转换为厚度或 pointtoscreen 到目前为止我有 player XMove int Mous
  • 便携式终端

    有没有办法根据所使用的操作系统自动使用正确的 EOL 字符 我在想类似的事情std eol 我知道使用预处理器指令非常容易 但很好奇它是否已经可用 我感兴趣的是 我的应用程序中通常有一些消息 稍后我会将这些消息组合成一个字符串 并且我希望将
  • 宏观评价[重复]

    这个问题在这里已经有答案了 可能的重复 未定义的行为和序列点 https stackoverflow com questions 4176328 undefined behavior and sequence points 我无法理解以下宏
  • C++0x 中的新 unicode 字符

    我正在构建一个 API 它允许我获取各种编码的字符串 包括 utf8 utf16 utf32 和 wchar t 根据操作系统 可能是 utf32 或 utf16 新的 C 标准引入了新类型char16 t and char32 t没有这么
  • Windows 上 libcurl 的静态库[重复]

    这个问题在这里已经有答案了 如何将此库 libcurl 静态链接到 exe 我努力了 disable share enable static 没有帮助 我使用的是MingW32 有没有一种简单的方法来静态链接这个库 这样我的应用程序就不再有
  • ASP.NET Core:会话 ID 始终变化

    今天启动了一个全新的 ASP NET Core 网站 按照说明添加会话 我们在索引页上打印出会话 ID 它始终是唯一的 我认为这可能是 cookie 合规性 所以我在 Chrome 的高级设置和调试器中删除了所有 cookie 但横幅不会再

随机推荐

  • 周更计划----web安全学习

    本周做题 ctfshow web入门 信息搜集1 18 目录 web1 web2 web3 web4 web5 web6 web7 web8 web9 web10 web11 web12 web13 web14 web15 web16 we
  • mysql多表查询

    多表关系分类 一对一 任意一方添加外键 关联另外一方的主键 并且设置外键唯一unique 一对多 多对一 在多的一方建立外键 指向一的一方的主键 多对多 将两张表的主键提取出来建立一张中间表 直接查询 会产生无效的笛卡尔积 select f
  • physx选择显卡还是cpu_玩转显卡,再也不用担心被坑

    对于显卡 相信大家都不陌生 无论是玩游戏 还是从事专业的图形设计 有一块好显卡才能如有神助 所以 今天小编就来带大家认识一下显卡本卡 01 什么是显卡 从字面上理解显卡是显示接口卡 显卡英文全称Video card或Graphic card
  • 解决Maven打包报错Could not transfer artifact xxx.xxx找不到依赖的问题

    解决Maven打包报错Could not transfer artifact xxx xxx找不到依赖的问题 概述 方案一 方案二 方案三 作者使用的这种方案 命令事例 概述 当我用idea导入一个新的maven项目 配置好maven仓库
  • 浏览器控制台报错net::ERR_CONNECTION_RESET原因:

    浏览器控制台报错net ERR CONNECTION RESET原因 浏览器控制台报错net ERR CONNECTION RESET原因 浏览器控制台错误 101 net ERR CONNECTION RESET 的本身含义就是这个网站存
  • Web前端开发技术课程大作业,期末考试

    Web前端开发技术课程大作业 期末考试 作业要求 最终界面 部分代码呈现 index html login html index css login css swithpic js 完整代码素材下载 作业要求 网站前端程序不仅要能够把用户要
  • linux下使用sed命令将文件的LF转为CRLF

    linux下使用sed命令将文件的CRLF转为LF 只要将每行中 r变成空就OK 以下命令为将file中的CRLF转为LF sed i s r g file 以下命令为将目录中 c文件和 h文件中的CRLF转为LF find regex c
  • 牛客SQL34: 牛客直播各科目同时在线人数(最大值问题)

    牛客SQL34 牛客直播各科目同时在线人数 最大值问题 内容目录 牛客SQL34 牛客直播各科目同时在线人数 最大值问题 一 描述 二 思路解析 三 代码 四 问题思考 一 描述 牛客某页面推出了数据分析系列直播课程介绍 用户可以选择报名任
  • 考研OS备考

    本文主要是考研复试备考自用 所以课后习题答案主要是简答题部分 此外还有其他的简答补充 如果发现有误 欢迎在评论区或者私信指出 计算机操作系统 汤小丹慕课版 课后习题答案 考研备考 第1章 操作系统引论 第1章 课后习题答案 第1章 零碎知识
  • 性能计数器

    性能计数器 Performance Object Counter Description Processor processor Time 指处理器执行非闲置线程时间的百分比 测量处理器繁忙的时间 这个计数器设计成用来作为处理器活动的主要指
  • 成都亚恒丰创科技USB-CAN和CAN分析仪接口方式

    USB CAN和CAN分析仪接口方式 导语 随着现代汽车电子技术的飞速发展 CAN总线成为了汽车领域中最常用的通信协议 而在进行CAN总线的调试和分析时 CAN分析仪是一种必不可少的工具 本文将介绍USB CAN接口和CAN分析仪的基本原理
  • Spring参数校验--List<E>类型参数校验

    1 遇到的问题 今天开发接口 遇到请求参数固定为List
  • 2023年第三届能源、电力与电气工程国际会议 (CoEEPE 2023)

    会议简介 Brief Introduction 2023年第三届能源 电力与电气工程国际会议 CoEEPE 2023 会议时间 2023年11月22日 24日 召开地点 澳大利亚 墨尔本 大会官网 www coeepe org 2023年第
  • Javascript:谈谈JS的全局变量跟局部变量

    今天公司一个实习小妹子问我两段JS代码的区别 我想 好简单
  • 干货分享:六个知名的Go语言web框架

    框架一直是敏捷开发中的利器 能让开发者很快的上手并做出应用 甚至有的时候 脱离了框架 一些开发者都不会写程序了 成长总不会一蹴而就 从写出程序获取成就感 再到精通框架 快速构造应用 当这些方面都得心应手的时候 可以尝试改造一些框架 或是自己
  • 【华为OD机试】 阿里巴巴找黄金宝箱(I)【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上 无意中发现了强盗集团的藏宝地 藏宝地有编号从0 N的箱子 每个箱子上面贴有一个数字 箱子中可能有一个黄金宝箱 黄金宝箱满足排在它
  • BurpSuite实战教程01-web渗透安全测试(靶场搭建及常见漏洞攻防)

    渗透测试 渗透测试 Penetration test 即安全工程师模拟黑客 在合法授权范围内 通过信息搜集 漏洞挖掘 权限提升等行为 对目标对象进行安全测试 或攻击 最终找出安全风险并输出测试报告 Web渗透测试分为白盒测试和黑盒测试 白盒
  • 在浏览器输入URL,按下回车之后的流程?

    1 在浏览器中输入一个URL 2 查找本地配置文件 如果之前有访问过 浏览器会进行缓存 如果没有的话会在本机域名解析文件hosts文件中寻找是否存在该URL的域名映射 如Windows的配置文件 C Windows System32 dri
  • NIO初级例子

    NIO初级例子 前言 一 代码撸上 前言 使用window系统环境 window 环境测试 测试使用telnet ip 端口 win R cmd 输入telnet id port Ctrl send 发送信息 缺点 无阻塞 但是cpu空转
  • UE4_代理示例_时钟

    时钟 TimeOfDayHandler 注册代理 执行代理 Fill out your copyright notice in the Description page of Project Settings pragma once inc