Skill&Container - B477042/GraduationProject GitHub Wiki

About Skill&Container

Skill์˜ ํ™•์žฅ์„ฑ์— ์ค‘์ ์„ ๋‘๊ณ  ์„ค๊ณ„๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด Skill Actor๋“ค์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ Container๋ผ๋Š” Component๋ฅผ ๋งŒ๋“ค์–ด Weak Pointer๋กœ ์ œ์–ด๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. Skill์— ๋”ฑ ๋งž๋Š” Container๋ฅผ ๋งŒ๋“ค๊ธฐ๋„ ํ•˜์˜€๊ณ  ๋ฒ”์šฉ Container๋กœ ์ฒ˜๋ฆฌํ•œ ๊ฒฝ์šฐ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Skill Actor & Container

SkillActor.h


protected:
UCLASS()
class ESCAPEGAME_API ASkillActor : public AActor
{
	UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
	USceneComponent* Root;

	//ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์ฃผ๋œ ์ดํŽ™ํŠธ
	UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "effect")
	UParticleSystemComponent* VFX_Main;

	//๋ช…์ค‘์‹œ ์ดํŽ™ํŠธ
	UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "effect")
	UParticleSystemComponent* VFX_Hit;

	UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Collision")
	USphereComponent* MainCollision;

	//๋งž์œผ๋ฉด ๋‚˜๋Š” ์†Œ๋ฆฌ
	UPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = "Contents")
	UAudioComponent* SFX_Hit;
	//์ฃผ๋ณ€์—์„œ ๋‚˜๋Š” ์†Œ๋ฆฌ
	UPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = "Contents")
	UAudioComponent* SFX_Passing;

	UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"), Category = Info)
		float Damage;
}

Skill์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ Mesh๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ณด๋‹จ Particle์ด ๊ฐ€์žฅ ์ ์ ˆํ•˜๊ธฐ ๋•Œ๋ฌธ์— Particle๊ณผ Sound๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.

Component_SkillContainer.h

UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class ESCAPEGAME_API UComponent_SkillContainer : public UActorComponent
{
public:	

	virtual void UseSkill(const AActor& TargetActor,const FVector& Direction , int n_Count=1) PURE_VIRTUAL(UComponent_SkillContainer::UseSkill,  );

protected:
	void clear();


	UPROPERTY(EditAnywhere,  Category = "contents", meta = (AllowPrivateAccess = "true"))
		TArray< TWeakObjectPtr< ASkillActor > > SkillObjects;
	UPROPERTY(VisibleAnywhere, Category = "contents", meta = (AllowPrivateAccess = "true"))
		TWeakObjectPtr < ASkillActor> CurrentIndex;
	UPROPERTY(VisibleAnywhere, Category = "contents", meta = (AllowPrivateAccess = "true"))
		int Index;
	//๋ฐฐ์—ด ์ดˆ๊ธฐํ™” ํฌ๊ธฐ. ๋Š˜์–ด๋‚˜์ง„ ์•Š๋Š”๋‹ค
	UPROPERTY(VisibleAnywhere, Category = "contents", meta = (AllowPrivateAccess = "true"))
		int ArraySize;
}

Skill Object๋“ค์„ ์Šคํฐํ•œ ํ›„ ์ปดํฌ๋„ŒํŠธ์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์„ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. Use Skill์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ Pure virtual ํ˜•ํƒœ๋กœ ์„ ์–ธํ•˜์—ฌ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์ž์‹ ์˜ ๋ชฉ์ ์— ๋งž๋Š” ํ˜•ํƒœ์˜ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

Skill Actor & Container ๊ตฌํ˜„ํ•  ๋•Œ ์ง‘์ค‘ํ•œ ์ 

ํ•˜์œ„ ํด๋ž˜์Šค๋“ค์€ ์–ด๋–ค ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ๊ฒŒ์ž„์„ ๊ตฌ์„ฑํ• ์ง€ ์ƒ๊ฐํ•˜๋ฉฐ ๊ณตํ†ต๋˜๋Š” ์ ์„ ์ฐพ์•„์„œ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. Skill์€ VFX์™€ SFX ์ค‘์‹ฌ์ด๊ณ  Container๋Š” ์ด Skill actor๋ฅผ ์˜ค๋ธŒ์ ํŠธ ํ’€๋ง์„ ํ†ตํ•ด ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋‘ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“  ๋ชฉ์ ์€ ์ƒ์†์„ ํ†ตํ•œ ํ™•์žฅ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ณ  Cast๋ฅผ ํ†ตํ•œ ์ œ์–ด๋ฅผ ํŽธํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. ์ด ๋ชฉ์ ์— ๋งž๋Š” ๋‚ด์šฉ์œผ๋กœ ๊ตฌ์„ฑ๋˜๊ฒŒ ์ง‘์ค‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์œ„ ํด๋ž˜์Šค๋“ค์— ๋Œ€ํ•˜์—ฌ

  • Projectile ๊ณ„์—ด์„ ์ œ์™ธํ•œ ํ•˜์œ„ Skill actor๋Š” ๊ฐ๊ฐ์˜ ์‚ฌ์šฉ์‹œ ํ˜ธ์ถœ ๋ฐฉ๋ฒ•๊ณผ ์–ด๋–ค ํšจ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  ์–ด๋–ค ์—์…‹์„ ์ด์šฉํ•˜๋Š”์ง€๋งŒ ์ž‘์„ฑ๋์Šต๋‹ˆ๋‹ค.Projectile ๊ณ„์—ด Skill์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ, Gunner์˜ Mag Component์ฒ˜๋Ÿผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค
  • SKill container ๊ณ„์—ด ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ, Owner์˜ ์‚ฌ์šฉ ์š”์ฒญ์ด ๋ฐœ์ƒํ•˜๋ฉด ์ง€๊ธˆ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Skill actor์ค‘ ํ•œ actor์—๊ฒŒ Transform ์ •๋ณด๋ฅผ ๋ณด๋‚ด์ค๋‹ˆ๋‹ค. ์ด ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ Container ๋‚ด๋ถ€์—์„œ Skill์—๊ฒŒ ๋ช…๋ น์„ ํ•˜๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„์‹œ ์ง‘์ค‘ํ•œ ์ 

  • ์ƒ์†์„ ๋ฐ”ํƒ•์œผ๋กœ skill์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ง‘์ค‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ์žฌํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•œ ์ƒ์†์˜ ํŠน์„ฑ์„ ์ด์šฉํ•œ ์ฝ”๋“œ ๊ด€๋ฆฌ๋ฅผ ํ†ตํ•ด ์ƒ์‚ฐ์„ฑ์„ ์˜ฌ๋ฆฌ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒ์†์„ ์ ์šฉ์‹œํ‚ค๊ธฐ ์ „์—๋Š” ๊ฐ์ž ํด๋ž˜์Šค๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค๊ณ  ๊ณตํ†ต๋˜๋Š” ๋ถ€๋ถ„์„ ๋ฐ˜๋ณตํ•ด์„œ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ, ์ƒˆ๋กœ์šด Skill๊ณผ ๊ด€๋ฆฌํ•˜๋Š” Component๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„์‹œ ์–ด๋ ค์› ๋˜ ์ 

  • ์ƒ์†์„ ์ ์šฉ์‹œํ‚ค๊ธฐ ์ „, ๋งˆ๊ตฌ์žก์ด๋กœ ๋งŒ๋“  ํด๋ž˜์Šค๋“ค์˜ ๊ณตํ†ต์ ์„ ํŒŒ์•…ํ•˜๋Š” ๊ณผ์ •์ด ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค. ๊ณตํ†ต๋œ ํŠน์„ฑ์„ ์ƒ๊ฐ์น˜ ๋ชป ํ•˜๊ณ  ์ƒ์‚ฐ์„ฑ์ด ๋–จ์–ด์ง€๋Š” ๋ฐฉ์‹์œผ๋กœ ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒ์†์„ ์ ์šฉ์‹œ์ผœ์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ•œ ๊ณ„๊ธฐ๋Š” ์ด๋Ÿฐ ์œ ํ˜•์˜ Actor์™€ Component๋ฅผ ์ƒ๊ฐ๋ณด๋‹ค ์ž์ฃผ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋ˆˆ์น˜์ฑˆ ์‹œ์ ์ด์˜€์Šต๋‹ˆ๋‹ค. ๋‹น์‹œ 3๊ฐ€์ง€ ์ •๋„์˜ Skill์ด ์žˆ์—ˆ๊ณ  ์ด ์Šคํ‚ฌ์€ ๊ฐ์ž ๋…๋ฆฝ๋œ ์ƒํƒœ์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ถ”๊ฐ€๋ฅผ ํ•˜๋ฉด ๋์ด ์—†์„ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ์ด ๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒ์†์ด ๋– ์˜ฌ๋ž๊ณ  ๊ฐ์ž ์Šคํ‚ฌ์˜ ๊ณตํ†ต๋˜๋Š” ๋ถ€๋ถ„์„ ์ •๋ฆฌํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ์ด ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ Actor๋“ค์€ Skill Actor๋กœ Component๋“ค์€ Container๋กœ ์ƒ์†์„ ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์„ค๊ณ„์˜ ์ค‘์š”์„ฑ๊ณผ ์ƒ์‚ฐ์„ฑ์„ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒ์†์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๋ฐฐ์šฐ๊ฒŒ ๋์Šต๋‹ˆ๋‹ค.