Unreal Engine C++: Character Movement Bileşenini Özelleştirme

Unreal Engine'de karakter hareketi varsayılan olarak Character Movement Component tarafından yönetilir. Ancak oyunun ihtiyaçlarına göre bunu genişletmen gerekebilir: çift zıplama, hava hareketi, kayan hareket ya da özel yerçekimi.

Bu işi yapmanın en temiz yolu, Component'i miras almak ve gerekli fonksiyonları geçersiz kılmaktır (override). Böylece Motor'un temel sistemlerine bağlı kalırken kendi mantığını eklersin.

Aşağıdaki örnek, çift zıplama ve hava hızını artırma özelliklerini ekliyor:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1// CustomCharacterMovement.h
2#pragma once
3
4#include "GameFramework/CharacterMovementComponent.h"
5#include "CustomCharacterMovement.generated.h"
6
7UCLASS()
8class YOURPROJECT_API UCustomCharacterMovement: public UCharacterMovementComponent
9{
10GENERATED_BODY()
11
12public:
13UCustomCharacterMovement();
14
15virtual void BeginPlay() override;
16virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
17virtual bool DoJump(bool bReplayingMoves) override;
18
19UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
20float AirSpeedMultiplier = 1.5f;
21
22UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")
23bool bAllowDoubleJump = true;
24
25private:
26bool bCanDoubleJump = false;
27};
1// CustomCharacterMovement.cpp
2#include "CustomCharacterMovement.h"
3#include "GameFramework/Character.h"
4
5UCustomCharacterMovement::UCustomCharacterMovement()
6{
7PrimaryComponentTick.bCanEverTick = true;
8}
9
10void UCustomCharacterMovement::BeginPlay()
11{
12Super::BeginPlay();
13bCanDoubleJump = false;
14}
15
16void UCustomCharacterMovement::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
17{
18Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
19
20// Havada iken hızı artır
21if (IsInAir())
22{
23Velocity.X *= AirSpeedMultiplier * DeltaTime;
24Velocity.Y *= AirSpeedMultiplier * DeltaTime;
25}
26
27// Yere değince çift zıplama sıfırla
28if (IsMovingOnGround())
29{
30bCanDoubleJump = true;
31}
32}
33
34bool UCustomCharacterMovement::DoJump(bool bReplayingMoves)
35{
36// Normal zıplama başarılı mı kontrol et
37if (Super::DoJump(bReplayingMoves))
38{
39bCanDoubleJump = true;
40return true;
41}
42
43// Havadaysa ve çift zıplama izinli, ikinci zıplamayı yap
44if (bAllowDoubleJump && bCanDoubleJump && IsInAir())
45{
46Velocity.Z = JumpZVelocity;
47bCanDoubleJump = false;
48return true;
49}
50
51return false;
52}

Karakterinin Blueprint'inde Movement Component'ini bu özel sınıfla değiştir. Editörde AirSpeedMultiplier ve bAllowDoubleJump ayarlarını tuşla.

Sık yapılan hata: Velocity'yi doğrudan değiştirirken Gravity'yi göz ardı etmek. Motor zaten yerçekimini uyguluyorsa, Z eksenini elle değiştirmek garip atlamalar yaratır. DoJump içinde JumpZVelocity kullan; TickComponent'te sadece yatay eksenleri dokunun.

Bu yaklaşım, motor tarafından yönetilen fizik simülasyonuyla uyumlu kalırken oyun mekaniklerini tam kontrol altında tutmanı sağlar.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz