为了让演员在命中时做出响应,我们可能会使用内置的损坏系统。
在非常高的水平上,我们希望控制所有这些事物的外观和声音,这意味着我们将整合不同的资产,以利用引擎的渲染、动画、效果和音频系统。
有了虚幻,我们可以在蓝图中C++或蓝图中实现这些内容。例如,下面介绍我们如何将武器的线跟踪功能(即检查火线碰撞的射线广播)作为C++功
能:
void AWeapon::RunWeaponTrace(const FTransform& MuzzleTransform, float TraceDistance)
{
const FVector TraceStart = MuzzleTransform.GetLocation();
const FVector TraceEnd = TraceStart + (MuzzleTransform.GetUnitAxis(EAxis::X) * TraceDistance);
const FCollisionQueryParams QueryParams(TEXT("WeaponTrace"), false, this);
FHitResult Hit;
if (GetWorld()->LineTraceSingleByChannel(Hit, TraceStart, TraceEnd, ECC_WeaponFire, QueryParams))
{
if (Hit.Actor.IsValid())
{
const float DamageAmount = 1.0f;
const FVector ShotFromDirection = (TraceEnd - TraceStart).GetSafeNormal();
const TSubclassOf<UDamageType> DamageTypeClass = UDamageType_WeaponFire::StaticClass();
const FPointDamageEvent DamageEvent(DamageAmount, Hit, ShotFromDirection, DamageTypeClass);
Hit.Actor->TakeDamage(DamageAmount, DamageEvent, OwningController, this);
}
}
}
但是,我们可以同样轻松地在蓝图中实现完全相同的功能:
...无论哪种方式,我们利用相同的基础引擎系统在几乎相同的方式。
设计概念:脚本与编程
因此,对于我们最终设计中的一个功能,如武器,在抽象的不同层次上,有各种各样的问题需要回答——从非常低的水平,如
"
如何获得我需要处理的
记忆
"
,到非常高级的,比如
"
当抱着我的玩家收集损坏电源时,我会发光什么紫色阴影?
这些低级别的问题通常在引擎编程领域:所有的核心技术,使我们能够建立一个游戏,而不必太关心我们正在制作什么样的游戏。
当我们开始利用该核心技术来解决我们制作的特定游戏的根本问题,并构建使我们的游戏可玩的系统时,我们进入游戏编程。
然后是建立在这些系统的基础上,以充实玩家的分钟到分钟的经验,我们可以广泛地将其标记为脚本。脚本侧重于更高层次的问题,如:游戏的整体流
程和进度:不同游戏对象之间的高级别交互;以及具体、具体的游戏对象的外观、感觉和行为。