Привет всем!
Проблема в следующем создаю topdown/с++
добавляю в MyProjectPlayerController.h/cpp (сгенерированы ue4)
в .h
после подключения заголовочных
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FMoveOnClient, AController*, controller, const FVector&, goal);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FMoveOnServer, AController*, controller, const FVector&, goal);
в сам класс
virtual void BeginPlay() override;
UFUNCTION(SERVER, Reliable)
void MoveToCursorOnServer(AController* controller, const FVector& goal);
UFUNCTION(Client, Reliable)
void MoveToCursorOnClient(AController* controller, const FVector& goal);
private:
UPROPERTY(BlueprintAssignable)
FMoveOnServer OnMoveToCursorOnServer;
UPROPERTY(BlueprintAssignable)
FMoveOnClient OnMoveToCursorOnClient;
а в .cpp
void AMyProjectPlayerController::BeginPlay()
{
OnMoveToCursorOnServer.AddDynamic(this, &AMyProjectPlayerController::MoveToCursorOnServer);
OnMoveToCursorOnClient.AddDynamic(this, &AMyProjectPlayerController::MoveToCursorOnClient);
}
void AMyProjectPlayerController::MoveToCursorOnServer(AController* controller, const FVector& goal)
{
UAIBlueprintHelperLibrary::SimpleMoveToLocation(controller, goal);
OnMoveToCursorOnClient.Broadcast(controller, goal);
}
void AMyProjectPlayerController::MoveToCursorOnClient(AController* controller, const FVector& goal)
{
UAIBlueprintHelperLibrary::SimpleMoveToLocation(controller, goal);
}
а в MoveToMouseCursor заменяю вызов
//UAIBlueprintHelperLibrary::SimpleMoveToLocation(this, MyPawn->GetCursorToWorld()->GetComponentLocation());
OnMoveToCursorOnServer.Broadcast(this, MyPawn->GetCursorToWorld()->GetComponentLocation());
и выдает такую ерунду:
MyProjectPlayerController.gen.cpp.obj : error LNK2005: "protected: void __cdecl AMyProjectPlayerController::MoveToCursorOnClient(class AController *,struct FVector const &)" (?MoveToCursorOnClient@AMyProjectPlayerController@@IEAAXPEAVAController@@AEBUFVector@@@Z) уже определен в MyProjectPlayerController.cpp.obj
1>MyProjectPlayerController.gen.cpp.obj : error LNK2005: "protected: void __cdecl AMyProjectPlayerController::MoveToCursorOnServer(class AController *,struct FVector const &)" (?MoveToCursorOnServer@AMyProjectPlayerController@@IEAAXPEAVAController@@AEBUFVector@@@Z) уже определен в MyProjectPlayerController.cpp.obj
1> Создается библиотека E:\Unreal Projects\MyProject\Intermediate\Build\Win64\UE4Editor\Development\MyProject\UE4Editor-MyProject.suppressed.lib и объект E:\Unreal Projects\MyProject\Intermediate\Build\Win64\UE4Editor\Development\MyProject\UE4Editor-MyProject.suppressed.exp
1>MyProjectPlayerController.cpp.obj : error LNK2001: неразрешенный внешний символ "public: virtual void __cdecl AMyProjectPlayerController::MoveToCursorOnClient_Implementation(class AController *,struct FVector const &)" (?MoveToCursorOnClient_Implementation@AMyProjectPlayerController@@UEAAXPEAVAController@@AEBUFVector@@@Z).
1>MyProjectPlayerController.gen.cpp.obj : error LNK2001: неразрешенный внешний символ "public: virtual void __cdecl AMyProjectPlayerController::MoveToCursorOnClient_Implementation(class AController *,struct FVector const &)" (?MoveToCursorOnClient_Implementation@AMyProjectPlayerController@@UEAAXPEAVAController@@AEBUFVector@@@Z).
1>MyProjectPlayerController.cpp.obj : error LNK2001: неразрешенный внешний символ "public: virtual void __cdecl AMyProjectPlayerController::MoveToCursorOnServer_Implementation(class AController *,struct FVector const &)" (?MoveToCursorOnServer_Implementation@AMyProjectPlayerController@@UEAAXPEAVAController@@AEBUFVector@@@Z).
1>MyProjectPlayerController.gen.cpp.obj : error LNK2001: неразрешенный внешний символ "public: virtual void __cdecl AMyProjectPlayerController::MoveToCursorOnServer_Implementation(class AController *,struct FVector const &)" (?MoveToCursorOnServer_Implementation@AMyProjectPlayerController@@UEAAXPEAVAController@@AEBUFVector@@@Z).
1>E:\Unreal Projects\MyProject\Binaries\Win64\UE4Editor-MyProject.dll : fatal error LNK1120: неразрешенных внешних элементов: 2
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.MakeFile.Targets(51,5): error MSB3073: выход из команды "C:\UE_4.26\Engine\Build\BatchFiles\Rebuild.bat MyProjectEditor Win64 Development -Project="E:\Unreal Projects\MyProject\MyProject.uproject" -WaitMutex -FromMsBuild" с кодом -1.
я хочу задействовать движение по курсору клиент/сервер
на блюпринтах все работает, хотел также сделать на c++, что-то пошло не так
а если использовать макрос
DECLARE_EVENT_TwoParams( AMyProjectPlayerController, FMoveOnServer , AController*, const FVector&)
он ругается, что FMoveOnServer должен быть uclass, ustruct, uenum
в строке объявления события
UPROPERTY(BlueprintAssignable)
FMoveOnServer OnMoveToCursorOnServer;
Когда создаешь reliable функции они должны иметь вид в cpp имплементации такой:
Имя в .h определено как
UFUNCTION(SERVER, Reliable) void MoveToCursorOnServer(AController* controller, const FVector& goal);
void MoveToCursorOnServer_Implementation(AController* controller, const FVector& goal) bool MoveToCursorOnServer_Validate(AController* controller, const FVector& goal)
Для Client, Reliable должны создаваться только c _Implementation.
Т.е. ты не руками должен это делать, а когда в студии правой кнопкой мышки тыкаешь по функции которую ты описал в хидере, там будет в контекстном меню create implementation и должен intellisense сам за тебя создавать с такими именами.
Если студия не создает, то руками тогда сам допиши эти сигнатуры.
Еще раз для client надо дописывать void имя_Implementation(параметры) , для server надо создавать 2 функции, одна void имя_Implementation(параметры), вторая bool имя_Validate(параметры)
В Validate всегда ставь return true
О, благодарю, так и есть, все заработало
в документации такого не заметил
вот кстати в документации это написано
https://docs.unrealengine.com/en-US/InteractiveExperiences/Networ… ew/index.html
блин, протупил