【发布时间】:2015-09-09 15:46:59
【问题描述】:
在 UE4 中,我正在我的 Graphics 2 课程中制作 Puzzle Block 游戏。我们的教授和我们的班级正在一起学习 UE4。整个班级对 C++ 代码中的一件事感到有些困惑,我的教授说他会尝试自己找出答案,但我想我会用我在这里找到的信息开始我们的下一堂课。
好的,在 BlockGrid.cpp 文件中,这部分代码用于创建块。
void AMyProject2BlockGrid::BeginPlay()
{
Super::BeginPlay();
// Number of blocks
const int32 NumBlocks = Size * Size;
// Loop to spawn each block
for(int32 BlockIndex=0; BlockIndex<NumBlocks; BlockIndex++)
{
const float XOffset = (BlockIndex/Size) * BlockSpacing; // Divide by dimension
const float YOffset = (BlockIndex%Size) * BlockSpacing; // Modulo gives remainder
// Make postion vector, offset from Grid location
const FVector BlockLocation = FVector(XOffset, YOffset, 0.f) + GetActorLocation();
// Spawn a block
AMyProject2Block* NewBlock = GetWorld()->SpawnActor<AMyProject2Block>(BlockLocation, FRotator(0,0,0));
// Tell the block about its owner
if(NewBlock != NULL)
{
NewBlock->OwningGrid = this;
}
}
}
混淆始于此函数中的以下行:
AMyProject2Block* NewBlock = GetWorld()->SpawnActor<AMyProject2Block>(BlockLocation, FRotator(0,0,0));
每次看起来它都在为拼图中的每个新块重写 NewBlock。我们的问题是我们正在创建的游戏,即Lights Out game,如果 NewBlock 不断被重写,那么它如何跟踪屏幕上显示的块的信息地址?这可以通过简单地创建一个数组来存储信息来解决,但是如果信息仍然保存在某个地方,这将是低效的。那么,如果 NewBlock 被每个循环覆盖,我们如何访问块的信息,而不用创建一个数组来低效地存储数据呢?
谢谢!!!! :)
【问题讨论】:
-
注意:我不知道 UE4 的任何细节。根据上面的代码(我猜这是其他地方的样板),世界(来自
GetWorld())保持对生成的Actor的引用,所以NewBlock指针就在那里,所以OwningGrid字段可以是放。任何进一步访问世界上的 Actor 都必须通过另一种方式找到该引用。 (例如:answers.unrealengine.com/questions/16805/…)。请注意,保留指针数组并不是低效的,虽然我不知道 UE4 保留 Actor 指针的策略。
标签: c++ memory-address unreal-engine4