Announcement

Collapse
No announcement yet.

Detour Crowd / UCrowdFollowingComponent

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Detour Crowd / UCrowdFollowingComponent

    Hello,

    I have a problem with my Unit Movement. I am working on an RTS and I am trying to implement the Detour Crowd Avoidance provided by Unreal Engine but run into some problems.

    1) If 2 Units collide(what shouldnt even happen) 1 Unit pushes the other unit away like a rocket.
    2) Sometimes the pathfinding is weird. The unit first walks in a different direction then it should.

    I first tried it with a blueprint project (3rd person template) and simply changed the AIController to a DetourCrowdAIController and it worked fine. No pushing or anything. So it must have to do something with my implementation in C++, but I dont know what. It has to be either the AIController or the Unit itself.

    Here is the code of the Controller and the Unit and also a short video:

    My Controller that every Unit has
    Code:
    #pragma once
    
    #include "AIController.h"
    #include "RTSUnitController.generated.h"
    
    /**
     * 
     */
    UCLASS()
    class RTSCAMERAANDMOVEMENT_API ARTSUnitController : public AAIController
    {
    	GENERATED_BODY()
    public:
    	ARTSUnitController(const FObjectInitializer& ObjectInitializer);
    };
    Code:
    #include "RTSCameraAndMovement.h"
    #include "RTSUnitController.h"
    #include "Navigation/CrowdFollowingComponent.h"
    
    ARTSUnitController::ARTSUnitController(const FObjectInitializer& ObjectInitializer)
    	: Super(ObjectInitializer.SetDefaultSubobjectClass<UCrowdFollowingComponent>(TEXT("PathFollowingComponent")))
    {
    
    }
    My implementation of a Basic Unit

    Code:
    #include "GameFramework/Character.h"
    #include "RTSUnitController.h"
    #include "RTSUnit.generated.h"
    
    UCLASS()
    class RTSCAMERAANDMOVEMENT_API ARTSUnit : public ACharacter
    {
    	GENERATED_BODY()
    
    public:
    
    	//Static Mesh Component
    	UPROPERTY(EditAnywhere)
    	UStaticMeshComponent* UnitMesh;
    
    	//Selection Circle
    	UPROPERTY(EditAnywhere)
    	UStaticMeshComponent* SelectionMesh;
    
    	//UnitSelected
    	void UnitSelected();
    	void UnitDeselected();
    
    	// Sets default values for this character's properties
    	ARTSUnit();
    
    	// 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;
    
    	
    	
    };
    Code:
    #include "RTSCameraAndMovement.h"
    #include "RTSUnit.h"
    
    
    // Sets default values
    ARTSUnit::ARTSUnit()
    {
     	// Set this character to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
    	PrimaryActorTick.bCanEverTick = true;
    
    	//Set Default AI Controller
    	AIControllerClass = ARTSUnitController::StaticClass();
    
    	//Visible Mesh
    	UnitMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("VisualRepresentation"));
    	UnitMesh->AttachTo(RootComponent);
    	static ConstructorHelpers::FObjectFinder<UStaticMesh> UnitMeshAsset(TEXT("/Game/Models/Archer.Archer"));
    	if (UnitMeshAsset.Succeeded())
    	{
    		UnitMesh->SetStaticMesh(UnitMeshAsset.Object);
    	}
    
    	//Selection Mesh
    	SelectionMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Selection"));
    	SelectionMesh->AttachTo(UnitMesh);
    	SelectionMesh->SetRelativeScale3D(FVector(2,2,2));
    	SelectionMesh->SetVisibility(false);
    	static ConstructorHelpers::FObjectFinder<UStaticMesh> UnitSelectionAsset(TEXT("/Game/Models/Shape_Plane.Shape_Plane"));
    	if (UnitSelectionAsset.Succeeded())
    	{
    		SelectionMesh->SetStaticMesh(UnitSelectionAsset.Object);
    	}
    }
    
    // Called when the game starts or when spawned
    void ARTSUnit::BeginPlay()
    {
    	Super::BeginPlay();
    	
    }
    
    // Called every frame
    void ARTSUnit::Tick( float DeltaTime )
    {
    	Super::Tick( DeltaTime );
    
    }
    
    // Called to bind functionality to input
    void ARTSUnit::SetupPlayerInputComponent(class UInputComponent* InputComponent)
    {
    	Super::SetupPlayerInputComponent(InputComponent);
    
    }
    
    void ARTSUnit::UnitSelected()
    {
    	SelectionMesh->SetVisibility(true);
    }
    
    void ARTSUnit::UnitDeselected()
    {
    	SelectionMesh->SetVisibility(false);
    }
    Sorry for the laggy video but I am currently on my Notebook during holidays and dont have access to my pc


    Maybe someone has a solution.

    #2
    I've experienced that before but I don't have that problem with multiple unit movement. I am not exactly sure what I did to change it, I'll try to find out but I figured I would share a screenshot of my physics and collisions settings for my capsule component. My best guess is I turned off "Can Character Step Up On". My unit movement is still terrible.

    Using detour crowds they seem to navigate to where I tell them well enough but if they encounter a group of units that are not moving they can get stuck on them for some reason but they never push them.

    Click image for larger version

Name:	physics-settings.png
Views:	1
Size:	76.2 KB
ID:	1097735
    Last edited by Heoki; 12-30-2015, 03:19 AM.

    Comment

    Working...
    X