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:
1// CustomCharacterMovement.h2#pragma once34#include "GameFramework/CharacterMovementComponent.h"5#include "CustomCharacterMovement.generated.h"67UCLASS()8class YOURPROJECT_API UCustomCharacterMovement: public UCharacterMovementComponent9{10GENERATED_BODY()1112public:13UCustomCharacterMovement();1415virtual void BeginPlay() override;16virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;17virtual bool DoJump(bool bReplayingMoves) override;1819UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")20float AirSpeedMultiplier = 1.5f;2122UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Movement")23bool bAllowDoubleJump = true;2425private:26bool bCanDoubleJump = false;27};1// CustomCharacterMovement.cpp2#include "CustomCharacterMovement.h"3#include "GameFramework/Character.h"45UCustomCharacterMovement::UCustomCharacterMovement()6{7PrimaryComponentTick.bCanEverTick = true;8}910void UCustomCharacterMovement::BeginPlay()11{12Super::BeginPlay();13bCanDoubleJump = false;14}1516void UCustomCharacterMovement::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)17{18Super::TickComponent(DeltaTime, TickType, ThisTickFunction);1920// Havada iken hızı artır21if (IsInAir())22{23Velocity.X *= AirSpeedMultiplier * DeltaTime;24Velocity.Y *= AirSpeedMultiplier * DeltaTime;25}2627// Yere değince çift zıplama sıfırla28if (IsMovingOnGround())29{30bCanDoubleJump = true;31}32}3334bool UCustomCharacterMovement::DoJump(bool bReplayingMoves)35{36// Normal zıplama başarılı mı kontrol et37if (Super::DoJump(bReplayingMoves))38{39bCanDoubleJump = true;40return true;41}4243// Havadaysa ve çift zıplama izinli, ikinci zıplamayı yap44if (bAllowDoubleJump && bCanDoubleJump && IsInAir())45{46Velocity.Z = JumpZVelocity;47bCanDoubleJump = false;48return true;49}5051return 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.
0 yorum