当前位置: 首页 > article >正文

多视角系统,视角之间的切换,输入操作。无人机Pawn视角的实现

一.创建自己的PlayerController。它相当于是灵魂,穿梭在不同Pawn之间。也即是切换视角。不同输入的响应也写在这里。这样即使,都有鼠标操作,也能区分。避免了代码的重复耦合。也可以叫做视角系统。

class LZJGAMEMODE_API ALZJPlayerController : public APlayerController
{GENERATED_BODY()virtual void SetupInputComponent();void LeftButtonFunction();void DeactiveLeftButtonFunction();void RightButtonFunction();void DeactiveRightButtonFunction();void WheelUpFunction();void WheelDownFunction();void PanX(float value);void PanY(float value);void RotateX(float value);void RotateY(float value);
};

二.开始需要绑定,每一个,按键事件。对应回调那个函数。在函数里,会通过GetPawn,判断当前肉体是哪个Pawn,在对于调用此时这个Pawn的函数功能。

void ALZJPlayerController::SetupInputComponent()
{Super::SetupInputComponent();InputComponent->BindAction("LeftButtonFunction", IE_Pressed, this, &ALZJPlayerController::LeftButtonFunction);InputComponent->BindAction("LeftButtonFunction", IE_Released, this, &ALZJPlayerController::DeactiveLeftButtonFunction);InputComponent->BindAction("RightButtonFunction", IE_Pressed, this, &ALZJPlayerController::RightButtonFunction);InputComponent->BindAction("RightButtonFunction", IE_Released, this, &ALZJPlayerController::DeactiveRightButtonFunction);InputComponent->BindAction("WheelUpFunction", IE_Pressed, this, &ALZJPlayerController::WheelUpFunction);InputComponent->BindAction("WheelDownFunction", IE_Pressed, this, &ALZJPlayerController::WheelDownFunction);InputComponent->BindAxis("PanX", this, &ALZJPlayerController::PanX);InputComponent->BindAxis("PanY", this, &ALZJPlayerController::PanY);InputComponent->BindAxis("RotateX", this, &ALZJPlayerController::RotateX);InputComponent->BindAxis("RotateY", this, &ALZJPlayerController::RotateY);bShowMouseCursor = true;
}void ALZJPlayerController::LeftButtonFunction()
{if (GetPawn()) {ALZJPawn* TmpCamPawn = Cast<ALZJPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->ActivePin();}}
}void ALZJPlayerController::DeactiveLeftButtonFunction()
{if (GetPawn()) {ALZJPawn* TmpCamPawn = Cast<ALZJPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->DeActivePin();}}
}void ALZJPlayerController::RightButtonFunction()
{if (GetPawn()) {ALZJPawn* TmpCamPawn = Cast<ALZJPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->ActiveRotate();}}if (GetPawn()) {ALZJTravelPawn* TmpCamPawn = Cast<ALZJTravelPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->ActiveRotate();}}
}void ALZJPlayerController::DeactiveRightButtonFunction()
{if (GetPawn()) {ALZJPawn* TmpCamPawn = Cast<ALZJPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->DeActiveRotate();}}if (GetPawn()) {ALZJTravelPawn* TmpCamPawn = Cast<ALZJTravelPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->DeActiveRotate();}}
}void ALZJPlayerController::WheelUpFunction()
{if (GetPawn()) {ALZJPawn* TmpCamPawn = Cast<ALZJPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->Zoom(1, 10);}}
}void ALZJPlayerController::WheelDownFunction()
{if (GetPawn()) {ALZJPawn* TmpCamPawn = Cast<ALZJPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->Zoom(0, 10);}}
}void ALZJPlayerController::PanX(float value)
{if (GetPawn()) {ALZJPawn* TmpCamPawn = Cast<ALZJPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->PanX(value);}}}void ALZJPlayerController::PanY(float value)
{if (GetPawn()) {ALZJPawn* TmpCamPawn = Cast<ALZJPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->PanY(value);}}
}void ALZJPlayerController::RotateX(float value)
{if (GetPawn()) {ALZJPawn* TmpCamPawn = Cast<ALZJPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->RotateX(value * 0.8f);}}if (GetPawn()) {ALZJTravelPawn* TmpCamPawn = Cast<ALZJTravelPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->RotateX(value * 0.2f);}}
}void ALZJPlayerController::RotateY(float value)
{if (GetPawn()) {ALZJPawn* TmpCamPawn = Cast<ALZJPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->RotateY(value * 0.8f);}}if (GetPawn()) {ALZJTravelPawn* TmpCamPawn = Cast<ALZJTravelPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->RotateY(value * 0.2f);}}
}

三.无人机视角

1.这里说一下,其中之一的无人机视角。如果肉体是无人机。这个无人机是如何实现的。

安装碰撞盒,用与碰撞。模型不必多说。还有两个物理喷射器的指针,因为我们要从物理上模仿,这个无人机。下面分别是物理银子的参数,模型数组,以及旋转螺旋桨动画函数的声明。

UCLASS()
class WXDRONE_API ADrone : public APawn
{GENERATED_BODY()public:// Sets default values for this pawn's propertiesADrone();UPROPERTY(EditAnywhere)class UBoxComponent* OutCollision;//碰撞包围盒//如果是指针 VisibleAnywhere 和 EditAnywhere 差不多UPROPERTY(VisibleAnywhere)class UStaticMeshComponent* Mesh;//使用前置声明避免头文件增加复杂度UPROPERTY(VisibleAnywhere)class UStaticMeshComponent* Paddle1;UPROPERTY(VisibleAnywhere)class UStaticMeshComponent* Paddle2;UPROPERTY(VisibleAnywhere)class UStaticMeshComponent* Paddle3;UPROPERTY(VisibleAnywhere)class UStaticMeshComponent* Paddle4;UPROPERTY(VisibleAnywhere)class UPhysicsThrusterComponent* UpThruster;UPROPERTY(VisibleAnywhere)class UPhysicsThrusterComponent* ForwardThruster;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Init")float LiftAcc = 20000.0f;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Init")float LiftThrustMax = 2000.0f;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Init")float ForwardAcc = 5000.0f;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Init")float ForwardThrustMax = 2000.0f;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Init")float TurnStrength = 500000.0f;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Init")float PaddleRotateSpeed = 500.0f;//UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Init")//TSubclassOf<class AMissle> Bullet;
protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;void Lift(float aixs);void Forward(float aixs);void Turn(float aixs);void Fire();//定义了一个数组存储所有螺旋桨TArray<UStaticMeshComponent*> Paddles;//旋转螺旋桨void RotatePaddle(float dt);
public:// Called every framevirtual void Tick(float DeltaTime) override;// Called to bind functionality to inputvirtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;UFUNCTION(BlueprintCallable)void SetPossess();
};

无人机功能的实现,首先包含需要的头文件,和构造时初始化组件,设置位置参数等。

#include "Drone.h"
#include "Components/StaticMeshComponent.h"
#include "Components/BoxComponent.h"
#include "PhysicsEngine/PhysicsThrusterComponent.h"
#include "Kismet/KismetMathLibrary.h"
#include <Kismet/GameplayStatics.h>ADrone::ADrone()
{// 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;OutCollision = CreateDefaultSubobject<UBoxComponent>(TEXT("OutCollision"));RootComponent = OutCollision;OutCollision->SetBoxExtent(FVector(90.0f, 90.0f, 40.0f));OutCollision->SetSimulatePhysics(true);OutCollision->BodyInstance.bLockXRotation = true;OutCollision->BodyInstance.bLockYRotation = true;//UE的C++中,UE自己的类是由UE自己来管理生命周期的,如果要创建UE的对象需要使用专门的对应的函数来创建Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));Mesh->SetupAttachment(OutCollision);Paddle1 = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Paddle1"));Paddle2 = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Paddle2"));Paddle3 = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Paddle3"));Paddle4 = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Paddle4"));Paddle1->SetupAttachment(Mesh, TEXT("Paddle1"));Paddle2->SetupAttachment(Mesh, TEXT("Paddle2"));Paddle3->SetupAttachment(Mesh, TEXT("Paddle3"));Paddle4->SetupAttachment(Mesh, TEXT("Paddle4"));//将元素加入到数组Paddles.Add(Paddle1);Paddles.Add(Paddle2);Paddles.Add(Paddle3);Paddles.Add(Paddle4);UpThruster = CreateDefaultSubobject<UPhysicsThrusterComponent>(TEXT("UpThruster"));UpThruster->SetupAttachment(RootComponent);UpThruster->ThrustStrength = 980.0f;UpThruster->SetAutoActivate(true);UpThruster->SetWorldRotation(UKismetMathLibrary::MakeRotFromX(-this->GetActorUpVector()));ForwardThruster = CreateDefaultSubobject<UPhysicsThrusterComponent>(TEXT("ForwardThruster"));ForwardThruster->SetupAttachment(RootComponent);ForwardThruster->ThrustStrength = 0.0f;ForwardThruster->SetAutoActivate(true);ForwardThruster->SetWorldRotation(UKismetMathLibrary::MakeRotFromX(-this->GetActorForwardVector()));}

然后,在Tick函数里,做动画。螺旋桨动画,和前倾,旋转等。因为Tick是和帧数相关的循环。不会出现明显抖动。如果用定时器,就有可能卡帧抖动。

// Called every frame
void ADrone::Tick(float DeltaTime)
{Super::Tick(DeltaTime);APlayerController* tmpPC = UGameplayStatics::GetPlayerController(GetWorld(), 0);APawn* tmpPawn = tmpPC->GetPawn();if (tmpPawn) {ADrone* TmpCamPawn = Cast<ADrone>(tmpPawn);if (TmpCamPawn) {//松开的时候可以维持悬停if (InputComponent->IsValidLowLevel()){if (FMath::Abs(InputComponent->GetAxisValue(TEXT("Lift"))) < 0.000001f){UpThruster->ThrustStrength = 980.0f;}//没有输入就取消前进推力if (FMath::Abs(InputComponent->GetAxisValue(TEXT("Forward"))) < 0.000001f){ForwardThruster->ThrustStrength = 0.0f;}}//调用旋转螺旋桨RotatePaddle(DeltaTime);//复原倾斜度float pitch = Mesh->GetRelativeRotation().Pitch;if (FMath::Abs(pitch) > KINDA_SMALL_NUMBER){Mesh->AddRelativeRotation(FRotator(-pitch * DeltaTime, 0.0f, 0.0f));if (FMath::Abs(Mesh->GetRelativeRotation().Pitch) <= KINDA_SMALL_NUMBER){Mesh->SetRelativeRotation(FRotator(0.0f, 0.0f, 0.0f));}}}}}

绑定输入,因为这个输入是特殊的,没有其它的Pawn和它相同。所以就写在Pawn肉体上,其实写在灵魂PlayerController上也可以。让后就是,通过物理喷射器,向前喷射多大的力,向上喷射多大的力,让无人机在移动上模仿物理效果,结合动画,就完成了无人机。这里要将碰撞的阻尼系数,勾上。不然没有摩擦力,无人机收到喷射,就会一直加速,越来越快。停不下来。

// Called to bind functionality to input
void ADrone::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{Super::SetupPlayerInputComponent(PlayerInputComponent);//轴事件函数不管有没有输入事件,都会每帧调用PlayerInputComponent->BindAxis(TEXT("Lift"), this, &ADrone::Lift);PlayerInputComponent->BindAxis(TEXT("Forward"), this, &ADrone::Forward);PlayerInputComponent->BindAxis(TEXT("Turn"), this, &ADrone::Turn);PlayerInputComponent->BindAction(TEXT("Fire"), IE_Pressed, this, &ADrone::Fire);}void ADrone::SetPossess()
{APlayerController* tmpPC = UGameplayStatics::GetPlayerController(GetWorld(), 0);if (tmpPC->IsValidLowLevel()){tmpPC->Possess(this);}
}void ADrone::Lift(float aixs)
{if (aixs != 0){UpThruster->ThrustStrength += aixs * LiftAcc * GetWorld()->DeltaTimeSeconds;UpThruster->ThrustStrength = FMath::Clamp(UpThruster->ThrustStrength, -LiftThrustMax, LiftThrustMax);}}void ADrone::Forward(float aixs)
{ForwardThruster->ThrustStrength += aixs * ForwardAcc * GetWorld()->DeltaTimeSeconds;ForwardThruster->ThrustStrength = FMath::Clamp(ForwardThruster->ThrustStrength, -ForwardThrustMax, ForwardThrustMax);float pitch = FMath::Abs(Mesh->GetRelativeRotation().Pitch);if (pitch < 30.0f){Mesh->AddRelativeRotation(FRotator(-100.0f * aixs * GetWorld()->DeltaTimeSeconds, 0.0f, 0.0f));}
}void ADrone::Turn(float aixs)
{OutCollision->AddTorqueInDegrees(-this->GetActorUpVector() * TurnStrength * aixs);
}void ADrone::Fire()
{//FTransform firetransform = Mesh->GetSocketTransform(TEXT("FireSocket"));//UClass* bullet = StaticLoadClass(AMissle::StaticClass(), NULL, TEXT("Blueprint'/Game/MyMissle.MyMissle_C'"));//AActor* bullet = Cast<AActor>(StaticLoadObject(AMissle::StaticClass(), NULL, TEXT("/Game/MyMissle")));//bullet->SetActorTransform(firetransform);//GetWorld()->SpawnActor<AMissle>(bullet, firetransform);
}void ADrone::RotatePaddle(float dt)
{for (auto paddle : Paddles){paddle->AddRelativeRotation(FRotator(0.0f, dt * PaddleRotateSpeed, 0.0f));}
}

相关文章:

多视角系统,视角之间的切换,输入操作。无人机Pawn视角的实现

一.创建自己的PlayerController。它相当于是灵魂&#xff0c;穿梭在不同Pawn之间。也即是切换视角。不同输入的响应也写在这里。这样即使&#xff0c;都有鼠标操作&#xff0c;也能区分。避免了代码的重复耦合。也可以叫做视角系统。 class LZJGAMEMODE_API ALZJPlayerControl…...

【Redis 进阶】哨兵模式

思维导图&#xff1a; 一、哨兵模式概述 &#xff08;一&#xff09;传统主从复制模式的局限性 在传统的Redis主从复制架构中&#xff0c;若主节点发生故障&#xff0c;运维人员需手动执行故障转移操作&#xff0c;将一个从节点提升为新主节点&#xff0c;并逐一通知所有客户…...

掌控随心 - 服务网格的流量管理艺术 (Istio 实例)

掌控随心 - 服务网格的流量管理艺术 (Istio 实例) 想象一下,没有服务网格的时候,我们要实现像“将 1% 的用户流量导入到新版本应用”、“根据用户设备类型访问不同后端”、“模拟下游服务故障”这类高级流量策略,通常需要在代码、负载均衡器、API 网关等多个地方进行复杂且分…...

在服务器排查java某个线程导致CPU飙高教程

&#x1f9e9; 第一步&#xff1a;确定是哪个线程占用 CPU 高 1.1 使用 top 或 htop 命令查看高 CPU 的 Java 进程 top -Hp <Java进程PID>-H 表示显示线程级别&#xff1b;-p 后面跟 Java 主进程的 PID&#xff1b;你会看到各个线程的 CPU 使用情况&#xff0c;找出使用…...

电子商城后台管理平台-Flask Vue项目开发

电子商城后台管理系统 电子商城后台管理平台-Flask 项目开发 文章目录 前言网课内容数据库参数用户模块/user/前端LESS 的语法使用LESS 的特点 ui登录页面主页页面头部左边aside 菜单main主体后端main页面设置用户-角色-权限商品分类商品信息图片保存到项目里面订单数据展示 网…...

Lettuce 节点刷新、连接优化与 Spring 升级适配全解析:从环境约束到生产验证

引言 在分布式系统中&#xff0c;Redis 作为高性能缓存中间件被广泛使用。随着 Spring 生态的迭代&#xff08;尤其是 Spring Boot 2.0 的普及&#xff09;&#xff0c;Lettuce 逐渐取代 Jedis 成为 Redis 客户端的 “默认选择”。但开发者常面临三个核心问题&#xff1a;Let…...

CVE-2025-31258 macOS远程视图服务沙箱逃逸漏洞PoC已公开

苹果公司近日针对macOS系统中新披露的CVE-2025-31258漏洞发布补丁&#xff0c;该漏洞可能允许恶意应用程序突破沙箱限制&#xff0c;获取未授权的系统资源访问权限。在安全研究员Seo Hyun-gyu公开概念验证&#xff08;PoC&#xff09;利用代码后&#xff0c;该漏洞已在macOS Se…...

UDP协议详细讲解及C++代码实例

目录 一、UDP协议概述二、UDP通信流程1)数据传输2)无连接 三、关键点解析1&#xff09; 套接字创建2&#xff09;无连接特性3&#xff09;数据传输 四、总结 UDP协议详细讲解及C代码实例 一、UDP协议概述 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&a…...

武汉大学无人机视角下的多目标指代理解新基准!RefDrone:无人机场景指代表达理解数据集

作者&#xff1a;Zhichao Sun, Yepeng Liu, Huachao Zhu, Yuliang Gu, Yuda Zou, Zelong Liu, Gui-Song Xia, Bo Du, Yongchao Xu 单位&#xff1a;武汉大学计算机学院 论文标题&#xff1a;RefDrone: A Challenging Benchmark for Drone Scene Referring Expression Compreh…...

【递归、搜索和回溯】二叉树中的深搜

个人主页 &#xff1a; zxctscl 专栏 【C】、 【C语言】、 【Linux】、 【数据结构】、 【算法】 如有转载请先通知 文章目录 前言1 2331. 计算布尔二叉树的值1.1 分析1.2 代码 2 129. 求根节点到叶节点数字之和2.1 分析2.2 代码 3 814. 二叉树剪枝3.1 分析3.2 代码 4 98. 验证…...

Algolia - Docsearch的申请配置安装【以踩坑解决版】

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…...

Linux513 rsync本地传输 跨设备传输 一

ping节点bPing通 仅主机模式不需要设置网关节点a也可以Ping通节点b 同步成功 下载文件夹成功 今日源码 节点a 节点b...

leetcode 383. Ransom Note

题目描述 代码 class Solution { public:bool canConstruct(string ransomNote, string magazine) {vector<int> table(26,0);for(char ch : magazine){table[ch-a];}for(char ch : ransomNote){table[ch-a]--;if(table[ch-a] < 0)return false;}return true;} };...

Skyvern:用 AI+视觉驱动浏览器自动化

Skyvern&#xff1a;用 AI视觉驱动浏览器自动化 一、前言二、项目概览2.1 Skyvern 项目简介2.2 代码结构与模块划分 三、环境搭建与快速上手3.1 环境准备3.1.1 系统与依赖3.1.2 克隆项目3.1.3 安装 Python 依赖3.1.4 配置环境变量3.1.5 启动服务 3.2 验证安装 四、核心功能与实…...

数据库原理期末考试速成--最后附带两套题

引言 为什么从3开始呢,毕竟是速成吗,总要放弃一些东西 前两章1.概论 2.关系数据库:这里面都是一些运算符什么的,我感觉都学这个:笛卡尔积之列的都会算 这两章比较重要的我就放在这里了 选择、投影、连接、除、并、交、差,其中选择、投影、并、差、笛卡尔积是5种基本关…...

《探索React Native社交应用中WebRTC实现低延迟音视频通话的奥秘》

WebRTC&#xff0c;全称为Web Real-Time Communication&#xff0c;是一项开创性的开源技术&#xff0c;为Web和移动应用开启了实时通信的大门。它打破了传统通信的束缚&#xff0c;使得应用之间无需依赖繁琐的中间服务器&#xff0c;就能实现直接的点对点通信&#xff0c;这是…...

关于vue 本地代理

接口调用&#xff1a;其中我们可以约定一个拦截的标识&#xff0c; 用来给本地 http://localhost/ 进行代理要请求的测试地址https:abc.com 例子&#xff1a; axios.post(/OwnRateReport/-------------------------------------------------------00001)devServer: {proxy: {/…...

#跟着若城学鸿蒙#HarmonyOS NEXT学习之Blank组件详解

一、组件介绍 Blank&#xff08;空白&#xff09;组件是HarmonyOS NEXT中一个简单但非常实用的UI组件&#xff0c;它主要用于在布局中创建空白区域&#xff0c;帮助开发者更灵活地控制界面元素之间的间距和布局结构。虽然Blank组件本身不显示任何内容&#xff0c;但它在界面设…...

PX4开始之旅(二)通过自定义 MAVLink 消息与 QGroundControl (QGC) 通信

核心知识点&#xff1a;通过自定义 MAVLink 消息与 QGroundControl (QGC) 通信 1. 通俗易懂的解释 想象一下&#xff0c;MAVLink 就像是无人机&#xff08;飞控&#xff09;和地面站&#xff08;QGroundControl&#xff09;之间约定好的一种“语言”。这种语言有很多标准的“…...

数据结构基础--蓝桥杯备考

1.优缺点总述 STL中各容器对比图 各类线性数据结构优缺点 1.数组 1.优点 1.简单&#xff0c;容易理解 2.访问快捷&#xff0c;只需要用下标就可以 3.有某些应用场景直接对应&#xff0c;例如二维数组对应平面 2.缺点 删除和插入数据非常耗时 2.链表 1.优点 插入和删…...

2.4GHz无线通信芯片选型指南:集成SOC与低功耗方案解析

今天给大家分享几款2.4GHz无线通信芯片方案&#xff1a; 一、集成SOC芯片方案 XL2407P&#xff08;芯岭技术&#xff09; 集成射频收发机和微控制器&#xff08;如九齐NY8A054E&#xff09; 支持一对多组网和自动重传 发射功率8dBm&#xff0c;接收灵敏度-96.5dBm&#xff08…...

安卓刷机模式详解:Fastboot、Fastbootd、9008与MTK深刷

安卓刷机模式详解&#xff1a;Fastboot、Fastbootd、9008与MTK深刷 一、刷机模式对比 1. Fastboot模式 简介&#xff1a;传统安卓底层刷机模式&#xff0c;通过USB连接电脑操作优点&#xff1a;支持大多数安卓设备&#xff0c;操作相对简单缺点&#xff1a;需要设备进入特定…...

Unity_JK框架【5】音效系统实现

在游戏开发中&#xff0c;音频是不可或缺的一部分&#xff0c;它能够极大地增强游戏的沉浸感和趣味性。今天&#xff0c;我们就用JK框架 探讨一下如何在Unity中实现一个强大的音频系统&#xff0c;并且通过实际的测试脚本来验证其功能&#x1f44f;。 一、音频模块类&#xff1…...

鸿蒙 从打开一个新窗口到Stage模型的UIAbility组件

打开一个新的窗口 我们首先来实现如何在一个应用中打开一个新窗口&#xff0c;使用的模型是 Stage 模型 在项目文件里&#xff0c;新建一个 newWindow.ets 新文件 src/main/ets/pages/newWindow.ets newWindow.ets文件里面随便写点什么都行&#xff0c;这里是第一步创建的文件…...

MySQL数据库——视图

目录 一、视图是什么&#xff1f; 二、特点 三、创建视图 四.查询视图 五.更新视图 六.视图的作用 总结 一、视图是什么&#xff1f; 视图是从一个或多个表中导出的虚拟表&#xff0c;它本身不存储数据&#xff0c;而是基于 SQL 查询的结果集。 二、特点 1.虚拟性&#xff1…...

redis数据结构-09 (ZADD、ZRANGE、ZRANK)

Redis 排序集简介&#xff1a;ZADD、ZRANGE、ZRANK Redis 有序集合是一种功能强大的数据结构&#xff0c;兼具集合和哈希的特性。它维护一组唯一元素&#xff0c;类似于集合&#xff1b;但每个元素都与一个分数相关联&#xff0c;类似于哈希。分数用于对有序集合中的元素进行排…...

PyTorch API 1 - 概述、数学运算、nn、实用工具、函数、张量

文章目录 torch张量创建操作索引、切片、连接与变异操作 加速器生成器随机采样原地随机采样准随机采样 序列化并行计算局部禁用梯度计算数学运算常量逐点运算归约操作比较运算频谱操作其他操作BLAS 和 LAPACK 运算遍历操作遍历操作遍历操作遍历操作遍历操作遍历操作遍历操作遍历…...

长短期记忆网络(LSTM)深度解析:理论、技术与应用全景

长短期记忆网络&#xff08;LSTM&#xff09;作为循环神经网络&#xff08;RNN&#xff09;的重要变体&#xff0c;通过门控机制有效解决了传统RNN的梯度消失问题&#xff0c;成为时序数据处理的核心技术。本文从理论起源、数学建模、网络架构、工程实现到行业应用&#xff0c;…...

c语言第一个小游戏:贪吃蛇小游戏02

接上文继续学习 ncurse的上下左右键获取 想要使用ncurse的功能键&#xff0c;也就是键盘快捷键&#xff0c;不是q、r、t&#xff0c;是 上下左右、F1、F2等等的键&#xff0c;我们叫做功能键要是想用这些功能键需要使用keypad函数 Keypad(stdscr,1); 从stdscr接收标准中&…...

【Python爬虫 !!!!!!政府招投标数据爬虫项目--医疗实例项目文档(提供源码!!!)!!!学会Python爬虫轻松赚外快】

政府招投标数据爬虫项目--医疗实例项目文档 1. 项目概述1.1 项目目标1.2 技术栈 2. 系统架构2.1 模块划分2.2 流程示意图 3. 核心模块设计3.1 反爬处理模块&#xff08;utils/anti_crawler.py&#xff09;3.1.1 功能特性3.1.2 关键代码 3.2 爬虫模块&#xff08;crawler/spider…...