Hi there
Sorry if this has been answered anywhere else, i couldn’t find it!
I would like to know the correct way to reference a bool or any variale across scripts to check the condition, my atempt below errors (illegal reference to non-static member ‘ATopDown2Character::bActiveUnit’), so i have comented it out, it is at the begining of ATopDown2PlayerController::MoveToMouseCursor().
I have created a bool here: TopDown2Character.h
// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "GameFramework/Character.h"
#include "TopDown2Character.generated.h"
UCLASS(Blueprintable)
class ATopDown2Character : public ACharacter
{
GENERATED_UCLASS_BODY()
/* Have we clicked the unit? */
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = Unit)
bool bActiveUnit;
/** Top down camera */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera)
TSubobjectPtr<class UCameraComponent> TopDownCameraComponent;
/** Camera boom positioning the camera above the character */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera)
TSubobjectPtr<class USpringArmComponent> CameraBoom;
};
I have included this header file within the: TopDown2PlayerController.cpp
// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
#include "TopDown2.h"
#include "TopDown2PlayerController.h"
#include "TopDown2Character.h"
#include "AI/Navigation/NavigationSystem.h"
ATopDown2PlayerController::ATopDown2PlayerController(const class FPostConstructInitializeProperties& PCIP)
: Super(PCIP)
{
bShowMouseCursor = true;
DefaultMouseCursor = EMouseCursor::Crosshairs;
}
void ATopDown2PlayerController::PlayerTick(float DeltaTime)
{
Super::PlayerTick(DeltaTime);
// keep updating the destination every tick while desired
if (bMoveToMouseCursor)
{
MoveToMouseCursor();
}
}
void ATopDown2PlayerController::SetupInputComponent()
{
// set up gameplay key bindings
Super::SetupInputComponent();
InputComponent->BindAction("SetDestination", IE_Pressed, this, &ATopDown2PlayerController::OnSetDestinationPressed);
InputComponent->BindAction("SetDestination", IE_Released, this, &ATopDown2PlayerController::OnSetDestinationReleased);
// support touch devices
InputComponent->BindTouch(EInputEvent::IE_Pressed, this, &ATopDown2PlayerController::MoveToTouchLocation);
InputComponent->BindTouch(EInputEvent::IE_Repeat, this, &ATopDown2PlayerController::MoveToTouchLocation);
}
void ATopDown2PlayerController::MoveToMouseCursor()
{
//if (!ATopDown2Character::bActiveUnit)
//return;
// Trace to see what is under the mouse cursor
FHitResult Hit;
GetHitResultUnderCursor(ECC_Visibility, false, Hit);
if (Hit.bBlockingHit)
{
// We hit something, move there
SetNewMoveDestination(Hit.ImpactPoint);
}
}
void ATopDown2PlayerController::MoveToTouchLocation(const ETouchIndex::Type FingerIndex, const FVector Location)
{
FVector2D ScreenSpaceLocation(Location);
// Trace to see what is under the touch location
FHitResult HitResult;
GetHitResultAtScreenPosition(ScreenSpaceLocation, CurrentClickTraceChannel, true, HitResult);
if (HitResult.bBlockingHit)
{
// We hit something, move there
SetNewMoveDestination(HitResult.ImpactPoint);
}
}
void ATopDown2PlayerController::SetNewMoveDestination(const FVector DestLocation)
{
APawn* const Pawn = GetPawn();
if (Pawn)
{
UNavigationSystem* const NavSys = GetWorld()->GetNavigationSystem();
float const Distance = FVector::Dist(DestLocation, Pawn->GetActorLocation());
// We need to issue move command only if far enough in order for walk animation to play correctly
if (NavSys && (Distance > 120.0f))
{
NavSys->SimpleMoveToLocation(this, DestLocation);
}
}
}
void ATopDown2PlayerController::OnSetDestinationPressed()
{
// set flag to keep updating destination until released
bMoveToMouseCursor = true;
}
void ATopDown2PlayerController::OnSetDestinationReleased()
{
// clear flag to indicate we should stop updating the destination
bMoveToMouseCursor = false;
}
Thanks in advance