UE4 如何使用C++代码实现 在指定范围内随机生成同一个种类的不同物品(怪物,NPC,拾取物)的 自定义蓝图

2023-11-19

一、引言

    在游戏世界中有特别多的物品,NPC,怪物。使用UE4中的蓝图我们可以摆放这些事务,但是如何在指定范围内随机生成同一个种类的不同事物呢,这就需要UE4 实现 C++自定义 蓝图功能。

二、构思

    首先我们构思一下实现上诉功能,应该怎么做。

    1.想要在指定范围内,我们需要一个范围,这里我用 UBoxComponent,用于指定物品或怪物的生成范围;

    2.生成的物品的种类是不同的,那么需要定义一个模板类对象;

    3.我们需要随机生成物品,则可用数组,通过随机生成下标实现获取物品的效果。

    4.最重要的来了:想要动态生成物品到世界中,光靠C++代码是很困难的,那么我们需要到蓝图中也去调用一下。也就是说C++函数实现一半功能,蓝图中调用该函数实现另外一半功能。

三、实现效果

如果需要拾取物蓝图,只需要在本蓝图的基础上复制,然后更改Actor即可。

这里提供怪物蓝图设置预览:

场景布置预览:

实际产出效果如下:

四、代码编写

头文件代码如下:
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "SpawnVolume.generated.h"

UCLASS()
class MYFIRSTPROJECT_API ASpawnVolume : public AActor
{
    GENERATED_BODY()
    
public:    
    // Sets default values for this actor's properties
    ASpawnVolume();

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpawningBox")
    class UBoxComponent* SpawningBox;

    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Spawning")
    TSubclassOf<AActor> Actor_1;

    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Spawning")
    TSubclassOf<AActor> Actor_2;

    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Spawning")
    TSubclassOf<AActor> Actor_3;

    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Spawning")
    TSubclassOf<AActor> Actor_4;

    TArray<TSubclassOf<AActor>> SpawnArray;

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

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

    UFUNCTION(BlueprintPure,Category = "Spawning")
    FVector GetSpawnPonit();

    UFUNCTION(BlueprintPure, Category = "Spawning")
    TSubclassOf<AActor> GetSpawnActor();

    UFUNCTION(BlueprintNativeEvent,BlueprintCallable,Category = "Spawning")
    void SpawnOurActor(UClass* ToSpawn, const FVector& Location);
};

 

Cpp代码如下:


#include "SpawnVolume.h"
#include "Components/BoxComponent.h"
#include "Kismet/KismetMathLibrary.h"
#include "Engine/World.h"
#include "Critter.h"
#include "Enemy.h"
#include "AIController.h"
// Sets default values
ASpawnVolume::ASpawnVolume()
{
     // 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;
    SpawningBox = CreateDefaultSubobject<UBoxComponent>(TEXT("SpawningBox"));

}

// Called when the game starts or when spawned
void ASpawnVolume::BeginPlay()
{
    Super::BeginPlay();
    
    if (Actor_1) {
        SpawnArray.Add(Actor_1);
    }
    if (Actor_2) {
        SpawnArray.Add(Actor_2);
    }
    if (Actor_3) {
        SpawnArray.Add(Actor_3);
    }
    if (Actor_4) {
        SpawnArray.Add(Actor_4);
    }
}

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

}

FVector ASpawnVolume::GetSpawnPonit()
{

    FVector Extent = SpawningBox->GetScaledBoxExtent();
    FVector Origin = SpawningBox->GetComponentLocation();

    FVector Point = UKismetMathLibrary::RandomPointInBoundingBox(Origin,Extent);

    return Point;
}

void ASpawnVolume::SpawnOurActor_Implementation(UClass* ToSpawn,const FVector& Location)
{
    if (ToSpawn)
    {
        UWorld* World = GetWorld();
        FActorSpawnParameters SpawnParams;
        if (World) 
        {
            AActor* Actor = World->SpawnActor<AActor>(ToSpawn, Location, FRotator(0.f), SpawnParams);
            AEnemy* Enemy = Cast<AEnemy>(Actor);
            if (Enemy) {
                //生成默认AI控制器
                Enemy->SpawnDefaultController();
                
                AAIController* AICont = Cast<AAIController>(Enemy->GetController());
                if (AICont) {
                    Enemy->AIController = AICont;
                }
            }
        }
    }
}

TSubclassOf<AActor> ASpawnVolume::GetSpawnActor() {

    if (SpawnArray.Num() > 0) {
        int32 Selection = FMath::RandRange(0, SpawnArray.Num() - 1);
        return SpawnArray[Selection];
    }
    else {
        return nullptr;
    }
}

    

   4.蓝图调用:

 

 

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

UE4 如何使用C++代码实现 在指定范围内随机生成同一个种类的不同物品(怪物,NPC,拾取物)的 自定义蓝图 的相关文章

  • UE4 跑酷游戏-得分机制

    得分机制 1 这次我们要做的是得分 根据人物跑过的地板来得取分数 首先进入我们的第三人称游戏模式里面 创建一些变量 2 退出第三人称游戏模式后 进入主地板蓝图后 在销毁地板之前写读取人物跑i过地板块数进行得分
  • 虚幻C++ http请求

    直接上代码 Fill out your copyright notice in the Description page of Project Settings pragma once include CoreMinimal h inclu
  • UE4 材质 生成随机数

    参考之前的文章中关于随机数和noize的 https papalqi cn 201707 cid 558 html
  • 安装VS2019 提示 Visual C++ 2015-2019 x64 redistributable安装失败

    最近安装VS2019和UE4的时候总是弹出提示框 忘记截图了 找了张类似的 点击OK之后会弹出下面的对话框 度娘给出茫茫多的解决方案 大部分都是说缺少vc 2015或者vc 2017的相应库 需要先安装低版本库 试了大半天都不能解决 吐血
  • 虚幻4学习笔记(5)开关门、使用蓝图开关门、按键和鼠标点击开关门

    开关门 开关门 前置准备 单独设置开关门 设置时间轴 定义蓝图类 完成开关门 针对中心轴 在物体中心 不在右下角的调整方法 世界坐标轴 绝对坐标轴 不会改变 设置按键开关门 鼠标开关门 B站UP谌嘉诚课程 https www bilibil
  • 【UE4】多视角相机捕获图像如何同屏拼接在一起

    前段时间有个Demo移植的需求 需要把实时裸眼3D多视角立体显示的Unity版本移植到UE4 主要包含后处理Shader 相机矩阵变换 多视角画面平铺拼接三大部分 10 10 多视角相机捕获图拼接效果 对现有的多窗口显示方法进行查阅后 发现
  • UE4-DeltaTime(时间增量)

    UE4 DeltaTime 时间增量 Time 2020年10月14日13 33 52 Author Yblackd UE4 DeltaTime 1 结论 2 deltaTime 增量时间 3 为什么乘以 时间增量 4 注意误区 5 参考
  • 11月8日 改良射线,蓝图 UE4斯坦福 学习笔记

    修改射线类型 更改了昨天的射线类型 void USInteractionComponent PrimaryInteract 射线 FHitResult FHit 碰撞体 FCollisionObjectQueryParams ObjectQ
  • 【待续】【UE4笔记】 L10地形编辑器

    一 地形界面 包含了管理 雕刻和描画功能 1 创建新项 2 雕刻 改变地形高度 顶点位置 3 描画 分层地形材质 二 编辑样条 调节参数 添加材质 效果如下
  • 使用UE4(UnrealEngine)创建工程

    UE4系列文章目录 文章目录 UE4系列文章目录 前言 一 步骤 1 打开UE4软件 2 新建工程 3 选择游戏类型模板 4 项目设置 运行游戏 前言 使用UE4 UnrealEngine 创建工程 我这里的ue4版本是4 27 2 一 步
  • UE44如何使用Geometry(BSP)笔刷,快速创建游戏原型?

    游戏原型搭建 如何快速搭建场景 一 好处1 防止同时也放大了对应的网格 如果像unity里面一样 R放大缩小以后 网格也会对应拉伸 失真 导致了材质会被拉伸或者缩小 1 选择Geometry 在BrushSetting里面 将X Y Z对应
  • UE4/UE5 动画控制

    工程下载 https mbd pub o bread ZJ2cm5pu 蓝图控制sequence播放 倒播动画 设置开启鼠标指针 开启鼠标事件 在场景中进行过场动画制作 设置控制事件
  • UE4 通过Echarts实现各种统计图

    主要内容 本文主要讲解UE4 UMG向网页发送数据 通过WebBrowser插件将用Echarts定制好的统计图在UE4内展现出来 达到数据可视化的效果 本文主要演示柱形图的效果 其它类型的统计图可以结合Echarts官方案列以及文档自行修
  • UE4 UI界面

    在UE4中创建UI界面是创建一个widget 进去之后左上角是选择控件 找到直接拖上去 中间那个框代表的就是我们的屏幕 在button中打字也就是给button命名时需要在上面在拖一个text控件 更好的排版可以改变锚点 这四个就类似与边距
  • 4,引擎初始化--(4)加载地图--2,创建world(学习资料来源于UE4游戏框架)

    加载地图时 创建完默认GameMode 就要创建world了 首先读取到package 创建world 从这里可以看到 地图是可以在初始化建立的 GameInstance是在运行起来后建立 两者是独立的 设为当前World 并设定为全局GW
  • 11月11日 自定义Events,将自定义Events分配给UI,给UI添加动画 UE4斯坦福 学习笔记

    自定义Events 在AttributeComponent的 h头文件上加上代码 自定义Event DECLARE DYNAMIC MULTICAST DELEGATE FourParams FOnHealthChanged AActor
  • UE4 关于使用Webbrowser插件遇到的问题以及解决办法

    1 无法播放网页视频 这是因为UE4的WebBrowser自带的cef3为3071版本 默认不支持h364等直播流 导致web里的直播流无法播放 解决办法 第一种办法 重新编译了cef源码 改成支持H 264 然后在UE4安装目录下替换相关
  • UE4 制作导出Content目录下某个文件夹内所有模型的六视图并将模型资源文件复制到指定文件夹的插件

    一 新建空白插件 在Bulid cs内加入两个模块 EditorSubsystem UnrealEd PublicDependencyModuleNames AddRange new string Core EditorSubsystem
  • UE4 解决景深效果闪烁问题

    原因 1 模型的垂直竖线 造成抗锯齿算法对竖线的渲染计算 处于一种不稳定的状态 因此闪烁 解决办法 使用LOD 用贴图去替代线条模型 2 材质的法线贴图 当法线贴图含有垂直竖线的纹理效果 也会造成闪烁 比如这种幕墙材质 解决办法 关闭或动态
  • Wave x Incredibuild

    Wave 公司简介 Wave 是一家虚拟娱乐公司 致力于帮助艺术家和粉丝通过协作创造出世界上最具互动性的现场表演体验 Wave 整合了最顶尖的现场音乐 游戏和广播技术 将现场音乐表演转化为沉浸式虚拟体验 便于观众通过 YouTube Twi

随机推荐

  • 【数据结构】【王道408】——PPT截图与思维导图

    自用视频PPT截图 视频网址王道B站链接 23考研 408新增考点 并查集 红黑树 2023年408真题数据结构篇 408考纲解读 考纲变化 目录 第一章 绪论 第二章 线性表 顺序表 单链表 双链表 循环链表 静态链表 差别 第三章 栈
  • python大一考试知识点_Python复习知识点总结(针对校招

    正文 Python是门动态语言 运行时候采取检查数据类型 Python解释器 让其他程序运行起来的程序 Python解释器读取程序 按照其中的语句顺序执行 并得出结果 做了什么 解释器将语句翻译成一组字节码指令 pyc 字节码运行速度比源代
  • 图片撕纸效果处理

  • 自动化办公神器!用Python批量识别发票并录入到Excel表格!可以讨财务女神开心了!

    故事的开始 今天去财务拿上个月的工资条核对 发现女神一脸闷闷不乐 好像天要塌下来一样 我对完工资就问 女神 你咋不开心 不是马上就要发工资了嘛 女神说 老板刚给我派了个任务 让我把上个月这个月的发票都做一个Excel表格 今天下班前给他 这
  • windows10下编译boost1.74

    系列文章目录 文章目录 系列文章目录 前言 一 准备 二 编译步骤 前言 最近公司的项目中用到boost1 74 我机器上已经编译了boost1 79 为了配合项目无奈只有重新编译boost1 74 一 准备 1 visual studio
  • VMware镜像文件下载

    VMware镜像文件下载 http blog sina com cn s blog 517c21c00102x5ja html 貌似Centos 6不能下载啊 其他的没有测试
  • 12个真实项目实战带你玩转Java并发编程

    这篇博客 我会总结如下内容 满满的干货 篇幅可能会很长 做好心理准备 Immutable Object 不可变对象模式 在不引入锁的条件下 能保证访问共享变量时是线程安全的 缺点是会频繁的创建变量 Guarded Suspension 保护
  • 什么是架构,架构的本质是什么

    不论是开发人员还是架构师 我们都一直在跟软件系统打交道 架构是在工作中出现最频繁的术语之一 那么 到底什么是架构 你可能有自己的答案 也有可能没有答案 对 架构 的理解需要我们不断在实践中思考 归纳 演绎 形成自己的认知 一 什么是软件架构
  • Dinic算法学至大佬,学以致用【挂上相应的题目】

    这个巨佬讲的超级厉害 学起来很快 还有优化的说呢 Dinic算法 研究总结 网络流 网络流是信息学竞赛中的常见类型 笔者刚学习了最大流Dinic算法 简单记录一下 网络流基本概念 什么是网络流 在一个有向图上选择一个源点 一个汇点 每一条边
  • 11年做安卓开发至今,我失业了,我跟CSDN的缘分

    今天来写篇自己的文章 自己工作的文章 11年毕业到现在 我彻底失业了 是真的失业了 不过失业我觉得没什么可怕 至少干了这些年 也攒下了一些生活费 至少饿不死就行了 我失业也是因为自己有业 并不害怕 从11年做开发 那个时候就边做开发 边思考
  • 学习-Java输入输出之File类之获取文件信息(1)

    任务描述 本关任务 判断给定的字符串是目录 文件路径还是其它 相关知识 File 对象既可以表示文件 又可以表示目录 下面我们来了解一下更多关于 File 对象的操作 获取文件信息常用方法 已知在C Users yy Desktop fil
  • Unity编辑器扩展——进度条显示通用方法

    在我们使用Unity编辑器扩展做一些批处理的工具时 通常会需要显示一个进度条 这样不会让Unity一直卡住不动 使得使用者不知道当前的进展 那么如何显示进度条呢 涉及的相关API有 EditorUtility ClearProgressBa
  • 运用transport tablespace进行快速oracle版本升级(9i-10g)

    运用transport tablespace进行快速oracle版本升级 9i 10g 大家可能都知道在进行oracle数据库版本升级的时候会有2种方式 1 通过dbua database upgrade assistant 2 exp i
  • 竞逐对话式AI,百度、字节各有千秋

    随着OpenAI陆续发布的ChatGPT引发了AI界热议 新一代的AI热度便开始持续走高 与此同时 以ChatGPT模型为代表的大型预训练模型的出现 也使得对话式AI的生成能力和智能水平得到了飞跃式的提升 得益于此 对话式AI的发展又开始受
  • GPIO使用( 一 )

    一 GPIO的两大功能 通用输入输出端口GPIO具有两大功能 一种是作为一个可控的端口引脚 另外一种是通过端口映射功能连接到芯片外设 最为常用的功能是 可以作为一个可控的端口引脚 配置该引脚为输入或者输出 输出功能包括强推挽输出和开漏输出两
  • Laddernet:基于UNet的医学分割多路径网络

    摘要 UNet是医学图像分割中的主流网络 以往的对于UNet网络的修改都是有一个跳跃连接的编码器和解码器组成 这种结构的信息流路径是有限的 本文提出的Laddernet 可以看成是一个由多个UNet组成的链 与原始的UNet不同 Ladde
  • 基于springboot,vue手机商城系统

    开发工具 IDEA 服务器 Tomcat9 0 jdk1 8 项目构建 maven 数据库 mysql5 7 系统分前后台 项目采用前后端分离 前端技术 vue elementUI 服务端技术 springboot mybatis plus
  • ubuntu下Gflags安装、配置、使用

    一 基础知识 1 Gflags是一种命令行解析工具 处理命令行参数的库 主要用于解析用命令行执行可执行文件时传入的参数 在gflags中flag可以分散的定义在各个文件之中 而不用定义在一起 这就意味着在我们可以在一个单独的文件中只定义这个
  • org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

    idea下Maven项目 Spring Mybatis 查询时报错 org apache ibatis binding BindingException Invalid bound statement not found 解决方案 org
  • UE4 如何使用C++代码实现 在指定范围内随机生成同一个种类的不同物品(怪物,NPC,拾取物)的 自定义蓝图

    一 引言 在游戏世界中有特别多的物品 NPC 怪物 使用UE4中的蓝图我们可以摆放这些事务 但是如何在指定范围内随机生成同一个种类的不同事物呢 这就需要UE4 实现 C 自定义 蓝图功能 二 构思 首先我们构思一下实现上诉功能 应该怎么做