19uec++多人游戏【基础AI导航】

news2024/11/24 2:27:10

首先把这一期的资源导入一下

创建一个球体类,继承于pawn类

 为其添加静态组件

	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")
	class UStaticMeshComponent * MeshComponent;

==================================================================
#include "Components/StaticMeshComponent.h"

MeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MeshComponent"));
RootComponent = MeshComponent;

编译,为其创建蓝图类

为其组件设为一个球体

 

拖到场景中,发现太大了

 

我们为其创建一个小球网格体模型

首先创建一个文件夹

 

 我们把这个小球网格体复制到我们这个文件夹下面

重命名一下这个网格体

 

进入这个网格体,修改一下比例

 

 在类中换上这个网格体

shift+end让其紧贴地面

 

然后创建材质文件

 

先将材质设为白色

 在网格体中赋予材质

把导航体拖入场景中

 然后我们拉大体积,让其覆盖整个地面

然后让其嵌入到地板底下

 

 按一下p,就可以显示导航的范围

我们可以看到,球体本身也会影响导航

 

小球mesh组件里面,去掉这个勾

 

 

我们为这个小球,写蓝图

 然后为我们的小球随便添加一个移动组件

编译,测试,小球开局真的动了 

 现在我们将移动逻辑写的更复杂一点

将移动速度变小,发现小球一直在我们屁股后面追

 

====================================

我们继续提高逻辑,让其自动添加路径

首先自定义事件

 

 测试,已经画出了路径点

 在c++文件中加上这个

在小球头文件中,添加三个变量

	//移动速度
	UPROPERTY(EditDefaultsOnly, Category = "TracerBot")
	float MovementForce;

	//是否让移动速度改变
	UPROPERTY(EditDefaultsOnly, Category = "TracerBot")
	bool bUseVelocityChange;

	//移动到目标的阈值
	UPROPERTY(EditDefaultsOnly, Category = "TracerBot")
	float RequiredDistanceToTarget;

 在构造函数中初始化这三个变量,并将mesh组件的模拟物理激活

AASTrackerBot::AASTrackerBot()
{
 	// Set this pawn to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;
	MeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MeshComponent"));
	MeshComponent->SetSimulatePhysics(true);
	RootComponent = MeshComponent;

	MovementForce = 1000;
	bUseVelocityChange = false;
	RequiredDistanceToTarget = 100;
}

 在小球的头文件中,添加寻找路径点的函数,和路径点变量

FVector GetNextPathPoint();

	//路径点
	FVector NextPathPoint;
#include "Components/StaticMeshComponent.h"
#include "GameFramework/Character.h"
#include"Kismet/GamePlayStatics.h"
#include "NavigationSystem.h"
#include "NavigationPath.h"
#include "DrawDebugHelpers.h"

 定义这个函数

FVector AASTrackerBot::GetNextPathPoint()
{
	//得到0号玩家
	ACharacter *playerPawn = UGameplayStatics::GetPlayerCharacter(this, 0);
	//找到通往玩家的路径
	UNavigationPath *NavPath = UNavigationSystemV1::FindPathToActorSynchronously(this, GetActorLocation(), playerPawn);
	if (NavPath->PathPoints.Num() > 1)
	{
		//返回第二个点
		return NavPath->PathPoints[1];
	}
	else
	{
		return GetActorLocation();
	}
}

 在游戏开始函数中,调用这个函数

void AASTrackerBot::BeginPlay()
{
	Super::BeginPlay();
	NextPathPoint = GetNextPathPoint();
}

 在每帧函数里,不断得去移动

void AASTrackerBot::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
	//得到小球自身与下一个点的距离
	float DistanceToTarget = (NextPathPoint - GetActorLocation()).Size();
	//如果大于阈值,就继续滚
	if (DistanceToTarget > RequiredDistanceToTarget)
	{
		//小球的移动方向
		FVector ForceDirection = NextPathPoint - GetActorLocation();
		ForceDirection.Normalize();
		//小球的推力
		ForceDirection *= MovementForce;
		MeshComponent->ComponentVelocity.Size();
		MeshComponent->AddImpulse(ForceDirection, NAME_None, bUseVelocityChange);
		DrawDebugDirectionalArrow(GetWorld(), GetActorLocation(), GetActorLocation() + ForceDirection, 32, FColor::Red, false, 0.0f, 0, 1.0f);
	}
	//如果到达了路径点,就生成下一个点,继续移动
	else
	{
		NextPathPoint = GetNextPathPoint();
		DrawDebugString(GetWorld(), GetActorLocation(), "Target Reached!");
	}
	//在下一个目标点画一个球
	DrawDebugSphere(GetWorld(), NextPathPoint, 20, 12, FColor::Yellow, false, 0.0f, 0, 1.0f);

}

编译,然后在小球的mesh组件里面,勾上模拟物理

测试成功

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/46395.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

具备统一门户功能的内网即时通讯软件才是发展趋势

作为企业领导&#xff0c;我们最害怕的就是下属工作效率不高&#xff0c;没办法为企业带来价值&#xff0c;有时候并不一定是员工自身存在问题&#xff0c;“工欲善其事&#xff0c;必先利其器“正好说明了&#xff0c;如果我们有能力在线的员工加上强大的办公软件辅助&#xf…

如何线上登记版权?

问题一&#xff1a;为什么要登记版权&#xff1f; 告诉你一个行业秘密&#xff0c;其实可以不用登记版权&#xff0c;为什么&#xff1f;因为作品自完成就自动拥有版权&#xff0c;作者可以自己选择登记与否&#xff0c;不登记对版权也没有影响。这里可能有人要问了&#xff0…

xss-labs/level12

这一关首先尝试以下 <script>alert(xss)</script> 不废话 直接看源代码 很明显发现第一个输出点被转义了 根本无法通过script标签来完成弹窗 然后依然是四个隐藏表单 我们可以先试一试在不用抓包工具的前提下 我们能不能将某个隐藏表单给显示出来 构造如下 &l…

Docker的常用基础命令(详细讲解)

首选需要大家搭建好Docker环境&#xff0c;没有环境的可以查看前面的详细讲解安装Docker引擎的文章&#xff08;在CentOS上安装Docker引擎_征服bug的博客-CSDN博客&#xff09; 首先是安装好Docker 引擎 一&#xff0c;如何启动与停止引擎服务 #启动docker systemctl start do…

JAVA-GUI工具的编写-----请求篇

上节我们说到&#xff0c;我们制作了样子货的GUI&#xff0c;但是没有嵌入任何的按钮事件&#xff0c;并且上一次忘记加进去命令执行的确定按钮&#xff0c;让我们简单的回顾一下子吧 import javafx.application.Application; import javafx.collections.FXCollections; impor…

R在GIS中用ggmap地理空间数据分析

概要 做过O2O&#xff08;Online To Offline,在线离线/线上到线下&#xff09;的小伙伴知道&#xff0c;GIS数据需要具体到精准的位置(即经纬度)&#xff1b;对于连锁门店&#xff0c;使用GIS和其它的数据密集型服务遵循一个简单的逻辑&#xff1a;数据有助于企业节省开支&…

Vilatile底层逻辑总结

#### 增加volatile 使用JIT优化的时候 禁止出现语句重排 #### volatile是Java虚拟机提供的轻量级同步机制。 - 保证可见性 - 不保证原子性&#xff08;整体流程成功 整体流程失败&#xff09;如果要保证原子性-加 synchronized 或者直接使用 Automic 原子类 - 禁止指令重排&am…

VBA Regex 正则表达式应用介绍

. VBA正则表达式介绍 正则表达式或 RegEx 用于在字符串中查找特定的字符。 本文将展示一个 VBA RegEx 示例,并演示为什么在 VBA 中使用正则表达式如此强大。 正则表达式是一个比较大的话题,关于这方面的书很多。 同时也是一个让许多人感到害怕的话题,因为它的语法比较神秘和…

【论文笔记】ASYMMETRIC SELF-PLAY FOR AUTOMATIC GOAL DISCOVERY IN ROBOTIC MANIPULATION

【论文笔记】ASYMMETRIC SELF-PLAY FOR AUTOMATIC GOAL DISCOVERY IN ROBOTIC MANIPULATION ABSTRACT 【主要工作】用一个单一的、有目标条件的策略来解决许多机器人操作任务&#xff0c;包括对之前未见过的物体的操作。 【主要方法】对于目标发现过程采用非对称自我博弈方法…

Java 输入输出流简介和应用 (Java实现序列化工具类)

目录 简介 常用模板 实现序列化工具类 简介 应用场景 代码 简介 Java 流相关的类都封装在 java.io 包中&#xff0c;而且每个数据流都是一个对象。所有输入流类都是 InputStream 抽象类&#xff08;字节输入流&#xff09;和 Reader 抽象类&#xff08;字符输入流&#…

ISP Tuning

ISP Tuning1. 简介2. 常用算法2.1 BLC2.2 AWB (处理色温引起的偏色问题)2.2.1 色温&#xff08;Color Temperature:温度越低色温越高&#xff09;2.2.2 为什么需要AWB &#xff08;消除光源颜色的影响&#xff09;2.2.3 AWB的目标2.2.4 如何实现自动白平衡 (先确定色温然后找对…

汽配erp管理系统目前有哪些公司提供了解决方案?

之前的一个朋友提问&#xff1a;我们是一个有200人左右的汽车配件供应商&#xff0c;为了迎合整车厂家的需要&#xff0c;提高自身管理运作的效率&#xff0c;准备上erp管理软件来规范企业的运作。现阶段我们内部管理的信息化程度比较低&#xff0c;从库房到现场作业都是靠纸质…

【Labivew】G语言

&#x1f6a9;write in front&#x1f6a9; &#x1f50e;大家好&#xff0c;我是謓泽&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f3c5;2021年度博客之星物联网与嵌入式开发TOP5&#xff5…

第七章 贝叶斯分类器(上)

7.1 贝叶斯决策论 贝叶斯决策论是概率框架下实施决策的基本方法。 假设有N种可能的类别标记&#xff0c;即y{c1,c2,…,cn}&#xff0c;λij是将一个真实标记为cj的样本误分类为ci所产生的损失。基于后验概率P(ci | x)可获得将样本x分类为ci所产生的期望损失&#xff0c;即在样…

C++多态总结

多态的概念 多态的基本概念 多态支持不同对象完成不同的行为。 定义“人”为一种对象&#xff0c;那么不同的人对于一件事会有不同的行为。 比如&#xff1a;普通人买票时&#xff0c;票价为全价。 学生买票时&#xff0c;是半价买票。 军人买票时则可优先买票。同属于人这一大…

java项目-第165期ssm咨询交流论坛_ssm毕业设计_计算机毕业设计

java项目-第165期ssm咨询交流论坛_ssm毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm咨询交流论坛》 该项目分为2个角色&#xff0c;管理员和用户。 用户可以浏览前台,包含功能有&#xff1a; 首页、学校风采、师资力量、投稿信息 、论坛交流、系统公…

认识vue3以及语法运用简介

Vue3支持2的大多数特性 性能提升: 打包大小减少41%, 初次渲染快55%,更新快133%, 内存使用减少54% 推出一系列组合型API ref与reactive watch与computed 新的声明周期函数。 一、组合API------reactive、ref 与 toRefs 在Vue2.x中&#xff0c;定义数据都是在data中&#xff0c;但…

LeetCode——Weekly Contest 320(附动态规划解题思路)

LeetCode周赛第320场记录 质量还不错的一场周赛&#xff0c;也可以学到不少知识。 2475. 数组中不等三元组的数目(排序荷兰国旗问题) 这道题非常简单&#xff0c;就是从头向后一一找出不含重复数字的三元组。我在比赛时直接写了一个三重循环暴力来解&#xff0c;这道题的数据…

WebDAV之葫芦儿·派盘+元思笔记

元思笔记 支持webdav方式连接葫芦儿派盘。 卡片笔记不仅是笔记爱好者,学生、医生、投资等各行各业的人都在不约而同的夸赞元思笔记的好。这是一款面向大众的卡片笔记软件,解决了笔记类软件的一个痛点:绝大多数人都很难坚持每天记一点东西。任何笔记工具,不论是纸笔还是电…

时序特征提取工具

在选择了需要提取的特征&#xff0c;确定了时序数据特征提取数据集的长度并对先验知识建模之后&#xff0c;就需要利用工具搭建特征提取系统。科研机构围绕不同问题域搭建的开源时序数据特征提取工具已经不少&#xff0c;我们可以利用这些工具快速实现希望达成的算法效果。下面…