https://docs.unrealengine.com/latest/KOR/Programming/Tutorials/PlayerInput/index.html
기본 튜토리얼 코드
*언리얼에서 Actor은 가장 기본적인 Object 이다. 유니티에서의 생성하는 빈 GameObject와 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "GameFramework/Pawn.h" #include "MyPawn.generated.h" UCLASS() class HOWTO_PLAYERMOVE_API AMyPawn : public APawn { GENERATED_BODY() public: // Sets default values for this pawn's properties AMyPawn(); // Called when the game starts or when spawned virtual void BeginPlay() override; // Called every frame virtual void Tick( float DeltaSeconds ) override; // Called to bind functionality to input virtual void SetupPlayerInputComponent(class UInputComponent* InputComponent) override; private://변수 UPROPERTY(EditAnyWhere, Category = "Component") USceneComponent* OurVisibleComponent; UPROPERTY(VisibleAnywhere, Category = "Move") FVector CurrentVelocity; UPROPERTY(EditAnyWhere, Category = "Move") float MoveSpeed; UPROPERTY(VisibleAnywhere, Category = "Scale") bool bGrowing; private://함수 void Move_XAxis(float AxisValue); void Move_YAxis(float AxisValue); void StartGrowing(); void StopGrowing(); }; | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | // Fill out your copyright notice in the Description page of Project Settings. #include "HowTo_PlayerMove.h" #include "MyPawn.h" // Sets default values AMyPawn::AMyPawn() { // Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; // 이 폰을 가장 빠른 번호의 플레이어가 조정하도록 설정 AutoPossessPlayer = EAutoReceiveInput::Player0; // 무엇인가 추가할 루트 더미 컴포넌트 만들기 RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent")); // 카메라와 보이는 오브젝트(몸통?) 만들기 UCameraComponent* OurCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("OurCamera")); OurVisibleComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("OurVisibleComponent")); // 루트 컴퍼넌트에 카메라와 보이는 오브젝트를 붙인다. 그리고 카메라를 이격 및 회전 시킨다. OurCamera->AttachTo(RootComponent); OurCamera->SetRelativeLocation(FVector(-250.0f, 0.0f, 250.0f)); OurCamera->SetRelativeRotation(FRotator(-45.0f, 0.0f, 0.0f)); OurVisibleComponent->AttachTo(RootComponent); MoveSpeed = 100.0f; } // Called when the game starts or when spawned void AMyPawn::BeginPlay() { Super::BeginPlay(); } // Called every frame void AMyPawn::Tick( float DeltaTime ) { Super::Tick( DeltaTime ); // "Grow" 키에 의한 엑션에 키우고 줄이는 것을 처리 float CurrentScale = OurVisibleComponent->GetComponentScale().X; if (bGrowing) { //1초 마다 두배로 키운다. CurrentScale += DeltaTime; } else { // 1초마다 키운 속도의 절만으로 줄인다 CurrentScale -= (DeltaTime * 0.5f); } // 크기가 1보다 아래로 줄거나 2배이상 되지 않게 한다. CurrentScale = FMath::Clamp(CurrentScale, 1.0f, 2.0f); OurVisibleComponent->SetWorldScale3D(FVector(CurrentScale)); // "MoveX" 와 "MoveY"에 의한 축이동 if (!CurrentVelocity.IsZero()) { FVector NewLocation = GetActorLocation() + (CurrentVelocity * DeltaTime); SetActorLocation(NewLocation); } } // Called to bind functionality to input void AMyPawn::SetupPlayerInputComponent(class UInputComponent* InputComponent) { Super::SetupPlayerInputComponent(InputComponent); // "Grow" 키에 대한 반응 InputComponent->BindAction("Grow", IE_Pressed, this, &AMyPawn::StartGrowing); //눌러져 있을떄 InputComponent->BindAction("Grow", IE_Released, this, &AMyPawn::StopGrowing); //눌러지지 않았을떄 // "MoveX" 와 "MoveY"에 대한 반응 InputComponent->BindAxis("MoveX", this, &AMyPawn::Move_XAxis); InputComponent->BindAxis("MoveY", this, &AMyPawn::Move_YAxis); } // MoveX의 입력을 처리 void AMyPawn::Move_XAxis(float AxisValue) { // 초당 100 만큼 앞 뒤로 이동한다. //Clamp 들어가는 AxisValue 값의 범위를 -1.0f ~ 1.0f로 고정한다. CurrentVelocity.X = FMath::Clamp(AxisValue, -1.0f, 1.0f) *MoveSpeed; } // MoveY의 입력을 처리 void AMyPawn::Move_YAxis(float AxisValue) { // 초당 100 만큼 좌 우로 이동한다. CurrentVelocity.Y = FMath::Clamp(AxisValue, -1.0f, 1.0f) * MoveSpeed; } void AMyPawn::StartGrowing() { bGrowing = true; } void AMyPawn::StopGrowing() { bGrowing = false; } | cs |
추가 튜토리얼 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | // MoveX의 입력을 처리 void AMyPawn::Move_XAxis(float AxisValue) { // 초당 100 만큼 앞 뒤로 이동한다. //Clamp 들어가는 AxisValue 값의 범위를 -1.0f ~ 1.0f로 고정한다. //CurrentVelocity.X = FMath::Clamp(AxisValue, -1.0f, 1.0f) *MoveSpeed; if (AxisValue == 0) { //키가 눌리지 않았다면 속도는 0이 될때 까지 서서히 줄어 든다. SmothVelocityReduce(&CurrentVelocity.X); } else { //MaxSpeed 범위 안에서 초당 2씩 가속도가 붙는다. CurrentVelocity.X += FMath::Clamp(AxisValue, -1.0f, 1.0f) *MoveSpeed; CurrentVelocity.X = FMath::Clamp(CurrentVelocity.X, -MaxMoveSpeed, MaxMoveSpeed); } } // MoveY의 입력을 처리 void AMyPawn::Move_YAxis(float AxisValue) { // 초당 100 만큼 좌 우로 이동한다. //CurrentVelocity.Y = FMath::Clamp(AxisValue, -1.0f, 1.0f) * MoveSpeed; if (AxisValue == 0) { //키가 눌리지 않았다면 속도는 0이 될때 까지 서서히 줄어 든다. SmothVelocityReduce(&CurrentVelocity.Y); } else { //MaxSpeed 범위 안에서 초당 2씩 가속도가 붙는다. CurrentVelocity.Y += FMath::Clamp(AxisValue, -1.0f, 1.0f) * MoveSpeed; CurrentVelocity.Y = FMath::Clamp(CurrentVelocity.Y, -MaxMoveSpeed, MaxMoveSpeed); } } //부드럽게 속도가 줄도록 함수 추가. void AMyPawn::SmothVelocityReduce(float* Velocity) { if ((FMath::Abs((*Velocity)) / 0.1f) < 1) { (*Velocity) = 0.0f; } else { if ((*Velocity) > 0) { (*Velocity) -= MoveSpeed; } else { (*Velocity) += MoveSpeed; } } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | // Called every frame void AMyPawn::Tick( float DeltaTime ) { Super::Tick( DeltaTime ); // "Grow" 키에 의한 엑션에 키우고 줄이는 것을 처리 float CurrentScale = OurVisibleComponent->GetComponentScale().X; if (bGrowing) { if (bIsAxisZero) { //1초 마다 두배로 키운다. CurrentScale += DeltaTime; } else { // 즉시 MaxScaleSize 만큼 커진다. CurrentScale = MaxScaleSize; } } else { // 1초마다 키운 속도의 절만으로 줄인다 CurrentScale -= (DeltaTime * 0.5f); } // 크기가 1보다 아래로 줄거나 MaxScaleSize 이상 되지 않게 한다. CurrentScale = FMath::Clamp(CurrentScale, 1.0f, MaxScaleSize); OurVisibleComponent->SetWorldScale3D(FVector(CurrentScale)); // "MoveX" 와 "MoveY"에 의한 축이동 if (!CurrentVelocity.IsZero()) { FVector NewLocation = GetActorLocation() + (CurrentVelocity * DeltaTime); SetActorLocation(NewLocation); } } // Called to bind functionality to input void AMyPawn::SetupPlayerInputComponent(class UInputComponent* InputComponent) { Super::SetupPlayerInputComponent(InputComponent); // "MoveX" 와 "MoveY"에 대한 반응 InputComponent->BindAxis("MoveX", this, &AMyPawn::Move_XAxis); InputComponent->BindAxis("MoveY", this, &AMyPawn::Move_YAxis); // "Grow" 키에 대한 반응 InputComponent->BindAction("Grow", IE_Pressed, this, &AMyPawn::StartGrowing); //눌러져 있을떄 InputComponent->BindAction("Grow", IE_Released, this, &AMyPawn::StopGrowing); //눌러지지 않았을떄 } // MoveX의 입력을 처리 void AMyPawn::Move_XAxis(float AxisValue) { // 초당 100 만큼 앞 뒤로 이동한다. //Clamp 들어가는 AxisValue 값의 범위를 -1.0f ~ 1.0f로 고정한다. //CurrentVelocity.X = FMath::Clamp(AxisValue, -1.0f, 1.0f) *MoveSpeed; if (AxisValue == 0) { bIsAxisZero = true; //키가 눌리지 않았다면 속도는 0이 될때 까지 서서히 줄어 든다. SmothVelocityReduce(&CurrentVelocity.X); } else { bIsAxisZero = false; //MaxSpeed 범위 안에서 초당 2씩 가속도가 붙는다. CurrentVelocity.X += FMath::Clamp(AxisValue, -1.0f, 1.0f) *MoveSpeed; CurrentVelocity.X = FMath::Clamp(CurrentVelocity.X, -MaxMoveSpeed, MaxMoveSpeed); } } // MoveY의 입력을 처리 void AMyPawn::Move_YAxis(float AxisValue) { // 초당 100 만큼 좌 우로 이동한다. //CurrentVelocity.Y = FMath::Clamp(AxisValue, -1.0f, 1.0f) * MoveSpeed; if (AxisValue == 0) { bIsAxisZero = true; //키가 눌리지 않았다면 속도는 0이 될때 까지 서서히 줄어 든다. SmothVelocityReduce(&CurrentVelocity.Y); } else { bIsAxisZero = false; //MaxSpeed 범위 안에서 초당 2씩 가속도가 붙는다. CurrentVelocity.Y += FMath::Clamp(AxisValue, -1.0f, 1.0f) * MoveSpeed; CurrentVelocity.Y = FMath::Clamp(CurrentVelocity.Y, -MaxMoveSpeed, MaxMoveSpeed); } } | cs |
'프로그래밍 > Unreal Engine4' 카테고리의 다른 글
언리얼 단축키 (0) | 2016.04.04 |
---|---|
언리얼 C++ 튜토리얼 002.CameraActor (0) | 2016.04.04 |
언리얼 C++ 함수와 사용예제 (0) | 2016.04.03 |
언리얼 디테일 창에 enum 상태 띄우는 방법 (0) | 2016.04.02 |
***언리얼 사용시 코딩 규칙!!!*** (0) | 2016.03.28 |