5596人加入学习
(18人评价)
【旧版】Unreal初级课程 - 3D吃豆人

旧版课程,制作完成于2018-03-29,基于Unreal 4.18

价格 免费

PacManGameModeBase.h

#include "Public/Enemy.h"

UCLASS()
class PACMAN_API APacManGameModeBase : public AGameModeBase
{
	GENERATED_BODY()
public:
	// 易受攻击的方法
	void SetEnemyVulnerable();

private:
	// 定义一个数组,保存所有的敌人
	TArray<class AEnemy*> Enemys;
};

PacManGameMode.cpp

#include "Public/EngineUtils.h"

// 易受攻击的事情,用 GameMode 来处理所有的敌人,在 Character 中直接调用 GameMode 的这个方法,就可以把所有的敌人都设置成易受到攻击的状态,而不必分别设置了
// 设置成易受攻击,被主角吃的行为就好了
void APacManGameModeBase::SetEnemyVulnerable()
{
	// 遍历所有的Enemy,调用它身上的SetVulnerable方法就可以了
	// Iter 表示存在的话,Iter++
	for (auto Iter(Enemys.CreateIterator()); Iter; Iter++)
	{
		// 调用它身上的SetVulnerable方法
		(*Iter)->SetVulnerable();
	}
}

void APacManGameModeBase::BeginPlay()
{
	SetCurrentState(EGameState::EPlaying);
	// 使用迭代器,需要引入头文件:Public/EngineUtils.h
	// 获得所有的敌人 ;起个名字:enemyItr; GetWorld():从世界得到; enemyItr 存在的话就去遍历
	for (TActorIterator<AEnemy> enemyItr(GetWorld()); enemyItr; ++enemyItr)
	{
		// 强制转化成 AEnemy
		AEnemy* enemy = Cast<AEnemy>(*enemyItr);
		// 转化后,看存不存在
		if (enemy)
		{
			// 如果存在的话,就添加到数组里面
			Enemys.Add(enemy);
		}
	}
}

PacManCharacter.cpp

void APacManCharacter::OnCollision(UPrimitiveComponent * HitComp, AActor * OtherActor, UPrimitiveComponent * OtherComp, int OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)
{
	// 当游戏正在运行才去检测碰撞
	if (GameMode->GetCurrentState() == EGameState::EPlaying)
	{
		// 调用易受攻击的状态,什么时候调用:就是在主角吃到了超级大力丸的时候调用,把敌人设置成易受攻击的状态,找到主角,找到碰撞函数 OnCollision
		// 碰到是食物的话,就把它销毁
		// 当碰撞的对象是 ACollectables 类时销毁掉
		// 使用自己定义的类AColletables,也需要引入对应的头文件: #include "Public/Collectables.h"
		if (OtherActor->IsA(ACollectables::StaticClass()))
		{
			// 吃到豆子
			// 强制转化成豆子
			ACollectables* collectable = Cast<ACollectables>(OtherActor);
			// 判断是不是大力丸
			if (collectable->bIsSuperCollectable)
			{
				// 把敌人变成易受攻击的状态
				GameMode->SetEnemyVulnerable();
			}
			// 销毁豆子
			OtherActor->Destroy();
			// 检测一下豆子的数量是否为 0
			if (--CollectablesToEat == 0)
			{
				GameMode->SetCurrentState(EGameState::EWin);
			}
			UE_LOG(LogTemp, Warning, TEXT("Remain Collectable is %d"), CollectablesToEat);
		}
	}
}

GameMode 是定制游戏规则的地方

按下 P 键,所有的敌人都不能移动

GameMode 来管理所有的敌人

把敌人易受攻击的状态设置

单独一个一个设置太麻烦了

在GameMode 里面获得所有敌人

调用易受攻击的方法就可以了

GameModeBase 获得所有敌人,需要引入头文件:敌人

[展开全文]

授课教师

SIKI学院老师

课程特色

图文(1)
下载资料(1)
视频(30)

学员动态

bksy 加入学习
lisa555 加入学习
花点不开就不开 加入学习