本小节的教程需要完成前置教程:建议阅读《实例甜点 Unreal Engine 4迷你教程(5)》,因为5里面提到了本节的工程,不过也可以在不看5的前提下直接阅读本教程。

第一步:Empty的工程(C++ Basic Code);

第二步:新建MyActor类;

第三步:新建一个叫做sand的Actor类:

Tips:我在调试过程中遇到很恶心的事情,就是修改了代码之后发现没有用,这可能是热加载失败的表现,请重新打开UE4(VS不用重启)。

第四步:

Sand文件不用修改,只需要修改MyActor的文件如下:

  1. ▼代码开始
  2. // Fill out your copyright notice in the Description page of Project Settings.
  3.  
  4. #pragma once
  5.  
  6. #include "CoreMinimal.h"
  7. #include "GameFramework/Actor.h"
  8. #include "sand.h"
  9. #include "MyActor.generated.h"
  10.  
  11. UCLASS()
  12. class EMPTY_API AMyActor : public AActor
  13. {
  14. GENERATED_BODY()
  15.  
  16. public:
  17. // Sets default values for this actor's properties
  18. AMyActor();
  19.  
  20. protected:
  21. // Called when the game starts or when spawned
  22. virtual void BeginPlay() override;
  23.  
  24. public:
  25. // Called every frame
  26. virtual void Tick(float DeltaTime) override;
  27.  
  28. UPROPERTY()
  29. TArray<Asand* > arr;//【注意最好有UPROPERTY()标注】
  30.  
  31. };
  32. ▲代码结束
  33.  
  34. ▼代码开始
  35. // Fill out your copyright notice in the Description page of Project Settings.
  36.  
  37. #include "MyActor.h"
  38.  
  39. // Sets default values
  40. AMyActor::AMyActor()
  41. {
  42. // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
  43. PrimaryActorTick.bCanEverTick = true;
  44.  
  45. }
  46.  
  47. // Called when the game starts or when spawned
  48. void AMyActor::BeginPlay()
  49. {
  50. Super::BeginPlay();
  51. for (auto i = ; i < ; i++)
  52. {
  53. Asand* newSand = GetWorld()->SpawnActor<Asand>(Asand::StaticClass());//【SpawnActor的方法】
  54. arr.Add(newSand);//【Add的方法】
  55. UE_LOG(LogTemp, Warning, TEXT("%s"), *FString("[log by wenjie] i ve added a sand tinto arr"));//【打印的方法】
  56. }
  57.  
  58. }
  59.  
  60. // Called every frame
  61. void AMyActor::Tick(float DeltaTime)
  62. {
  63. Super::Tick(DeltaTime);
  64. static int32 Timer = ;
  65. if (Timer++ == )
  66. {
  67. UE_LOG(LogTemp, Warning, TEXT("%s"), *FString("[log by wenjie] Time==20"));
  68. /*
  69. 不正确的方法:
  70. for (auto i : arr)
  71. {//【不建议的remove方法】
  72. arr.Remove(i);
  73. UE_LOG(LogTemp, Warning, TEXT("%s"), *FString("[log by wenjie] removed one instance"));
  74. }
  75.  
  76. 上面的remove的方法不十分优雅:
  77. 在执行过程中报如下错误【可能死机也可能不死机】:
  78. LogOutputDevice:Error: === Handled ensure: ===
  79. LogOutputDevice:Error: Ensure condition failed: Lhs.CurrentNum == Lhs.InitialNum [File:D:\UE4.16.3\UE_4.16\Engine\Source\Runtime\Core\Public\Containers/Array.h] [Line: 197]
  80. LogOutputDevice:Error: Array has changed during ranged-for iteration!
  81.  
  82. 以下提供恰当的remove方法:
  83. //参考资料:
  84. //https://forums.unrealengine.com/showthread.php?69383-A-Little-Tip-Remove-elements-from-an-array-in-one-pass-with-a-reverse-for-loop
  85. */
  86. for (auto i = arr.Num() - ; i >= ; i--)
  87. {
  88. arr.RemoveAt(i);
  89. UE_LOG(LogTemp, Warning, TEXT("%s"), *FString("[log by wenjie] removed one instance"));
  90. }
  91. }
  92. }
  93.  
  94. ▲代码结束

补充说明:不是说remove(实例引用)不对,而是不应该把它和foreachloop搭配,正确的做法是倒序移除。

你看,完全没有红色的报错:

——小江村儿的文杰 zouwj5@qq.com 2017年8月7日21:50:52

实例甜点 Unreal Engine 4迷你教程(6)之三个重要基础操作SpawnActor、TArray的Add和Remove的更多相关文章

  1. 实例甜点 Unreal Engine 4迷你教程(4)之用C++实现添加子Widget到VerticalBox中以及ClearChildren

    前置教程: 1. 实例甜点前面的三篇教程: 2. 最好看看笔者前面的一篇关于博文(后记:本来笔者想用C++做DragAndDrop的功能,但是失败了,下面是蓝图实现的方法): http://www.c ...

  2. 实例甜点 Unreal Engine 4迷你教程(3)之用C++改变Image小部件的其它属性

    完成本迷你教程之前,请前往完成以下迷你教程: ·实例甜点 Unreal Engine 4迷你教程(2)之用C++改变Image小部件的颜色: 在上一次的迷你教程的LearnWidgets工程上进行(如 ...

  3. 实例甜点 Unreal Engine 4迷你教程(2)之用C++改变Image小部件的颜色

    完成本迷你教程之前,请前往完成以下迷你教程: ·实例甜点 Unreal Engine 4迷你教程之如何用C++将纹理绘制在UserWidget的Image小部件上: 目标:实现UMG中的此功能: 在上 ...

  4. 实例甜点 Unreal Engine 4迷你教程(1)之如何用C++将纹理绘制在UserWidget的Image小部件上

    完成本迷你教程之前,请前往完成以下迷你教程: 无前置教程待完成. 本教程适合的人群: 初学者,具有开发经验两周: 本示例的目的:为了在代码中实现UMG中的这个功能: 说明:这是一些列迷你教程的首篇,所 ...

  5. 实例甜点 Unreal Engine 4迷你教程(5)之函数中的静态变量

    本小节的教程无前置教程,可直接学习,篇幅很短. 本教程浓缩起来就是一句话:函数中的静态变量在调试过程中保留值.所以需要谨慎对待. 什么意思?请先不要一步一步对着做,而整体地看一遍下面的过程: 第一步: ...

  6. Unreal Engine 4 系列教程 Part 1:入门

    原文:Unreal Engine 4 Tutorial for Beginners: Getting Started 作者:Tommy Tran 译者:Shuchang Liu 本篇教程将引导你安装U ...

  7. Unreal Engine 4 系列教程 Part 3:材质教程

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  8. Unreal Engine 4 系列教程 Part 4:UI教程

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  9. Unreal Engine 4 系列教程 Part 5:制作简单游戏

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

随机推荐

  1. nginx二级域名配置自动跳转到一级域名

    nginx二级域名配置自动跳转到一级域名 rewrite配置内容: if ($http_host !~ "^www.aaa.com$") { rewrite ^(.*) http: ...

  2. 根据list得到list中的最大值最小值

    List ll = new ArrayList(); ll.add(new BigDecimal(1)); ll.add(new BigDecimal(4.99)); ll.add(new BigDe ...

  3. oracle11g的内存分配不当,导致的错误ORA-01034,ORA-00838,ORA-27101

    由于开发需要,oracle11g被应用于虚拟机,所以系统资源显得弥足珍贵,百度了一下就有答案. 用dba身份进入Oracle,笔者在plsql中对数据库进行管理: show parameter sga ...

  4. chart.js使用常见问题

    Chart.js是一个简单.面向对象.为设计者和开发者准备的图表绘制工具库. 在使用过程中新手可能会遇到很多问题导致图标无法显示.下面我们来看一下在使用过程中可能会遇到的问题. 刚开始用chart.j ...

  5. JavaScript从入门到忘记

    JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. 一.如何编写 二.变 ...

  6. Web开发资料

    慢慢更新 1. Quackit 墙裂推荐!提供了一系列教程,bootstrap的模板也很好用. 2. Bootstrap 4 Cheat Sheet 好用,比官网更加一目了染.  3.Chart. ...

  7. ReIn

    package JBJADV003; import java.io.*;import java.util.Scanner; public class ReIn { /** * @param args ...

  8. vue的增删改查

    我们把这些用户信息保存到list的数组中,然后增删改查就在这个数组上进行: list: [ { username: 'aaaaa', email: '123@qq.com', sex: '男', pr ...

  9. Java 用Freemarker完美导出word文档(带图片)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

  10. spring boot 打war包部署,打jar包

    官方文档:http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable- ...