ãã使ãããå¦çãUnrealC++ã§æ¸ãã¦ã¿ããã®å·»ã
ããã«ã¡ããã
åç°ã§ããåãã¾ãã¦ã®æ¹ãå¤ãããªã®ã§èªå·±ç´¹ä»ãããã¦ããã ãã¾ãã
ãä¸å¿é«æ ¡çãããã¦ããã£ã¦ã¾ããUE4ã«è§¦ãå§ããã®ã¯å»å¹´ã®ä»é ã ã£ãè¨æ¶ã...
ãTwitterãã£ã¦ã¾ããæ´æ°å¤ãã§ããã¾ããªããã£ã¦æ¹ããã©ãã¼ãã¼('Ï')
ä»åã¯
qiita.comã«åå ããã¦ãããã¾ããã®ã§ã
èªåãªãã«æ¸ããããã®ãæ¸ãããã¨æãã¾ã('Ï')
ãªããæ¬è¨äºã§ã¯UE4 [4.14.0],Visual Studio Community 2015ã使ç¨ãã¦ãã¾ãã
Visual Studio Community 2015ã®ãã¦ã³ãã¼ãã¯ãã¡ãããã
www.visualstudio.com
ä»åã®ãã¼ãã¯ããã°ã®é¡ã®éãã§ãã
ãã¡ããã¡ãè¨ã£ã¦ãã¦ã仿¹ããªãã®ã§æ¬é¡ã«å
¥ãã¾ãããã
BeginOverlap,EndOverlap
ãã¡ãã¯BPã§ãããªãã¿Collisionã®è¡çªå¤å®ã®ã¤ãã³ãã§ãã
BPã ã¨ãããªæãã
BP :
ããã使ãããã¦ã²ã¼ã ã¯ä½ããªãã£ã¦ç¨éè¦ãªãã¼ãã§ããã¾ãã¯ããã¤ãå®è£
ãã¦ã¿ã¾ããããã
ã¾ããèªåã¯ä»ãããªç¶æ³ã«ããï¼ã£ã¦ã·ãã¥ã¨ã¼ã·ã§ã³ãä½ãã¾ãããã
ä»åã¯ããã¢ã®ééã¹ã¯ãªãããBPãããªãUnrealC++ã§ä½ãããã¦å¤ãæã¾ã§ããå¯ããªãï¼ã£ã¦ã·ãã¥ã¨ã¼ã·ã§ã³ã«ãã¾ãããã
1 : DoorClassãä½ãã
ã¯ãã
ActorClassãç¶æ¿ããDoorClassãä½ãã¾ãããã
ã³ã¼ããæ¸ãã¾ãã
ã¾ãã¯åºæ¬ã¨ãªããStaticMeshãã¢ãµã¤ã³ããå¦çããã
Door.h
UPROPERTY(EditAnywhere,BlueprintReadOnly,Category = "Door", meta = (AllowPrivateAccess = "true")) class UStaticMeshComponent* DoorMesh; UPROPERTY(EditAnywhere,BlueprintReadOnly,Category = "Door", meta = (AllowPrivateAccess = "true")) class UStaticMeshComponent* DoorFrameMesh; UPROPERTY(VisibleAnywhere,BlueprintReadOnly,Category = "Door", meta = (AllowPrivateAccess = "true")) class UBoxComponent* DoorTrigger;
ã²ã¨ã¤ãã¤è§£èª¬ãã¦ããã¾ãã
UPROPERTY([specifier, specifier, ...], [meta=(key=value, key=value, ...)]) Type VariableName;
UPROPERTY :
UPROPERTYãç°¡åã«èª¬æããã¨ãã¨ã³ã¸ã³å
ã«åå¨ããUPROPERTYãã¯ãã使ç¨ãã
夿°ã®å®£è¨ã§ããããã¤ã使ããã¨ã«ãã£ã¦BPClassã¨ã®é£æºãåãã¾ãã
specifier :
specifier(æå®å)ã¯UPROPERTYãã¯ãã宣è¨ããéã«è¨è¿°ãããã¨ã«ãã£ã¦ã宣è¨åã«æå®åã追å ããã¾ãã¾ãªæ¯ãèããæããããã¨ãã§ãããã®ã§ãã
å
¬å¼ããã¥ã¡ã³ãã«ããã¼ã¼ã¼ããè¼ã£ã¦ãã¾ãã
docs.unrealengine.com
meta :
metaãä¸è¨ã§èª¬æããã¨ããã©ã¡ã¼ã¿ã®ç·¨éãå¶å¾¡ã§ããããã«ããããã®ãã®ãã§ãã
Dv7Pavilionããã詳ãã説æãã¦ããã¦ã¾ãã®ã§ã詳ããã¯ãªã³ã¯ãã¯ãªãã¯
qiita.com
2 : ã½ã¼ã¹ãã¡ã¤ã«ã®ã³ã³ã¹ãã©ã¯ã¿ã«Componentã追å ããé層ãè¨å®
Door.cpp
ADoor::ADoor() { DoorMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Door")); DoorFrameMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("DoorFrame")); DoorTrigger = CreateDefaultSubobject<UBoxComponent>(TEXT("DoorTrigger")); // ã¢ã¿ãã RootComponent = DoorFrameMesh; DoorMesh->SetupAttachment(DoorFrameMesh); DoorTrigger->SetupAttachment(DoorMesh); }
Componentã追å ã¯CreateDefaultSubobject,Attachã«é¢ãã¦ã¯SetupAttachmentã§ãã
詳ãã説æããã¨ãä»åã®ä¸»é¡ã¨ã¯ããé¢ãã¦ãã¾ãã®ã§åèªãããããé¡ããã¾ã...
3 : Begin,EndOverlap颿°ã®å®ç¾©
Door.h
// BeginOverlap UFUNCTION(BlueprintCallable, Category = "Door", meta = (AllowPrivateAccess = "true")) void OnDoorTriggerBeginOverlap(class UPrimitiveComponent* HitComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult); // EndOverlap UFUNCTION(BlueprintCallable, Category = "Door", meta = (AllowPrivateAccess = "true")) void OnDoorTriggerEndOverlap(class UPrimitiveComponent* HitComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
ãªãã颿°ã®å¼æ°ã§ããããããã®ãã¼ã¸ã§ã³ã¢ããã§å¢ãããæ¸ã£ããããã¨æãã®ã§ãããã¾ã§åä½ãä¿è¨¼ãããã¼ã¸ã§ã³ã¯4.14.0
ã¨ãããã¨ã«ããã¦ãã ããã
UFUNCTIONãã¯ãã§ãããBPClassã¨é£æºãåãã(颿°Ver)ã¨ã§ãæã£ã¦ããã¦ãã ããã
Door.cpp
// OverlapEvent Override DoorTrigger->OnComponentBeginOverlap.AddDynamic(this, &ADoor::OnDoorTriggerBeginOverlap); DoorTrigger->OnComponentEndOverlap.AddDynamic(this, &ADoor::OnDoorTriggerEndOverlap);
AddDynamicãã«ãã¼ãã¯ãã¨ãããã®ãç¨ãããã¨ã§ãèªåçã«é¢æ°åã®æååãçæãã¦ãããããã§ãã
ããã«ãã£ã¦OverlapEventã®Bindingã¯å®äºã§ãã
ãã¨ã¯é¢æ°ãå¼ã³åºãã¦å¥½ããªã¿ã¤ãã³ã°ã§ä½¿ãã°OK
Door.cpp
void ADoor::OnDoorTriggerBeginOverlap(class UPrimitiveComponent* HitComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult) { // 好ããªå¦çãæ¸ãã¦ãã ããã } void ADoor::OnDoorTriggerEndOverlap(class UPrimitiveComponent* HitComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex) { // 好ããªå¦çãæ¸ãã¦ãã ããã }
Full Code
Door.h
// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "GameFramework/Actor.h" #include "Door.generated.h" UCLASS() class SIDESHOOTERCPP_API ADoor : public AActor { GENERATED_BODY() public: // Sets default values for this actor's properties ADoor(); // Called when the game starts or when spawned virtual void BeginPlay() override; // Called every frame virtual void Tick( float DeltaSeconds ) override; // BeginOverlap UFUNCTION(BlueprintCallable, Category = "Door", meta = (AllowPrivateAccess = "true")) void OnDoorTriggerBeginOverlap(class UPrimitiveComponent* HItComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult); // EndOverlap UFUNCTION(BlueprintCallable, Category = "Door", meta = (AllowPrivateAccess = "true")) void OnDoorTriggerEndOverlap(class UPrimitiveComponent* HItComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex); // Add primitive UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Door") class UStaticMeshComponent* DoorMesh; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Door") class UStaticMeshComponent* DoorFrameMesh; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Door") class UBoxComponent* DoorTrigger; };
Door.cpp
// Fill out your copyright notice in the Description page of Project Settings. #include "SideShooterCpp.h" #include "Door.h" // Sets default values ADoor::ADoor() { // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; // Create the Object DoorMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Door")); DoorFrameMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("DoorFrame")); DoorTrigger = CreateDefaultSubobject<UBoxComponent>(TEXT("DoorTrigger")); // Attach process RootComponent = DoorFrameMesh; DoorMesh->SetupAttachment(DoorFrameMesh); DoorTrigger->SetupAttachment(DoorMesh); // OverlapEvent Override DoorTrigger->OnComponentBeginOverlap.AddDynamic(this, &ADoor::OnDoorTriggerBeginOverlap); DoorTrigger->OnComponentEndOverlap.AddDynamic(this, &ADoor::OnDoorTriggerEndOverlap); } // Called when the game starts or when spawned void ADoor::BeginPlay() { Super::BeginPlay(); } // Called every frame void ADoor::Tick( float DeltaTime ) { // æãéãå¦ç } void ADoor::OnDoorTriggerBeginOverlap(class UPrimitiveComponent* HItComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult) { // 好ããªå¦çãæ¸ãã¦ãã ããã } void ADoor::OnDoorTriggerEndOverlap(class UPrimitiveComponent* HItComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex) { // 好ããªå¦çãæ¸ãã¦ãã ããã }
ã»ãã¾ã
BeginOverlap,EndOverlapãã¤ãã³ãã«ãBPã¸å
¬éãããå ´åã¯
Door.h
// BeginOverlap UFUNCTION(BlueprintImplementableEvent, BlueprintCallable, Category = "Door", meta = (AllowPrivateAccess = "true")) void OnDoorTriggerBeginOverlap(class UPrimitiveComponent* HItComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult); // EndOverlap UFUNCTION(BlueprintImplementableEvent, BlueprintCallable, Category = "Door", meta = (AllowPrivateAccess = "true")) void OnDoorTriggerEndOverlap(class UPrimitiveComponent* HItComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
Door.hã®Begin,EndOverlap颿°ã®UFUNCTIONã«BlueprintImplementableEventã追å ããDoor.cppã®é¢æ°ã®å®ç¾©ãæ¶ãã°OKã§ãã
ã³ã³ãã¤ã«ãã¦DoorClassãç¶æ¿ããDoorBPClassãä½ãã
èªåã ãã®ã¤ãã³ããä½ã£ã¡ããã¾ããã('Ï')
ããã§OverlapEventã«é¢ãã¦ã¯çµããï¼
ãæ¬¡ã¯AnimBPãC++ããå¶å¾¡ããå¦çã«ã¤ãã¦ã§ãã
Animation
仿§ :
ãã¦ã¹ã®å³ã¯ãªãã¯ã§ADS(éã®ãµã¤ããè¦ããå®å®ããããã¨)ã®Animationããããã
1 : AnimBPã使ããã
ããã§ã²ã¨ã¤æ³¨æã§ããå¿
ããAnimInstanceClassããç¶æ¿ããAnimBPClassã使ãã¦ãã ããã
ååã¯ãªãã§ãOkã§ãã
2 : AnimInstanceClassãç¶æ¿ããC++Classãä½ã
ããããããååã§ä½æã®å¾ãã³ã¼ããæ¸ãã¦ããã¾ãããã
ä»å㯠TPSAnimInstance ã¨ããååã§ä½æãã¾ããã
3 : 夿°å®£è¨
TPSAnimInsatnce.h
UCLASS(transient,Blueprintable,hideCategories=AnimInstance,BlueprintType) class SGRAYSHOOTER_API UTPSAnimInstance : public UAnimInstance { GENERATED_UCLASS_BODY() public: UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Combat") bool bIsAiming; };
4 : ã³ã³ã¹ãã©ã¯ã¿ã§å¤ã®åæåå¦ç
TPSAnimInstance.cpp
UTPSAnimInstance::UTPSAnimInstance(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { // ããã«å¤æ°ã®åæå¤ãè¨å®ãã¾ãã bIsAiming = false; }
Full Code :
TPSAnimInstance.h
// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "Animation/AnimInstance.h" #include "TPSAnimInstance.generated.h" /** * */ UCLASS(transient,Blueprintable,hideCategories=AnimInstance,BlueprintType) class SIDESHOOTERCPP_API UTPSAnimInstance : public UAnimInstance { GENERATED_UCLASS_BODY() public: UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Combat") bool bIsAiming; };
TPSAnimInsatnce.cpp
// Fill out your copyright notice in the Description page of Project Settings. #include "ããã¸ã§ã¯ãã®åå.h" #include "TPSAnimInstance.h" UTPSAnimInstance::UTPSAnimInstance(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { // ããã«å¤æ°ã®åæå¤ãè¨å®ãã¾ãã bIsAiming = false; }
5 : 使ç¨ãã¦ããCharacterClassã§é¢æ°ã夿°ãå¶ä½
ThirdPersonCharacter.h
UCLASS(config=Game) class ThirdPersonCharacter : public ACharacter { GENERATED_BODY() UPROPERTY(VisibleAnywhere,BlueprintReadOnly,Category = "Combat") class USkeletalMeshComponent* myMesh; protected: void Aim(); void StopAim(); };
6 : CharacterClassã®ã³ã³ã¹ãã©ã¯ã¿ã§åæåå¦ç
AThirdPersonCharacter::AThirdPersonCharacter() { // ä¸ã«ãã¡ããã¡ãæ¸ãã¦ããã¨æãã¾ããæ°ã«ããã myMesh = GetMesh(); }
7 : PlayerInputComponentãè¨å®
BPãããã¤ã³ããããã¤ã³ãããã¤ãã³ããå¼ã¶ã«ã¯ãã¼ãä¸ã¤ã§å¯¾å¿ã§ãã¾ããC++ã ã¨å°ãã ãæéãå¿
è¦ã«ãªãã¾ãã
(1) : ThirdPersonCharacterã®ã½ã¼ã¹ãã¡ã¤ã«ã«ã³ã¼ããæ¸ãã¾ãã
ThirdPersonCharacter.cpp
void AThirdPersonCharacter::SetupInputComponent(class UInputComponent* PlayerInputComponent) { PlayerInputComponent->BindAction("ADS",IE_Pressed, this, &AThirdPersonCharacter::Aim); PlayerInputComponent->BindAction("ADS",IE_Released, this, &AThirdPersonCharacter::StopAim);
PlayerInputComponentã®BindAction,BindAxis颿°(ä»å使ã£ã¦ãã¾ãããçããã®CharacterClassã«ããã¨æãã®ã§èª¬æããã¦ããã ãã¾ãã)ã§ããã
弿°ã¯ãã®ããã«ãªã£ã¦ãã¾ãã
void AYourCharacterClassName::SetupInputComponent(class UInputComponent* PlayerInputComponent) { PlayerInputComponent->BindAction(FName ActionName, EInput KeyEvent, AYourCharacterClassName *Object, void (AYourCharacterClassName:: *Func)); PlayerInputComponent->BindAxis(FName AxisName, AYourCharacterClassName *Object, void (AYourCharacterClassName:: *Func)); }
BindAction :
FName ActionName : Project Settings->
Inputã«è¨å®ããã¤ãã³ããã¼ã ã®ãã¨ã§ããä»å㯠"ADS"ã¨ããååã®ã¤ã³ãããã¢ã¯ã·ã§ã³ã§ãã
EInput KeyEvent : åæåã§KeyEventã6ã¤å®ç¾©ããã¦ãã¾ãã
IE_Pressed : ãã¼ãæ¼ãããæå®è¡
IE_Released : ãã¼ãé¢ãããæå®è¡
IE_Repeat : ãã¼ãæ¼ããã¦ããéãå®è¡(ã§ãããä»ã®ãã¼ã®å²ãè¾¼ã¿ãå
¥ãã¨ä¸æãããããã§ãã)
IE_DoubleClick : ãã¼ãããã«ã¯ãªãã¯ãããæå®è¡
IE_Axis : ãã¼ã®AxisValueãéã
IE_MAX : ãã¿ã¾ããã䏿ã§ã...ã
AYourCharacterClassName *Object :
ç¾å¨ã使ç¨ãã¦ããCharacterClassãåç
§ãã¦ããã¦ãã ãããä»åã¯èªåèªèº«ãªã®ã§ this ã§ãã
void(AYourCharacterClassName:: *Func) :
ãã¼ãæ¼ããã¨ã,é¢ããæã«å¼ã¶ã¤ãã³ããåç
§ãã¦ãã ãããä»åã¯Aim,StopAim颿°ãå¼ãã§ãã¾ãã
8 : Aim,StopAim颿°ãå®è£
ThirdPersonCharacter.cpp
void AThirdPersonCharacter::Aim() { // ããmyMeshãnullãªãreturn if(!myMesh) return; // UTPSAnimInstanceã®Animationãå®ç¾©ããmyMeshã«ã¢ãµã¤ã³ããã¦ããAnimBPã«Cast UTPSAnimInstance *Animation = Cast<UTPSAnimInstance>(myMesh->GetAnimInstance()); // ããCastã«å¤±æãããreturn if(!Animation) return; // UTPSAnimInstanceã®bIsAimingã«trueãä»£å ¥ Animation->bIsAiming = true; } void AThirdPersonCharacter::StopAim() { // ããmyMeshãnullãªãreturn if(!myMesh) return; // UTPSAnimInstanceã®Animationãå®ç¾©ããmyMeshã«ã¢ãµã¤ã³ããã¦ããAnimBPã«Cast UTPSAnimInstance *Animation = Cast<UTPSAnimInstance>(myMesh->GetAnimInstance()); // ããCastã«å¤±æãããreturn if(!Animation) return; // UTPSAnimInstanceã®bIsAimingã«falseãä»£å ¥ Animation->bIsAiming = false; }
Full Code :
ThirdPersonCharacter.h
// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved. #pragma once #include "GameFramework/Character.h" #include "ThirdPersonCharacter.generated.h" UCLASS(config=Game) class AThirdPersonCharacter : public ACharacter { GENERATED_BODY() UPROPERTY(VisibleAnywhere,BlueprintReadOnly,Category = "SkeletalMesh",meta = (AllowPrivateAccess = "true")) class USkeletalMeshComponent* myMesh; protected: void Aim(); void StopAim(); };
ThirdPersonCharacter.cpp
// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved. #include "YourProjectName.h" #include "ThirdPersonCharacter.h" #include "TPSAnimInstance.h" AThirdPersonCharacter::AThirdPersonCharacter() { myMesh = GetMesh(); } ////////////////////////////////////////////////////////////////////////// // Input void AThirdPersonCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) { // set up gameplay key bindings PlayerInputComponent->BindAction("ADS", IE_Pressed, this, &AThirdPersonCharacter::Aim); PlayerInputComponent->BindAction("ADS", IE_Released, this, &AThirdPersonCharacter::StopAim); } void AThirdPersonCharacter::Aim() { if (!myMesh) return; UTPSAnimInstance *Animation = Cast<UTPSAnimInstance>(myMesh->GetAnimInstance()); if (!Animation) return; Animation->bIsAiming = true; } void AThirdPersonCharacter::StopAim() { if (!myMesh) return; UTPSAnimInstance *Animation = Cast<UTPSAnimInstance>(myMesh->GetAnimInstance()); if (!Animation) return; Animation->bIsAiming = false; }
ããã¾ã§ãããAnimBPã«é£ã³ã¾ãããã(ã³ã³ãã¤ã«ãå¿ããã«ï¼)
9 : AnimBPã§ParentClassãåå®ç¾©
夿´ãå®äºãããBPãã³ã³ãã¤ã«ãã¦ä¸ããã
ã¡ããã¨åä½ãã¦ãããã¹ããã¦ã¿ã¾ããããã
ç»é¢ã«trueã¨è¡¨ç¤ºããã¦ããã°OKã§ãã
10 : å®éã«ãã¬ã¤ã¤ã¼ã«Animationããã
ã»ã¾ãã¯StateMachineãç¨æãã¾ãããªããStateMachineã®èª¬æã¯æ¬é¡ããããã¦ãã¾ãã®ã§ã
docs.unrealengine.com
ãã¡ããã覧ãã ãã('Ï')
ã»StateEditorã«é£ãã ãæ°ããStateãç¨æãã¾ãããã
ååã¯ãªãã§ãããã¨æãã¾ãããä»å㯠" idle " ã¨ããååã®State㨠" Aiming " ã¨ããååã®Stateãä½ãã¾ãã
ã»idleå
ã« " Idle_Rifle_Hip " ã追å ãã¦ããã¾ãã
ã»ã次ã¯AimingStateã追å ãã¾ãã
Aimingå
ã« " Idle_Rifle_Ironsights " ã追å ãã¾ãã
ã»é·ç§»ã«ã¼ã«ãè¨å®ãã¾ã
"idle" - "Aiming"
"Aiming" - "idle"
ã¡ãªã¿ã«UPROPERTYã®Categoryã¯ãããªæãã§æ´»èºã§ãã¾ãã(便å©ï¼)
ã»Test!!
Characterããããªæãã§Animationãã¦ããã°OKã§ã('Ï')
Animationç·¨ã»ã»ã»END!!
[LINETRACE]
ããªãã¿ã®LineTraceã§ãã
éã®çºå°å¦çãikãªã©ã«ã使ããã¦ãããã®å¦çãUnrealC++ã§ãã£ã¦ã¿ã¾ãããã
1 : ObjectClassãç¶æ¿ããClassãä½ã
ä»å㯠MyStaticLibrary ã¨ããååã®Classãä½ãã¾ããã
2 : LineTrace颿°ãå®ç¾©ãã
MyStaticLibrary.h
public: /** LineTrace */ static FORCEINLINE bool Trace( UWorld* World, AActor* ActorToIgnore, const FVector& Start, const FVector& End, FHitResult& HitOut, ECollisionChannel CollisionChannel = ECC_Pawn, bool ReturnPhysMat = false)
ã»FORCEINLINEãã¯ã
ã³ã¼ããå¼·å¶çã«ã¤ã³ã©ã¤ã³åãããã®ã§ãã(inlineã®å¼·ãVerããª...?)
inlineã«ã¤ãã¦ã¯ãã¡ããåç
§ã
インライン関数 - Wikipedia
3 : 颿°ã®ä¸èº«ãæ¸ãã¦ãã
MyStaticLibrary.h
public: /** LineTrace */ static FORCEINLINE bool Trace( UWorld* World, AActor* ActorToIgnore, const FVector& Start, const FVector& End, FHitResult& HitOut, ECollisionChannel CollisionChannel = ECC_Pawn, bool ReturnPhysMat = false) { if (!World) { return false; } FCollisionQueryParams TraceParams(FName(TEXT("VictoreCore Trace")), true, ActorToIgnore); TraceParams.bTraceComplex = true; //TraceParams.bTraceAsyncScene = true; TraceParams.bReturnPhysicalMaterial = ReturnPhysMat; //Ignore Actors TraceParams.AddIgnoredActor(ActorToIgnore); //Re-initialize hit info HitOut = FHitResult(ForceInit); //Trace! World->LineTraceSingleByChannel( HitOut, Start, End, CollisionChannel, TraceParams ); return (HitOut.GetActor() != NULL); }
ã»FCollisionQueryParams
Collisionã®è¡çªå¤å®ã«é¢ããæ
å ±ãããããã¨å
¥ã£ã¦ãã¾ãã
ä»åã®å¦çã§è¨ãã°bTraceComplex(trueãªãå
ã®meshã®Collisionããè¡çªå¤å®ãåããfalseãªãmeshã«å²ãå½ã¦ããã¦ããcollisionããè¡çªå¤å®ãåã),
bReturnPhysicalMaterial(PhysicalMatãè¿ããå¦ã),IgnoreActor(Traceãç¡è¦ããActorãæå®ã§ãã)ãªã©ã§ãã便å©...
ã»FHitResult
ããªãã¿ã®ããããªã¶ã«ãã§ãã
4 : ã³ã³ã¹ãã©ã¯ã¿ã®å®ç¾©
MyStaticLibrary.cpp
UMyStaticLibrary::UMyStaticLibrary(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { //夿°ã®åæåã¨ããã¦ãï¼ï¼ }
ã§ã¯CharacterClassã«æ»ãLineTraceãå¼ã³åºã颿°ãå®ç¾©ããPlayerInputComponentã®BindActionã§InputActionãBindãã¾ãããï¼
5 : CharacterClassã«LineTrace颿°ãå®ç¾©
â»ThirdPersonCharacterã使ã£ã¦ããã¨ä»®å®ãã¦ã®ã³ã¼ãã§ãã
ThirdPersonCharacter.h
UCLASS(config=Game) class AThirdPersonCharacter : public ACharacter { GENERATED_BODY() protected: void LineTrace(); }
ä»ã«ããããæ¸ããã¦ããã¨æãã¾ããæ°ã«ããªãã¦å¤§ä¸å¤«ã§ãã
6 : InputActionãè¨å®
ä¸åº¦UE4ã®Editorã«æ»ãInputActionãè¨å®ãã¾ãããã
ä»å㯠"Fire" ã¨ããååã®Actionããã¦ã¹ã®å·¦ãã¿ã³ã«å²ãå½ã¦ã¾ããããããªæã
7 : cppã«MyStaticLibraryãincludeã颿°ã®å¼ã³åºã
ThirdPersonCharacter.cpp
#include "MyStaticLibrary.h" AThirdPersonCharacter::AThirdPersonCharacter() { void AThirdPersonCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) { PlayerInputComponent->BindAction("Fire",IE_Pressed, this, &AThirdPersonCharacter::LineTrace); } void AThirdPersonCharacter::LineTrace() { ACharacter* myCharacter = UGameplayStatics::GetPlayerCharacter(AActor::GetWorld(),0); const FVector Start = myCharacter->GetActorLocation(); const FVector End = Start + myCharacter->GetActorRotation().Vector() * ã好ããªè·é¢(5000ã¨ã); FHitResult HidData(ForceInit); if(UMyStaticLibrary::Trace(AActor::GetWorld(), myCharacter, Start, End, HitData) && HitData.GetActor()) { //ã好ããªå¦çãã©ãï¼ï¼ } }
ã»ãã¾ã
Traceãå½ãã£ãæã«Blueprintã§Eventãå¼ã³åºããã®ã "å®è£
" ãã¦ã¿ã¾ãããã
ThirdPersonCharacter.h
UCLASS(config=Game) class AThirdPersonCharacter : public ACharacter { GENERATED_BODY() public: UFUNCTION(Category = "Trace", BlueprintImplementableEvent, BlueprintCallable) void OnTraceHit(FVector ImpactPoint, AActor* HitActor);
ã»æ¬¡ã«å
ã»ã©ã® //ã好ããªå¦çãã©ãï¼ ã®é¨åã«å
ã»ã©ã®é¢æ°ãå¼ã³åºãã¦ãããã ãã§....
ThirdPersonCharacter.cpp
{ HitPoint = HitData.ImpactPoint; AActor* HitActor = HitData.GetActor(); OnTraceHit(HitPoint,HItActor); }
ãããªãã¨ãå¯è½ã«....ç´ æ´ãããã
以ä¸ã§æ¬ããã°ã¯çµäºã«ãªãã¾ããå¼µãåã£ã¦ããªãé·ããè¦ã«ãããªã£ã¦ãã¾ãç³ã訳ããã¾ãã...ã
ééã£ã¦ããç®æãããã¾ãããä¿®æ£ä¾é ¼ããé¡ããã¾ã
ããããææ¥ã¯ã¯ãªã¹ãã¹ã¤ããã¼ã£ã¡ã決ãè¾¼ãçããã« demuyan ããã® ã ä½ãè£ã£ã½ããã¿ãæ¸ãã¾ã ããçãã¦ããããã¨ãé¡ã£ã¦çµããã¨ããã¦ããã ãã¾ãã