UE4网课学习笔记

article/2025/4/19 21:07:59

学习资源:https://www.bilibili.com/video/av52017180?p=22


  • BSP:二进制空间划分
  • 让门可旋转,需要将属性改为“Movable”
  • 选中一个物体后,在Level BluePrint中右键会自动出现对应物体的函数
  • TimeLine: 其中:Play是正向播放,Play From Start是每次从第0帧开始(这样对于开门不好,如果开到一半又出来,再进去,门会瞬间回到z=0°开始)
  • 实现门开门关,蓝图监控键盘输入/鼠标点击,要Enable Input后。Gate节点,两种输入A,B只有一种输出C,FlioFlop接受C,有两条路线交替走
  • 点击Eject能切换到自由模式
  • 触发其他蓝图类的自定义事件(跨蓝图使用脚本的变量/函数)
  • 图表:在一个蓝图中,进行平面分割一样,各个功能模块可以分开写,有点类似unity中一个Gameobject挂着多个脚本
  • 变量:选中一个变量→提升为变量,在一个蓝图的不同图表中可以被反复利用(跨图表使用)
  • Tick事件:每一帧都执行一次,实现物体不停地自转
  • Branch:代表分支,切换(代替FlipFlop)
  • Ctrl + 变量拉到蓝图窗口 = 获得Get ;Alt + 变量拉到蓝图窗口 = 设置Set ; Ctrl + W 快速复制
  • 监听按键输入,TODO:对于ThirdPersonCharacter为什么可以不用Enable Input也可以监听,表示很奇怪
  • 射线检测可以自定义通道,Actor开启对应通道才可以被检测到

PacMan Project总结

  • 创建材质:
  • 编码规范问题:虚幻引擎生成的类,会自带首字母,比如Actor类classname会自动添上Aclassname
  • 假如GENERATED_BODY()爆红:切换debug editor和develop。debug模式便于程序员调试,但是优化不足
  • PlayerStart:确认主角的位置,如果不存在默认(0,0,0)
  • GameMode:创建基于它的BP_GameMode,在Project Settings→Maps&Modes设置BP_GameMode。TODO:为什么要创建对应的蓝图类?????蓝图和C++一起协同,GameMode有什么作用(游戏规则??)?目前有了理解,以后再来写
  • C++类拖拽到空间中,再调用加载Mesh的方法,就可以显性。已解决:为什么要设置这些属性,每个属性有什么不同?有点像unity中的可序列化,可见等等
  • 如何取消某个类的Tick调用 
  • 代码实现按键监听
  • 创建基于C++类的蓝图,TODO:有何作用?比较像u3d的Ins面板
  • 关卡重新开始函数定义 以及 函数绑定
  • 碰撞检测
    • 必须要先有碰撞体,主角的碰撞体是在蓝图类内实现的,因此要先进行绑定
    • UFUNCTION()  TODO:反射机制?为什么得到的是AActor而不是类似Unity中的GameObject呢?
          void OnCollision(class UPrimitiveComponent* HitComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult);
  • 获取World()中的某个类
    •     CollectablesCntToEat = 0;
          for (TActorIterator<ACollectables> AcollectableIterator(GetWorld()); AcollectableIterator; ++AcollectableIterator) {
              ++CollectablesCntToEat;
          }
  • Log:UE_LOG(LogTemp, Warning, TEXT("InitCollectablesCount = %d"), CollectablesCntToEat);

总结:监听输入调用函数,碰撞检测


Unreal Engine 4 For unity

CategoryUnityUE4
Gameplay TypesComponentComponent
 GameObjectActor, Pawn
 PrefabBlueprint Class
Editor UIHierarchy PanelWorld Outliner
 InspectorDetails Panel
 Project BrowserContent Browser
 Scene ViewViewport
MeshesMeshStatic Mesh
 Skinned MeshSkeletal Mesh
MaterialsShaderMaterial, Material Editor
 MaterialMaterial Instance
EffectsParticle EffectEffect, Particle, Cascade
 ShurikenCascade
Game UIUIUMG (Unreal Motion Graphics)
AnimationAnimationSkeletal Animation System
 MecanimPersona , Animation Blueprint
2DSprite EditorPaper2D
ProgrammingC#C++
 ScriptBlueprint
PhysicsRaycastLine Trace, Shape Trace
 Rigid BodyCollision, Physics
Runtime PlatformsiOS Player, Web PlayerPlatforms
  • Actor,Pawn,Character可以拖进场景中,UE4用Gameplay Framework与这些特定的Actor相关联
  • UE4_Actor和Unity_GameObject的区别在于:Unity中的GameObject是不可扩展的C#类,而UE4_Actor是可通过继承的方式扩展并自定义的C++类
  • Unity直接添加组件,组件没有层级关系;而UE4是在将放置到世界的Actor的detail面板中,并且存在层级关系
  • Unity:GameObject→Prefabs   ;  UE4:Actor(带有组件)→“Blueprint/Add Script”(变成预制体)
  • UE4也可以添加组件(蓝图/C++脚本 有start和update)
  • Unity的GameObject都有一个Transform组件来提供位置,旋转,比例,而UE4是使用Root Component
  • 能放进关卡中的都是Actor类,Object类是所有Unreal类的基类
  • Gameplay Framework是某种游戏框架,需要了解内置类的源码实现,待理解学习
  • 打开VS有两种方法:①菜单Open Visual Studio ②双击C++类
  • 当手动修改文件源文件 or 下载新版本的UE4,可能需要点击菜单栏中的Refresh VS Project;或者虚uproject文件选择"Generate Visual Studio project files"。
  • UE4区别于U3D的是:UE4的Actor(GameObject)可以写代码,这是最不适应的地方。理解:相当于unity多了个组件,只不过ue4给继承在了GameObject上。
  • 在UE4种调用基类的方法,在Unity中的C#会调用 base.Update() ,但是UE4种的C++会使用 Super::TickComponent();
  • Instantiating GameObject / Spawning Actor
    • unity:GameObject NewGO = (GameObject)Instantiate(EnemyPrefab, SpawnPosition, SpawnRotation);
    • ue4:
      AMyActor* CreateCloneOfMyActor(AMyActor* ExistingActor, FVector SpawnLocation, FRotator SpawnRotation)
      {UWorld* World = ExistingActor->GetWorld();FActorSpawnParameters SpawnParams;SpawnParams.Template = ExistingActor;World->SpawnActor<AMyActor>(ExistingActor->GetClass(), SpawnLocation, SpawnRotation, SpawnParams);
      }
  • Unreal 子类化 UObject 类似于 Unity 子类化 ScriptableObject,即.asset资源文件,不依赖于任何Actor或者需要生成到世界的物体,其实就是static数据
    • unity:MyScriptableObject NewSO = ScriptableObject.CreateInstance<MyScriptableObject>();
    • ue4:UMyObject* NewObj = NewObject<UMyObject>();
  • 类型转换
    • unity:C#无指针
      Collider collider = gameObject.GetComponent<Collider>;
      SphereCollider sphereCollider = collider as SphereCollider;
      if (sphereCollider != null)
      {// ...
      }
    • UE4:使用Cast进行指针转换
      UPrimitiveComponent* Primitive = MyActor->GetComponentByClass(UPrimitiveComponent::StaticClass());
      USphereComponent* SphereCollider = Cast<USphereComponent>(Primitive);
      if (SphereCollider != nullptr)
      {// ...
      }
  • Destroying GameObject / Actor
    • unity:Destroy(MyGameObject);
    • UE4:MyActor->Destroy();
  • Destroying GameObject / Actor(With 1 Second Delay)
    • unity:Destroy(MyGameObject, 1);
    • UE4:MyActor->SetLifeSpan(1);
  • Disabling GameObjects / Actors
    • unity:MyGameObject.SetActive(false);
    • UE4:
          // Hides visible componentsMyActor->SetActorHiddenInGame(true);// Disables collision componentsMyActor->SetActorEnableCollision(false);// Stops the Actor from tickingMyActor->SetActorTickEnabled(false);
  • 通过组件获得父亲
    • unity:GameObject ParentGO = MyComponent.gameObject; 
    • UE4:AActor* ParentActor = MyComponent->GetOwner();
  • Accessing a Component from the GameObject / Actor 
    • unity:MyComponent MyComp = gameObject.GetComponent<MyComponent>();
    • UE4:UMyComponent* MyComp = MyActor->FindComponentByClass<UMyComponent>();
  • Finding GameObjects / Actors
    • unity:
      //C# 
      // Find GameObject by name 通过名字
      GameObject MyGO = GameObject.Find("MyNamedGameObject");// Find Objects by type  通过类型
      MyComponent[] Components = Object.FindObjectsOfType(typeof(MyComponent)) as MyComponent[];
      foreach (MyComponent Component in Components)
      {// ...
      }// Find GameObjects by tag 通过标签
      GameObject[] GameObjects = GameObject.FindGameObjectsWithTag("MyTag");
      foreach (GameObject GO in GameObjects)
      {// ...
      }
      -----------------------------------------------------------------------------------------------
    • UE4:
      //C++
      // Find Actor by name (also works on UObjects) 
      AActor* MyActor = FindObject<AActor>(nullptr, TEXT("MyNamedActor"));// Find Actors by type (needs a UWorld object) 
      for (TActorIterator<AMyActor> It(GetWorld()); It; ++It)
      {AMyActor* MyActor = *It;// ...
      }// Find UObjects by type
      for (TObjectIterator<UMyObject> It; It; ++it)
      {UMyObject* MyObject = *It;// ...
      }// Find Actors by tag (also works on ActorComponents, use TObjectIterator instead)
      for (TActorIterator<AActor> It(GetWorld()); It; ++It)
      {AActor* Actor = *It;if (Actor->ActorHasTag(FName(TEXT("Mytag")))){// ...}
      }
  • Adding tags to GameObjects / Actors
    • unity:MyGameObject.tag = "MyTag";
    • UE4:MyActor.Tags.AddUnique(TEXT("MyTag"));
  • Adding tags to MonoBehaviours / ActorComponents 
    • unity:MyComponent.tag = "MyTag";
    • UE4:MyComponent.ComponentTags.AddUnique(TEXT("MyTag"));
  • Comparing tags on  Actors and ActorComponents
    • if (MyActor->ActorHasTag(FName(TEXT("MyTag"))))
    • if (MyComponent->ComponentHasTag(FName(TEXT("MyTag"))))
  • PrimitiveComponent组件,类似u3d中的Rigidbody组件
  • 碰撞体组件上带有通道,通过自定义通道,可以自由的进行碰撞检测的组合
  • UE4进行Trigger检测
    UCLASS()
    class AMyActor : public AActor
    {GENERATED_BODY()// My trigger componentUPROPERTY()UPrimitiveComponent* Trigger;AMyActor(){Trigger = CreateDefaultSubobject<USphereComponent>(TEXT("TriggerCollider"));// Both colliders need to have this set to true for events to fireTrigger.bGenerateOverlapEvents = true;// Set the collision mode for the collider// This mode will only enable the collider for raycasts, sweeps, and overlapsTrigger.SetCollisionEnabled(ECollisionEnabled::QueryOnly);}virtual void NotifyActorBeginOverlap(AActor* Other) override;virtual void NotifyActorEndOverlap(AActor* Other) override;
    };
  • UE4射线检测
    GameObject FindGOCameraIsLookingAt()
    {Vector3 Start = Camera.main.transform.position;Vector3 Direction = Camera.main.transform.forward;float Distance = 100.0f;int LayerBitMask = 1 << LayerMask.NameToLayer("Pawn");RaycastHit Hit;bool bHit = Physics.Raycast(Start, Direction, out Hit, Distance, LayerBitMask);if (bHit){return Hit.collider.gameObject;}return null;
    }
  • 在UE4中,碰撞组件和刚体组件是同一个组件,它们的基类是 UPrimitiveComponent ,它有很多子类(USphereComponent, UCapsuleComponent等等)  可以满足你的需求。
  • 监听输入事件:函数绑定,Project Seeting → Engine → Input
  • 设置启动场景:Project Seeting→Map & Modes ;自动加载上次的项目:Edit/Editor Preference→Loading And Saving → Startup
  • .Net FrameworkUE4
    StringFString, FText
    ListTArray
    DictionaryTMap
    HashSetTSet

http://chatgpt.dhexx.cn/article/OgZCUKj1.shtml

相关文章

超星学习通小助手多线程工具Python

话不多说&#xff0c;直接开始&#xff0c;不会安转的直接使用后面两款&#xff0c;下载直接打开exe运行 第一款&#xff1a;网课小助手python&#xff0c;需要自行安装Python环境&#xff08;支持Windows、Mac、Linux各种环境&#xff09; https://wwiv.lanzoul.com/ifVrC0vk…

[脚本] 如果电脑不会自己看网氪,就应该用Python教会它

很多时候需要看网课完成一下学习任务&#xff0c;但在某些平台在播完一条视频后并不会自动切播到下一条。所以这里简单用python写了一个脚本&#xff0c;利用PyAutoGui库自动完成一些如鼠标移动点击来快速切换的操作。 源码地址 现已将代码上传至GitHub仓库&#xff08;其中包…

计算机网络第六章学习通题目及答案

目录 DNS FTP 第十一次练兵 WWW 电子邮件 第十二次练兵 DNS 3 【简答题】 域名系统的查询方式有哪两类&#xff1f;最常见的是哪一种&#xff1f; 我的答案&#xff1a; 递归查询和迭代查询&#xff0c;迭代查询。 域名系统DNS是因特网使用的命名系统&#xff0c;用来…

kafka命令行操作(for Linux)

kafka命令行操作主要分为三大类&#xff1a; 主题命令行操作、生产者命令行操作、消费者命令行操作。 注意&#xff1a; 命令行操作前提&#xff0c;启动kafka集群。 1. 主题命令行操作 1.1 查看主题命令行参数 a) 查询命令 [roothadoop102 ~]# /opt/module/kafka/bin/kafka…

【Kafka】kafka命令kafka-console-consumer.sh

文章目录 1.概述2.消息消费3.从开始位置消费4.显示key消费5.其他参数6.案例7.源码分析1.概述 转载:转载并且补充 kafka-console-consumer.sh 脚本是一个简易的消费者控制台。该 shell 脚本的功能通过调用 kafka.tools 包下的 ConsoleConsumer 类,并将提供的命令行参数全部传…

【Kafka】kafka命令 kafka-console-producer

文章目录 1.概述2.输入单挑数据3.批量导入数据3.无key型消息4.有key型消息1.概述 消费者:【Kafka】kafka命令kafka-console-consumer.sh kafka-console-producer 命令的常用参数如下 参数值类型说明有效值--bootstrap-serverString要连接的服务器必需(除非指定--broker-list…

kafka 命令、API

日萌社 人工智能AI&#xff1a;Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战&#xff08;不定时更新&#xff09; 大数据组件使用 总文章 kafka 生产/消费API、offset管理/原理、kafka命令kafka 命令、APIKafka 安装、原理、使用mapreduce 实时消费 kafka 数据…

kafka命令行使用

kafka使用 查看Kafka当前的主题列表创建一个主题查看主题信息修改分区信息删除一个主题生成者推送消息消费者接收查看分组信息查看特定consumer group 详情 基于Kafka 2.13版本的操作 查看Kafka当前的主题列表 ./kafka-topics.sh --zookeeper 127.0.0.1:2181 --list创建一个主…

简单的kafka命令行操作

目录 一、主题topic命令行操作 1.查看操作主题的命令参数 2.连接kafka地址&#xff0c;创建名为kaf的主题&#xff0c;指定分区和副本数量 3.查看所有主题的名称 4.查看主题的详细信息 5.修改主题&#xff08;修改分区数&#xff09; 二、生产者命令行操作 1.查看操作生…

【kafka】三、kafka命令行操作

kafka命令行操作 kafka的相关操作命令脚本文件在bin目录下 查看所有的topic kafka-topics.sh --zookeeper hll1:2181 --list 或 kafka-topics.sh --zookeeper 192.168.171.132:2181 --listkafka-topics.sh&#xff1a;topic执行脚本 --zookeeper hll1:2181&#xff1a;需要的…

Kafka的命令行操作

一、topic命令 下面Windows命令需要把cmd路径切换到bin/windows下。 而Linux命令只需要在控制台切换到bin目录下即可。 下面都以Windows下的操作为例&#xff0c;在Linux下也是一样的。 1.1 查看主题命令的参数 kafka-topics.bat # Windows kafka-topics.sh # Linux输…

Kafka 命令行操作

1&#xff09;查看当前服务器中的所有 topic bin/kafka-topics.sh --zookeeper backup01:2181 使用命令 bin/kafka-topics.sh --list 报异常&#xff0c;提示必须依赖zookeeper 前面我们就讲过kafka是依赖于zookeeper 连上zookeeper什么都没有输出&#xff0c;因为我们什…

kafka命令行操作大全

最近利用flink使用一个流式SQL处理平台&#xff0c;利用kafka, mysql, hive等组件比较多&#xff0c;命令行突然间需要操作一次记不住命令很麻烦&#xff0c;索性直接整理成笔记。 在 0.9.0.0 之后的 Kafka&#xff0c;出现了几个新变动&#xff0c;一个是在 Server 端增加了…

Kafka命令大全

kafka 脚本 connect-distributed.sh connect-mirror-maker.sh connect-standalone.sh kafka-acls.sh kafka-broker-api-versions.sh kafka-configs.sh kafka-console-consumer.sh kafka-console-producer.sh kafka-consumer-groups.sh kafka-consumer-perf-test.sh kafka-dele…

Kafka常用命令行命令

文章目录 Kafka常用命令kafka的基本操作&#xff08;命令行操作&#xff09;1.启动集群&#xff1a;2.查看当前服务器中的所有topic&#xff08;在kafka目录下&#xff09;3.创建主题topic&#xff08;在kafka目录下&#xff09;4.删除topic&#xff08;在kafka目录下&#xff…

美国Stripe支付Android端集成流程

上家公司想要拓展自己在新加坡的市场,打算做一个新加坡本地的生活服务应用,其中少不了的就是支付了。国外支付这块一直是个头疼的问题。想用Google Wallet吧,但它是采用NFC接触式交易,想要进行线上服务时没法进行,后来就去整个贝宝PayPal支付。在这里想吐槽一下,PayPal支付做起…

zencart1.55手把手教你开发stripe支付插件

第一步&#xff1a;在includes/modules/payment目录下创建名称为c_stripe的文件夹&#xff0c;用于存放stripe支付logo 第二步&#xff1a;在同includes/modules/payment目录下创建c_stripe.php文件&#xff0c;这个文件就是用于编写zencart支付插件,代码如下 <?php // /…

JAVA接入STRIPE支付教程(测试环境),STRIPE支付的调用以及STRIPE WEBHOOK回调

一、环境准备 1.注册 2.密钥 3.WEBHOOK回调 二、核心代码 1.配置API.key以及webhook.key 2.支付demo 3.WEBHOOK回调 一、环境准备 1.注册 STRIPE官网自行注册账号 2.两个重要的密钥 首先在STRIPE官网注册账号之后进入首页&#xff0c;点击API密钥&#xff0c;查看账号对应的…

前端对接stripe支付,创建测试session_is

第一次搞 stripe支付&#xff0c;国外的文档全英文 接stripe支付&#xff0c;根据官方文档&#xff0c;首先就是先跟服务端交互&#xff0c;创建session会话&#xff0c;获取id&#xff0c;当服务端不做这个功能时&#xff0c;就需要前端去掉stripe最底层的api&#xff0c;拿到…

Stripe支付简介和前端js调用

最近公司正在做一个国际版APP&#xff0c;涉及到海外支付&#xff0c;调研过Paypal、Skrill、BrainTree、Stripe&#xff08;可参考海外移动支付方案对比&#xff09;&#xff0c;最终 选择了Stripe支付。Stripe特点如下&#xff1a; 收费规则简单透明&#xff0c;手续费就是收…