1. 애니메이션 블렌딩

2. Character UpDown 애니메이션

3. Character Crouch

4. Character Bool 변수

5. Ammo 클래스

6. Ammo 탄 회전

 

'Unreal > Game 2 ' 카테고리의 다른 글

8.1 AimOffSet 적용  (0) 2019.06.24
8. AimOffSet 방법 2가지  (0) 2019.06.24
7.2 발사 사운드 및 cue / wav  (0) 2019.06.21
7.1 발사 이펙트 + 사운드 cue,wav  (0) 2019.06.21
7. 탄 생성, 발사, 재장전  (0) 2019.06.20

1. AudioComponet 에 등록하고 재생하는 방법

2. UGamePlayStatic::PlaySound 로 재생하는 방법

3. Cue 파일 재생 방법

4. wav 파일  재생 방법

 


1. AudioComponet 에 등록하고 재생하는 방법

//h
UAudioComponent* AudioComponent;

USoundCue* Fire_Sound;

//cpp
{
  AudioComponent = CreateDefaultSubobject<UAudioComponent>(TEXT("SOUND"));;
  AudioComponent->SetupAttachment(Mesh);

  static ConstructorHelpers::FObjectFinder<USoundBase> FireSound(TEXT("SoundWave'/Game/_SOUND/Pistol_FIRE.Pistol_FIRE'"));
  if (FireSound.Succeeded())
  {
	Fire_Sound = FireSound.Object;
  }
}


{
	if (AudioComponent->IsValidLowLevelFast()) 
   {
		AudioComponent->SetSound(Fire_Sound);
   }
}


{
  AudioComponent->Play();
}

 

소리 액터


플레이어 안태 소리에 따른 감쇠 없이 재생이 된다.


※ 본인이 AudioComponet을 이용하여 감쇠하는 방법을 못찾은 거 일수도 있음


2. UGamePlayStatics::PlaySound 로 재생하는 방법


UGameplayStatics::PlaySoundAtLocation(this, Fire_Sound, GetActorLocation());
static void PlaySoundAtLocation(const UObject* WorldContextObject, USoundBase* Sound, 
FVector Location, float VolumeMultiplier = 1.f, float PitchMultiplier = 1.f, 
float StartTime = 0.f, class USoundAttenuation* AttenuationSettings = nullptr, USoundConcurrency* ConcurrencySettings = nullptr)
{
  PlaySoundAtLocation(WorldContextObject, Sound, Location, FRotator::ZeroRotator, VolumeMultiplier, PitchMultiplier, StartTime, AttenuationSettings, ConcurrencySettings);
}

 

AudioComponet  필요 없이,  UGameplayStatics:: 이용해서 재생을 하면 된다.

UGameplayStatics 이용하면 USoundAttenuation을 이용해서 소리 기하감쇠 넣을 수 있는 함수까지 사용 할수 가 있다.

코드로 만들 경우, 2 물체 거리를 체크를 한다음. 소리 크키를 보간해서 재생하면 될거 같다

 

거리에 따른 소리감쇠


총소리도 위처럼 기하감쇠를 적용예정


3. Cue 파일 재생 방법

 

 

Soundcue - Wave파일 연결시 오류



Soundcue로 만들면, 파일 확장자도 cue 여야 소리가 재생된다


4. wav 파일  재생 방법


 SoundBase 로 만들로 정의 하고 실행을 하니 Wave 확장자도 소리가 재생된다.

USoundWave을 이용해도 Wave 확장자가 재생된다.



총소리는 기하 감쇠를 적용하기 위해서 일단 UPlayStatuc을 이용해서 재생을 하게 함


소리는 Fire, Reload, EmptyFire 을 적용함

발사 사운드

 

'Unreal > Game 2 ' 카테고리의 다른 글

8. AimOffSet 방법 2가지  (0) 2019.06.24
7.3 코드 수정  (0) 2019.06.23
7.1 발사 이펙트 + 사운드 cue,wav  (0) 2019.06.21
7. 탄 생성, 발사, 재장전  (0) 2019.06.20
6. 무기 생성 및 소켓 장착  (0) 2019.06.19


이펙트 리소스 시간 제작에 시간이 많이 걸림

이미지 찾고, 마테리얼 만들고, 파티클로 만들어 보고, 루프재생되는 걸 막음

 

적용할 사격 이펙트 

 


파티클 리소스 루프 수정




파티클 리소스가 루프 재생일 경우에는 

Emitter Loops 를 1로 설정하면 되다.

0일 경우에는 루프 재생이다






//h
{
  UPROPERTY(VisibleAnywhere, Category = "Weapon")
	UParticleSystemComponent* Effect;
}
//cpp
AKPistol::AKPistol()
{
	static ConstructorHelpers::FObjectFinder<UParticleSystem> gunmuzzle(TEXT("ParticleSystem'/Game/Muzzles/Particles/Pistol_Muzzle.Pistol_Muzzle'"));
	if (gunmuzzle.Succeeded())
	{
		Effect->SetTemplate(gunmuzzle.Object);
		Effect->bAutoActivate = false;
	}
}



UParticleUParticleSystemComponent 을 만들고 변수로 설정을 해준다.
bAutoActivate는 자동재생을 막아준다, 안할 경우 바로 파티클이 재생된다.



void AKPistol::Fire()
{
	if (CurrentAmmo <= MinAmmo) {
		KCHECK("Ammo 0, Reload");
		return;
	}
	else
	{
		CurrentAmmo -= 1;
		
		Effect->Activate(true);
		//Effect->SetActive(true, true);
	}
}



그리고 Actviate 함수를 이용해서 재생하면 된다.

탄 크기는 스케일 줌


 

'Unreal > Game 2 ' 카테고리의 다른 글

7.3 코드 수정  (0) 2019.06.23
7.2 발사 사운드 및 cue / wav  (0) 2019.06.21
7. 탄 생성, 발사, 재장전  (0) 2019.06.20
6. 무기 생성 및 소켓 장착  (0) 2019.06.19
5.1 T Pose -> A Pose 변환 [MCO Mocap]  (0) 2019.06.18

 

Ammo 클래스를 이용하여 탄 제작.

staticmesh를 돌면서 충돌체크 하는 건 보단 

간단한 박스충돌체로 만들어서, 연산을 줄일려고 만듬

AKAmmo::AKAmmo()
{
	PrimaryActorTick.bCanEverTick = false;
	
	Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));

	static ConstructorHelpers::FObjectFinder<UStaticMesh> AmmoMesh(
		TEXT("StaticMesh'/Game/Ammo_and_bullets_Pack/Meshes/SM_9mmGaugeBullet_01.SM_9mmGaugeBullet_01'"));

	if (AmmoMesh.Succeeded())	{
		Mesh->SetStaticMesh(AmmoMesh.Object);
	}

	BoxComponent = CreateDefaultSubobject<UBoxComponent>(TEXT("BoxCollision"));

	RootComponent = Mesh;
	Mesh->SetRelativeRotation(FRotator(0.0f, -270.0f, 0.0f));

	BoxComponent->SetupAttachment(Mesh);
	BoxComponent->SetRelativeLocation(FVector(1.4f,0,0));
	BoxComponent->SetWorldScale3D(FVector(0.05f, 0.02f, 0.02f));
}

 





Character 에서

OnFire(), OnReload() 함수를 만들고 바인딩을 함
그리고 들고 있는 무기 포인터를 사용해서 
Wep->Fire()
Wep->Reload() 
을 사용하게 될 예정



 

◎ Fire 액션 시

-현재 탄 감소
-Fire몽타주 재생

- 노티파이를 추가하여 공격 텀을 줄 예정(?)
-> 애니메이션 몽타주에 노티파이를 설정하여 몽타주가 끝날시, bool값을 true 를 줌.
다른 방법으로는 공격 툴타임을 설정해서 사용할 수 있음

- 탄에 lifetime 또는 거리 제한을 두어서 삭제해야 할거 같음




※ 디버깅을 위해서 탄 속도를 낮추고, 스케일을 많이 키움








  
Reload 액션 시

-현재 탄 = (무기에 따른)최대탄
-Relad몽타주 재생



좀더 조정한 후 영상
탄 크기는 그대로, 속도를 올림.
이펙트 리소스 찾고, 사격 이펙트 추가 예정







'Unreal > Game 2 ' 카테고리의 다른 글

7.2 발사 사운드 및 cue / wav  (0) 2019.06.21
7.1 발사 이펙트 + 사운드 cue,wav  (0) 2019.06.21
6. 무기 생성 및 소켓 장착  (0) 2019.06.19
5.1 T Pose -> A Pose 변환 [MCO Mocap]  (0) 2019.06.18
5. 점프 애니메이션  (0) 2019.06.18

클래스 기능을 분담화 하기 위해서 여러 클래스를 만듬



C++ Weapon : 무기의 추상화 클래스, Class Ammo를 가지고 있다. 필요하면 기능 추가예정


class KGAME_API AKWeapon : public AActor
{
	GENERATED_BODY()
	
public:	
	AKWeapon();

	UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Weapon")
		USkeletalMeshComponent* Mesh;

	UPROPERTY(VisibleAnywhere, Category = "Weapon")
		class AKAmmo* Ammo;

protected:
	virtual void BeginPlay() override;

	int CurrentAmmo;
	int MaxAmmo;
	int MinAmmo;
	float ammoSpeed;
};



C++ Ammo : 탄 메시 및 충돌체, 발사체 틱,

UCLASS()
class KGAME_API AKAmmo : public AActor
{
	GENERATED_BODY()
	
public:	
	AKAmmo();

protected:
	virtual void Tick(float DeltaTime) override;

	UPROPERTY(VisibleAnywhere, Category = "Ammo")
		UStaticMeshComponent* Mesh;

	UPROPERTY(VisibleAnywhere, Category = "Collsion")
		UBoxComponent* BoxComponent;

	UPROPERTY(VisibleAnywhere, Category = "Effect")
		UParticleSystemComponent* Effect;
};





C++ Pistol : 권총 클래스, 탄은 12발

//h
UCLASS()
class KGAME_API AKPistol : public AKWeapon
{
	GENERATED_BODY()
	
public:
	AKPistol();

protected:
	virtual void BeginPlay() override;
};

//cpp
AKPistol::AKPistol()
{
	static ConstructorHelpers::FObjectFinder<USkeletalMesh> gunmesh(TEXT("SkeletalMesh'/Game/Pistol_Starter/SkeletalMesh/SK_1911_01.SK_1911_01'"));

	if (gunmesh.Succeeded())
	{
		Mesh->SetSkeletalMesh(gunmesh.Object);
	}
}

void AKPistol::BeginPlay()
{
	Super::BeginPlay();

	MaxAmmo = 12;
	MinAmmo = 0;
	CurrentAmmo = MaxAmmo;
}







그리고 캐릭터는 KWeapon 포인터를 하나 들고 있게함
장비가 여러개 될 경우에는 교체예정
 


 

 

 

소켓 위치조절 및 설정

 
별도로 코드로 할 경우에는 재귀적으로 노드를 순위하면서 이름을 찾아야함

 

 

void AKCharacter::SetWeapon(class AKWeapon* NewWeapon)
{
	FName WeaponSocket(TEXT("hand_rSocket"));
	if (nullptr != NewWeapon)
	{
		NewWeapon->AttachToComponent(GetMesh(), FAttachmentTransformRules::SnapToTargetNotIncludingScale, WeaponSocket);
		NewWeapon->SetOwner(this);
		CurrentWeapon = NewWeapon;
	}
}

구현한 소켓이름을 찾아서 붙이는 함수



 

결과

 

'Unreal > Game 2 ' 카테고리의 다른 글

7.1 발사 이펙트 + 사운드 cue,wav  (0) 2019.06.21
7. 탄 생성, 발사, 재장전  (0) 2019.06.20
5.1 T Pose -> A Pose 변환 [MCO Mocap]  (0) 2019.06.18
5. 점프 애니메이션  (0) 2019.06.18
4.1 기존 바인딩 함수 이동  (0) 2019.06.18

+ Recent posts