From 594689b82b277bd8ea967102148af2eba9e07353 Mon Sep 17 00:00:00 2001 From: Foxim Date: Wed, 12 Feb 2025 19:10:23 +0100 Subject: [PATCH] feat: add core gameplay classes and blueprints - Add ExoGameMode class - Add ExoCharacterBase class - Add ExoPlayerController with basic movement and camera controls - Add blueprints for ExoPlayerController and ExoGameMode --- .../DefaultEditorPerProjectUserSettings.ini | 33 +++++++++ Config/DefaultEngine.ini | 11 +++ Content/Blueprints/Game/BP_ExoGameMode.uasset | Bin 0 -> 19705 bytes .../Player/BP_ExoPlayerController.uasset | Bin 0 -> 18766 bytes Content/{Blueprints => }/Levels/TestMap.umap | Bin 38684 -> 38651 bytes Exo.uproject | 5 +- Source/Exo/Exo.Build.cs | 2 +- .../Private/Characters/ExoCharacterBase.cpp | 34 +++++++++ Source/Exo/Private/Game/ExoGameMode.cpp | 5 ++ .../Private/Player/ExoPlayerController.cpp | 66 ++++++++++++++++++ .../Exo/Public/Characters/ExoCharacterBase.h | 29 ++++++++ Source/Exo/Public/Game/ExoGameMode.h | 17 +++++ .../Exo/Public/Player/ExoPlayerController.h | 46 ++++++++++++ 13 files changed, 246 insertions(+), 2 deletions(-) create mode 100644 Config/DefaultEditorPerProjectUserSettings.ini create mode 100644 Content/Blueprints/Game/BP_ExoGameMode.uasset create mode 100644 Content/Blueprints/Player/BP_ExoPlayerController.uasset rename Content/{Blueprints => }/Levels/TestMap.umap (81%) create mode 100644 Source/Exo/Private/Characters/ExoCharacterBase.cpp create mode 100644 Source/Exo/Private/Game/ExoGameMode.cpp create mode 100644 Source/Exo/Private/Player/ExoPlayerController.cpp create mode 100644 Source/Exo/Public/Characters/ExoCharacterBase.h create mode 100644 Source/Exo/Public/Game/ExoGameMode.h create mode 100644 Source/Exo/Public/Player/ExoPlayerController.h diff --git a/Config/DefaultEditorPerProjectUserSettings.ini b/Config/DefaultEditorPerProjectUserSettings.ini new file mode 100644 index 0000000..93b497c --- /dev/null +++ b/Config/DefaultEditorPerProjectUserSettings.ini @@ -0,0 +1,33 @@ +[/Script/UnrealEd.EditorStyleSettings] +bEnableUserEditorLayoutManagement=True +ColorVisionDeficiencyPreviewType=NormalVision +ColorVisionDeficiencySeverity=3 +bColorVisionDeficiencyCorrection=False +bColorVisionDeficiencyCorrectionPreviewWithDeficiency=False +SelectionColor=(R=0.828000,G=0.364000,B=0.003000,A=1.000000) +AdditionalSelectionColors[0]=(R=0.019382,G=0.496933,B=1.000000,A=1.000000) +AdditionalSelectionColors[1]=(R=0.356400,G=0.040915,B=0.520996,A=1.000000) +AdditionalSelectionColors[2]=(R=1.000000,G=0.168269,B=0.332452,A=1.000000) +AdditionalSelectionColors[3]=(R=1.000000,G=0.051269,B=0.051269,A=1.000000) +AdditionalSelectionColors[4]=(R=1.000000,G=0.715693,B=0.010330,A=1.000000) +AdditionalSelectionColors[5]=(R=0.258183,G=0.539479,B=0.068478,A=1.000000) +bEnableEditorWindowBackgroundColor=False +EditorWindowBackgroundColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000) +bUseSmallToolBarIcons=False +bUseGrid=True +RegularColor=(R=0.035000,G=0.035000,B=0.035000,A=1.000000) +RuleColor=(R=0.008000,G=0.008000,B=0.008000,A=1.000000) +CenterColor=(R=0.000000,G=0.000000,B=0.000000,A=1.000000) +GridSnapSize=16 +GraphBackgroundBrush=(bIsDynamicallyLoaded=False,DrawAs=Image,Tiling=NoTile,Mirroring=NoMirror,ImageType=NoImage,ImageSize=(X=32.000000,Y=32.000000),Margin=(Left=0.000000,Top=0.000000,Right=0.000000,Bottom=0.000000),TintColor=(SpecifiedColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),ColorUseRule=UseColor_Specified),OutlineSettings=(CornerRadii=(X=0.000000,Y=0.000000,Z=0.000000,W=1.000000),Color=(SpecifiedColor=(R=0.000000,G=0.000000,B=0.000000,A=0.000000),ColorUseRule=UseColor_Specified),Width=0.000000,RoundingType=HalfHeightRadius,bUseBrushTransparency=False),ResourceObject=None,ResourceName="",UVRegion=(Min=(X=0.000000,Y=0.000000),Max=(X=0.000000,Y=0.000000),bIsValid=False)) +bShowFriendlyNames=True +bShowNativeComponentNames=True +bExpandConfigurationMenus=False +bShowProjectMenus=True +bShowLaunchMenus=True +bShowAllAdvancedDetails=False +bShowHiddenPropertiesWhilePlaying=False +AssetEditorOpenLocation=MainWindow +bEnableColorizedEditorTabs=True +CurrentAppliedTheme=134380265FBB4A9CA00A1DC9770217B8 + diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini index 8ddeec0..f08eb52 100644 --- a/Config/DefaultEngine.ini +++ b/Config/DefaultEngine.ini @@ -50,5 +50,16 @@ ManualIPAddress= [/Script/EngineSettings.GameMapsSettings] EditorStartupMap=/Game/Blueprints/Levels/TestMap.TestMap +LocalMapOptions= +TransitionMap=None +bUseSplitscreen=True +TwoPlayerSplitscreenLayout=Horizontal +ThreePlayerSplitscreenLayout=FavorTop +FourPlayerSplitscreenLayout=Grid +bOffsetPlayerGamepadIds=False +GameInstanceClass=/Script/Engine.GameInstance GameDefaultMap=/Game/Blueprints/Levels/TestMap.TestMap +ServerDefaultMap=/Engine/Maps/Entry.Entry +GlobalDefaultGameMode=/Game/Blueprints/Game/BP_ExoGameMode.BP_ExoGameMode_C +GlobalDefaultServerGameMode=None diff --git a/Content/Blueprints/Game/BP_ExoGameMode.uasset b/Content/Blueprints/Game/BP_ExoGameMode.uasset new file mode 100644 index 0000000000000000000000000000000000000000..f881e0d95cabeecd3cfbe34fc2bbd78c0cb67646 GIT binary patch literal 19705 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 M=XcLm0SfT{2Q>nz5dZ)H literal 0 HcmV?d00001 diff --git a/Content/Blueprints/Player/BP_ExoPlayerController.uasset b/Content/Blueprints/Player/BP_ExoPlayerController.uasset new file mode 100644 index 0000000000000000000000000000000000000000..8ff1a750753eaae790a99bbe773e17d630f4fcac GIT binary patch literal 18766 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 literal 0 HcmV?d00001 diff --git a/Content/Blueprints/Levels/TestMap.umap b/Content/Levels/TestMap.umap similarity index 81% rename from Content/Blueprints/Levels/TestMap.umap rename to Content/Levels/TestMap.umap index 0b8a1fc864c399348b63d363c60b1eae75a0026d..a57ab3567cde4c82713912b4f7836d1256460327 100644 GIT binary patch delta 815 zcmbQUj_LPWrVS>Hym77!45ADS4EpYgxv7(V7$rF4m>3v$|(7VaK>pVYF{oMQcu)Z!A~!~zDU z#^TGH_o%GmXN;SiZW7OUVDfR3c&4|mlQm4^7^Nn+o5nM`Pks(0OD4OU#WOCPyc|fL zo6K$=&v%TE_)8heTv}f*;+7th=j}b0l5rOaPB)G*B}ng^|P~Ja*PMN zWRaZ<)9ZM+44*yF&IGVblD!L4St4BK98g9j3C`7XuwW8N1}kiGaA68egZRtAg)wsS z#Z1Y`56qP&CpoGx`R72aadcr?kptGv-^i%i}SX13WeLPu0suXvYE+uunC z*zF4${%$jJVB7U=a$w#*Dv6tkPx(5#^Q98+fy>@KslQau+1sx^Gv(U-N1GiA?x+C( DAUzwG delta 613 zcmZ|LUr19?90&088zdrS8){r4V#;U9Kv%AfDSPxne zB?RvBr9Th$U=Kq7#LI=im!P1Bdb=+@^-_ccnX$J(!hWMbh&r6}IluFl-#P2geRGSx zr8p^5140Ca5UMe9v7qYXmkU;DbYilM3@J^cJ|Vb@N+-4rhjSc>N1Z~1x!2=DWdDpm z>A$x%^Tcj$UEB_uwd##hLSLMTU3;jWy>85W4nJLcd}MxBJv?pf2;)7SZqMO}LQl5S6wJ7!k8s## z6cYyW357I{Bwc{V-bFMi={0QjJ8J9(%x*~$IP5zFdL(tB$i9Tf-a>Srq$SwwH`Lgl zF!xLP0f(JHK$HH~;ms#-<^r!Q1rM|yIss3Uw2o-6q&KkH2AHX%NT>W1fRoa2Cl#W0 zjwG1~^hr8{BD)pQ{uWfVMy&Q_>*xC=-G|K%pvER(rX`i&q@}Mi2JgU5L^4^jP|Qer z3y=MPsLr~!K2KXZ_^;2SJA1D6U*G92WP>gKo4XpX#twxBm#3et%;s0VA~U9-dNSq) f^N}|68VVXNE&r#F(GetLocalPlayer()); + + if (Subsystem) + { + Subsystem->AddMappingContext(InputContext, 0); + } + + PlayerCharacter = GetPawn(); +} + +void AExoPlayerController::PlayerTick(float DeltaTime) +{ + Super::PlayerTick(DeltaTime); +} + +void AExoPlayerController::SetupInputComponent() +{ + Super::SetupInputComponent(); + + UEnhancedInputComponent* EnhancedInputComponent = CastChecked(InputComponent); + + EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AExoPlayerController::Move); + EnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &AExoPlayerController::Look); +} + +void AExoPlayerController::Move(const FInputActionValue& InputActionValue) +{ + const FVector2D InputAxisVector = InputActionValue.Get(); + const FRotator Rotation = GetControlRotation(); + const FRotator YawRotation(0.f, Rotation.Yaw, 0.f); + + const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X); + const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y); + + if (PlayerCharacter) + { + PlayerCharacter->AddMovementInput(ForwardDirection, InputAxisVector.X); + PlayerCharacter->AddMovementInput(RightDirection, InputAxisVector.Y); + } +} + +void AExoPlayerController::Look(const FInputActionValue& InputActionValue) +{ + FVector2D InputAxisVector = InputActionValue.Get(); + + AddYawInput(InputAxisVector.X); + AddPitchInput(InputAxisVector.Y); +} diff --git a/Source/Exo/Public/Characters/ExoCharacterBase.h b/Source/Exo/Public/Characters/ExoCharacterBase.h new file mode 100644 index 0000000..4a0a2ea --- /dev/null +++ b/Source/Exo/Public/Characters/ExoCharacterBase.h @@ -0,0 +1,29 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Character.h" +#include "ExoCharacterBase.generated.h" + +UCLASS() +class EXO_API AExoCharacterBase : public ACharacter +{ + GENERATED_BODY() + +public: + // Sets default values for this character's properties + AExoCharacterBase(); + +protected: + // Called when the game starts or when spawned + virtual void BeginPlay() override; + +public: + // Called every frame + virtual void Tick(float DeltaTime) override; + + // Called to bind functionality to input + virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; + +}; diff --git a/Source/Exo/Public/Game/ExoGameMode.h b/Source/Exo/Public/Game/ExoGameMode.h new file mode 100644 index 0000000..d61572b --- /dev/null +++ b/Source/Exo/Public/Game/ExoGameMode.h @@ -0,0 +1,17 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/GameModeBase.h" +#include "ExoGameMode.generated.h" + +/** + * + */ +UCLASS() +class EXO_API AExoGameMode : public AGameModeBase +{ + GENERATED_BODY() + +}; diff --git a/Source/Exo/Public/Player/ExoPlayerController.h b/Source/Exo/Public/Player/ExoPlayerController.h new file mode 100644 index 0000000..71e8d84 --- /dev/null +++ b/Source/Exo/Public/Player/ExoPlayerController.h @@ -0,0 +1,46 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/PlayerController.h" +#include "ExoPlayerController.generated.h" + +class UInputMappingContext; +class UInputAction; +struct FInputActionValue; + +UCLASS() +class EXO_API AExoPlayerController : public APlayerController +{ + GENERATED_BODY() + +public: + AExoPlayerController(); + + virtual void BeginPlay() override; + + virtual void PlayerTick(float DeltaTime) override; + +protected: + virtual void SetupInputComponent() override; + + UFUNCTION(BlueprintCallable, Category = "Input") + void Move(const FInputActionValue& InputActionValue); + + UFUNCTION(BlueprintCallable, Category = "Input") + void Look(const FInputActionValue& InputActionValue); + +protected: + UPROPERTY(EditAnywhere, Category = "Input") + TObjectPtr InputContext; + + UPROPERTY(EditAnywhere, Category= "Input") + TObjectPtr MoveAction; + + UPROPERTY(EditAnywhere, Category = "Input") + TObjectPtr LookAction; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Character") + TObjectPtr PlayerCharacter; +};