欢迎光临散文网 会员登陆 & 注册

21_209~218SoulsAndStamina

2023-03-25 17:43 作者:俯瞰万千风景  | 我要投稿

209 Souls Niagara System给灵魂创建一个特效粒子

Creating A Niagara System For Souls

使用Niagara创建一个灵魂的特效

210 Soul  Class

Creating the soul pickup创建可以捡起的灵魂

创建了一个Soul类,继承自Item

然后新建一个Soul类的蓝图

添加上一节创建的Niagara特效

拾取的逻辑与Treasure类相同


class UNiagaraSystem;

UCLASS()
class UE5_0307_API ASoul : public AItem
{
	GENERATED_BODY()
	

public:
	FORCEINLINE int32 GetSouls() const { return Souls; }
	FORCEINLINE void SetSouls(int32 SoulNum) { Souls = SoulNum; }
protected:

	virtual void OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) override;

private:

	UPROPERTY(EditAnywhere, Category = "Souls")
	int32 Souls = 1;
	
};
#include "Items/Soul.h"
#include "Interface/PickupInterface.h"



void ASoul::OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
	IPickupInterface* PickInterface = Cast<IPickupInterface>(OtherActor);//将传入的AActor* OtherActor转成EchoAcharatcer,需要识别参与碰撞的是我们控制的角色类
	if (PickInterface)
	{
		PickInterface->AddSouls(this);

		SpawnPickEffect();
		SpawnPickSound();
		
		Destroy();
	}
}

211 Pickup interface拾取接口

Creating an interface for picking up items创建一个拾取物品的接口


我们通过创建一个pickup的接口来实现一个统一的拾取功能

在UE中,创建一个接口类,命名为PickupInterface

将Item中的OnShpereOverlap方法移动到这个接口中

让EchoCharacter类继承PickupInterface类


在item类中 OnSphereOverlap 和OnSphereOverlapEnd方法中,将EchoCharacter替换为pickupInterface

在EchoCharacter类中,删除之前的FORCEINLINE OnSphereOverlap方法,使用重写

在PickupInterface类中,添加一个方法AddSouls

212 Soul Pickup Effects拾取灵魂的效果

Effects for picking up souls

创建一个Niagara粒子特效

然后在Soul类中,添加Niagara对象

在OnSphereOverlap方法中实现这个效果

编译之后进入游戏,给soul的蓝图类设置之前创建的Niagara特效 然后运行游戏就可以看到效果

我们可以进一步吧拾取特效和播放声音 提升到item类中

213 Soul and Gold Attirbte灵 魂和黄金属性

在AttributeComponent类中,添加金币和灵魂的get和set方法 和对应的变量

AttributeComponent类

Soul类

完善EchoCharacter类中, AddGold和AddSoul的方法

在方法中,对界面MainInterface的文字进行设置

214 Enemies Spawning Souls敌人产生的灵魂

Getting Souls when Killing Enemies杀死敌人时获得灵魂

给Enemy添加掉落soul

在Die方法中添加掉落

我们可以进一步在Enemy实例中,修改每一个敌人掉落的魂的数量

视频中的代码是通过enemy的Attribute进行的设置

215 Dodge Animation躲避动画

Getting an Animation for Dodging获得躲避的动画

导入一个闪避动画

视频里面使用的是echo在远古山脉中的动作,展示了一下资产迁移

我自己使用了mixamo上的动画

216 Dodge Montage躲避

montageSetting up Dodge Functionality设置躲避的功能

在BaseCharacter类中,新建方法PlayDodgeMontage


void ABaseCharacter::PlayDodgeMontage()
{
	PlayMontageSection(DodgeMontage, FName("Default"));
}


然后在项目设置中设置按键

继续在EchoCharacter中创建播放montage的方法Dodge()

void AEchoCharacter::Dodge()
{
	PlayDodgeMontage();
}

SetupPlayerInputComponent方法绑定按键和对应的方法

编译之后,在UE中给玩家设置Dodge的montage,然后运行游戏查看

视频中,给Dodge添加了状态判断,在Montage中添加了一个DodgeEnd,在蓝图中调用

217 Stamina体力

Using Stamina When We Dodge躲避时使用体力

在AttributeComponent类中,添加了恢复体力和使用体力的方法

void UAttributeComponent::ReceiveDamage(float Damage)
{
	//Health -= Damage;  
	//这样写 需要去做是否小于0的判断,避免在计算进度条或者其他的时候报错,所以我们选择下面这种方式

	Health = FMath::Clamp(Health - Damage, 0.f, MaxHealthl);
	//使用Clamp,可以将结果限制在一个指定的范围,不用专门去做判断

}
void UAttributeComponent::UseEnergy(float EnergyCost)
{
	Energy = FMath::Clamp(Energy - EnergyCost, 0.f, MaxEnergy);
}

完善了Dodge方法,在使用时判断体力值

void AEchoCharacter::Dodge()
{
	if (Attributes && Attributes->GetEnerge() < Attributes->GetDodgeCost())
	{
		UE_LOG(LogTemp, Warning, TEXT("Dodge() OUT"));
		return;
	}

	PlayDodgeMontage();

	AttackState = EAttackState::EAS_Dodge;
	if (Attributes && MainInterface)
	{
		Attributes->UseEnergy(Attributes->GetDodgeCost());
		MainInterface->SetEnergyProgress(Attributes->GetEnergyPercent());
	}
}

在Tick方法中,对体力值进行恢复

void AEchoCharacter::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
	
	if (Attributes && MainInterface)
	{
		Attributes->RecevieEnergy(DeltaTime);
		MainInterface->SetEnergyProgress(Attributes->GetEnergyPercent());
	}

}

218小结

尝试创建一个拾起恢复血量的特效

21_209~218SoulsAndStamina的评论 (共 条)

分享到微博请遵守国家法律