? ,,

成人aa视频在线观看_色婷婷精品久久二区二区蜜臂av _国产一区二区三区在线观看免费 _韩日欧美一区二区三区_午夜成人免费视频_欧美综合久久久_国产精品国产三级国产普通话99 _福利一区二区在线观看_奇米精品一区二区三区在线观看_91精品国产综合久久福利_免费精品视频在线_狠狠色丁香久久婷婷综合_中_色一区在线观看_91福利国产成人精品照片_在线观看www91_日韩高清在线一区

聯系我們

給我們留言

聯系我們

地址:福建省晉江市青陽街道洪山路國際工業設計園納金網

郵箱:info@narkii.com

電話:0595-82682267

(周一到周五, 周六周日休息)

當前位置:主頁 > 3D教程 > 圖文教程

UE4 網游中角色Pawn的移動位置同步以及RTS多角色同

來源: 52vr | 責任編輯:傳說的落葉 | 發布時間: 2019-06-06 08:23 | 瀏覽量:

[UE4]網游中角色Pawn的移動位置同步以及RTS多角色同時移動的解決方案

 

下面方案的思路是:
每個Actor,為其定義一個代理(ActorProxy),真實的Actor放在服務端,代理ActorProxy放在客戶端,移動Actor時,實際是移動服務端上的Actor,然后對客戶端ActorProxy的位置進行同步。

攝像機綁定的是ActorProxy,服務端的真實Actor不用攝像機;而AIController實際控制的是服務端Actor,客戶端其實沒有AIController。

另外,下面例子的同步機制使用的UE4自身集成的Replication(也就是常用的UFUNCTION(Server, Reliable, WithValidation)),這個是非常耗費帶寬的,因為是定時且頻繁的同步數據。這個如果是做局域網服務端還可以,但是如果是大型高負載服務端,建議自己實現同步機制。另外,v4.4開始,shipping編譯出來的版本會自動刪掉UE4的server模式。原因肯定是官方也不希望這個方便測試的同步機制被開發者應用到生產環境中。所以下面例子中,參考下它的思路即可,具體的同步處理的細節問題可以忽略。

 

RTS游戲中多角色同時移動的方案:

為在每個自定義Pawn類定義個AIController,群體移動時,遍歷所有Pawn,依次調用各自的AIController->MoveToLocation。

 

另外注意點:AIController->MoveToLocation無法像UNavigationSystem->SimpleMoveToLocation()那樣可以主動繞開障礙物,一般建議在服務端通過UNavigationSystem獲取移動路徑的數據,然后將這些數據與客戶端同步。

可參考:
Creating a Movement Component for an RTS in UE4 
http://www.gamedev.net/page/resources/_/technical/game-programming/creating-a-movement-component-for-an-rts-in-ue4-r4019

 

=============================================================================

=============================================================================

下面文章有點不足的問題是:服務端是通過AIController->MoveToLocation來尋路的,如果對于一個有障礙物的地圖來啊,移動的時候會出現停滯。另外文章建議說服務端不要用UNavigationSystem>SimpleMoveToLocation,這個可能是誤解,服務端是可以使用的。
 

正文:

[UE4] Getting Multiplayer Player Pawn AI Navigation to work (C++)

http://droneah.com/content/ue4-getting-multiplayer-player-pawn-ai-navigation-work-c

 

Unreal Engine is an awesome piece of technology making it easy to do almost anything you might want.

 

When using the Top Down view however, there is a hurdle to get over when trying to get multiplayer to work. This is a C++ project solution to this problem based on a BluePrints solution.

 

The basic problem stems from the fact that

 

"SimpleMoveToLocation was never intended to be used in a network environment. It's simple after all ;) Currently there's no dedicated engine way of making player pawn follow a path. " (from the same page)

 

To be able to get a working version of SimpleMoveToLocation, we need to do the following:

 

Create a proxy player class (BP_WarriorProxy is BP solution)

Set the proxy class as the default player controller class

Move the camera to the proxy (Since the actual player class is on the server, we can't put a camera on it to display on the client)

The BP solution talks about four classes - our counterparts are as follows:

 

BP_WarriorProxy: ADemoPlayerProxy

BP_WarriorController: ADemoPlayerController (Auto-created when creating a c++ top down project)

BP_Warrior: ADemoCharacter (Auto-created when creating a C++ top down project)

BP_WarriorAI: AAIController - we have no reason to subclass it.

So, from a standard c++ top down project, the only class we need to add is the ADemoPlayerProxy - so go ahead and do that first.

 

The first thing we'll do is rewire the ADemoGameMode class to initialise the proxy class instead of the default MyCharacter Blueprint.

 
  1. ADemoGameMode::ADemoGameMode(const class FPostConstructInitializeProperties& PCIP) : Super(PCIP)   
  2. {   
  3.     // use our custom PlayerController class   
  4.     PlayerControllerClass = ADemoPlayerController::StaticClass();   
  5.    
  6.     // set default pawn class to our Blueprinted character   
  7.     /* static ConstructorHelpers::FClassFinder<apawn> PlayerPawnBPClass(TEXT("/Game/Blueprints/MyCharacter"));  
  8.     if (PlayerPawnBPClass.Class != NULL)  
  9.     {  
  10.         DefaultPawnClass = PlayerPawnBPClass.Class;  
  11.     }*/   
  12.    
  13.     DefaultPawnClass = ADemoPlayerProxy::StaticClass();   
  14. }   

 

Our Player Proxy class declaration

 
  1. /* This class will work as a proxy on the client - tracking the movements of the  
  2.  * real Character on the server side and sending back controls. */   
  3. UCLASS() class Demo_API ADemoPlayerProxy : public APawn   
  4. {   
  5.     GENERATED_UCLASS_BODY()   
  6.     /** Top down camera */   
  7.     UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera) TSubobjectPtr<class ucameracomponent> TopDownCameraComponent;   
  8.    
  9.     /** Camera boom positioning the camera above the character */   
  10.     UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera) TSubobjectPtr<class uspringarmcomponent> CameraBoom;   
  11.    
  12.     // Needed so we can pick up the class in the constructor and spawn it elsewhere   
  13.     TSubclassOf<aactor> CharacterClass;   
  14.    
  15.     // Pointer to the actual character. We replicate it so we know its location for the camera on the client   
  16.     UPROPERTY(Replicated) ADemoCharacter* Character;   
  17.    
  18.     // The AI Controller we will use to auto-navigate the player   
  19.     AAIController* PlayerAI;   
  20.    
  21.     // We spawn the real player character and other such elements here   
  22.     virtual void BeginPlay() override;   
  23.    
  24.     // Use do keep this actor in sync with the real one   
  25.     void Tick(float DeltaTime);   
  26.    
  27.     // Used by the controller to get moving to work   
  28.     void MoveToLocation(const FVector& vector);   
  29. };   

 

and the definition:

 
  1. #include "Demo.h"  
  2. #include "DemoCharacter.h"  
  3. #include "AIController.h"  
  4. #include "DemoPlayerProxy.h"  
  5. #include "UnrealNetwork.h"  
  6.    
  7.    
  8. ADemoPlayerProxy::ADemoPlayerProxy(const class FPostConstructInitializeProperties& PCIP)  
  9. : Super(PCIP)  
  10. {  
  11.     // Don't rotate character to camera direction  
  12.     bUseControllerRotationPitch = false;  
  13.     bUseControllerRotationYaw = false;  
  14.     bUseControllerRotationRoll = false;  
  15.    
  16.     // It seems that without a RootComponent, we can't place the Actual Character easily  
  17.     TSubobjectPtr<UCapsuleComponent> TouchCapsule = PCIP.CreateDefaultSubobject<ucapsulecomponent>(this, TEXT("dummy"));  
  18.     TouchCapsule->InitCapsuleSize(1.0f, 1.0f);  
  19.     TouchCapsule->SetCollisionEnabled(ECollisionEnabled::NoCollision);  
  20.     TouchCapsule->SetCollisionResponseToAllChannels(ECR_Ignore);  
  21.     RootComponent = TouchCapsule;  
  22.    
  23.     // Create a camera boom...  
  24.     CameraBoom = PCIP.CreateDefaultSubobject<USpringArmComponent>(this, TEXT("CameraBoom"));  
  25.     CameraBoom->AttachTo(RootComponent);  
  26.     CameraBoom->bAbsoluteRotation = true// Don't want arm to rotate when character does  
  27.     CameraBoom->TargetArmLength = 800.f;  
  28.     CameraBoom->RelativeRotation = FRotator(-60.f, 0.f, 0.f);  
  29.     CameraBoom->bDoCollisionTest = false// Don't want to pull camera in when it collides with level  
  30.    
  31.     // Create a camera...  
  32.     TopDownCameraComponent = PCIP.CreateDefaultSubobject<UCameraComponent>(this, TEXT("TopDownCamera"));  
  33.     TopDownCameraComponent->AttachTo(CameraBoom, USpringArmComponent::SocketName);  
  34.     TopDownCameraComponent->bUseControllerViewRotation = false// Camera does not rotate relative to arm  
  35.    
  36.     if (Role == ROLE_Authority)  
  37.     {  
  38.         static ConstructorHelpers::FObjectFinder<UClass> PlayerPawnBPClass(TEXT("/Game/Blueprints/MyCharacter.MyCharacter_C"));  
  39.         CharacterClass = PlayerPawnBPClass.Object;  
  40.     }  
  41.    
  42. }  
  43.    
  44. void ADemoPlayerProxy::BeginPlay()  
  45. {  
  46.     Super::BeginPlay();  
  47.     if (Role == ROLE_Authority)  
  48.     {  
  49.         // Get current location of the Player Proxy  
  50.         FVector Location =  GetActorLocation();  
  51.         FRotator Rotation = GetActorRotation();  
  52.    
  53.         FActorSpawnParameters SpawnParams;  
  54.         SpawnParams.Owner = this;  
  55.         SpawnParams.Instigator = Instigator;  
  56.         SpawnParams.bNoCollisionFail = true;  
  57.    
  58.         // Spawn the actual player character at the same location as the Proxy  
  59.         Character = Cast<ADemoCharacter>(GetWorld()->SpawnActor(CharacterClass, &Location, &Rotation, SpawnParams));  
  60.    
  61.         // We use the PlayerAI to control the Player Character for Navigation  
  62.         PlayerAI = GetWorld()->SpawnActor<AAIController>(GetActorLocation(), GetActorRotation());  
  63.         PlayerAI->Possess(Character);  
  64.     }  
  65.    
  66. }  
  67.    
  68. void ADemoPlayerProxy::Tick(float DeltaTime)  
  69. {  
  70.    
  71.     Super::Tick(DeltaTime);  
  72.     if (Character)  
  73.     {  
  74.         // Keep the Proxy in sync with the real character  
  75.         FTransform CharTransform = Character->GetTransform();  
  76.         FTransform MyTransform = GetTransform();  
  77.    
  78.         FTransform Transform;  
  79.         Transform.LerpTranslationScale3D(CharTransform, MyTransform, ScalarRegister(0.5f));  
  80.    
  81.         SetActorTransform(Transform);  
  82.    
  83. <li micxptag"="" style="overflow-wrap: break-word; margin: 0px 0px 0px 38px; padding: 0px; font-size: 1em;">虛幻4,ue4,虛幻4入門,虛幻4基礎,虛幻4高級


相關文章
網友評論

您需要登錄后才可以發帖 登錄 | 立即注冊

關閉

全部評論:0條

推薦
熱門
成人aa视频在线观看_色婷婷精品久久二区二区蜜臂av _国产一区二区三区在线观看免费 _韩日欧美一区二区三区_午夜成人免费视频_欧美综合久久久_国产精品国产三级国产普通话99 _福利一区二区在线观看_奇米精品一区二区三区在线观看_91精品国产综合久久福利_免费精品视频在线_狠狠色丁香久久婷婷综合_中_色一区在线观看_91福利国产成人精品照片_在线观看www91_日韩高清在线一区

          av成人综合网| 蜜桃免费网站一区二区三区| 日韩欧美黄色影院| 欧美成人高清电影在线| 欧美成人乱码一区二区三区| 国产不卡一区二区在线观看| 北岛玲一区二区三区四区| 日韩在线卡一卡二| 麻豆精品一区二区av白丝在线| 国产日韩欧美制服另类| 久久精品综合网| 欧美三级视频在线播放| 欧美日精品一区视频| 欧美日韩mp4| 欧美亚洲日本一区| 欧美日韩国产一级二级| 精品少妇一区二区三区在线视频| 日本精品一区二区三区四区的功能| 国产一区二区三区黄| 久久综合一区| 一区二区三区四区欧美| 欧美人与性禽动交精品| 亚洲国产精品毛片| 麻豆成人小视频| 亚洲巨乳在线观看| 在线成人午夜影院| 国产无一区二区| 一区二区在线观看免费视频播放| 欧美国产日韩亚洲一区| 欧美成人一区二区三区在线观看| 欧美吻胸吃奶大尺度电影| 亚洲欧美日韩另类精品一区二区三区| 精品一区二区三区自拍图片区| 91香蕉视频mp4| 欧美日产一区二区三区在线观看| 久久爱av电影| 91成人免费在线| 久久久久久免费网| 性欧美疯狂xxxxbbbb| 懂色av中文一区二区三区| 国产精品2024| 国产亚洲福利社区| 91高清在线观看| 国产欧美精品在线观看| 国产精品久久久久久久久免费丝袜| 精品国产污网站| 亚洲一区二区五区| 国产成人精品综合在线观看| 久久伦理网站| 欧美一区二区精品| 亚洲一区二区综合| 日韩av电影天堂| 91网站在线播放| 亚洲欧美日产图| 久久久综合网站| 美女被吸乳得到大胸91| 黑人另类av| 天堂资源在线亚洲视频| 欧美成人在线直播| 日韩高清在线电影| 国产精品日韩一区二区三区 | 亚洲精品中文在线观看| 亚洲伊人伊色伊影伊综合网| 国产麻豆精品95视频| jlzzjlzz亚洲女人18| 官网99热精品| 久久久久久久有限公司| 亚洲一区二区三区乱码| 欧美精品一区二区三区蜜桃| 午夜精品福利久久久| 国产一区二区三区四区五区美女 | 久久久久久久久久久久久久久久av| 麻豆av一区二区三区| 欧美一区二区大片| 免费xxxx性欧美18vr| 久久波多野结衣| 久久久亚洲综合| 国产风韵犹存在线视精品| 在线看无码的免费网站| 亚洲欧美影音先锋| 91免费视频网址| 欧美日韩精品久久久| 亚洲成人资源网| 国产福利91精品一区二区三区| 91传媒视频在线观看| 欧美色图一区二区三区| 亚洲电影在线免费观看| 久久99久久精品国产| 欧美国产精品一区二区| 91网站最新网址| www国产成人免费观看视频 深夜成人网| 国产精品成人网| 蜜臀av一级做a爰片久久| 日韩精品一区二区三区丰满| 欧美一区永久视频免费观看| 中文字幕不卡的av| 免费亚洲电影在线| 一本在线高清不卡dvd| 中文字幕在线观看一区| 日韩欧美中文一区二区| 欧美一区永久视频免费观看| 另类专区欧美蜜桃臀第一页| 亚洲综合一区二区三区| 欧美成人三级在线| 一区二区三区**美女毛片| 国产一区二区三区四区五区入口| 国产日韩亚洲精品| 欧美日韩一级二级三级| 日韩av电影天堂| 欧美在线你懂的| 久久国产精品区| 欧美丰满嫩嫩电影| 亚洲午夜久久久久久久久久久| 国产成人免费在线| 精品久久久久久久久久久院品网| 视频在线观看91| 色哟哟一区二区| 九九视频精品免费| 欧美日韩国产另类一区| 国产999精品久久| 欧美亚洲日本国产| 国产成人精品1024| 久久婷婷国产综合精品青草 | 久久精品国产秦先生| 欧美私人免费视频| 国产另类ts人妖一区二区| 日韩电影免费观看高清完整| 亚洲小说欧美激情另类| 色菇凉天天综合网| 国产91富婆露脸刺激对白| 欧美性猛交xxxx黑人交| 国产麻豆视频一区| 国产日韩欧美精品一区| 美女被啪啪一区二区| 亚洲国产电影在线观看| av电影一区二区| 亚洲精品免费在线观看| 国产一区再线| 天堂在线一区二区| 欧美大片在线观看一区| 国产精品1024| 欧美国产一区二区| 懂色一区二区三区av片| 久久婷婷综合激情| 欧美重口乱码一区二区| 另类的小说在线视频另类成人小视频在线| 五月天亚洲综合情| 久久99久久精品欧美| 久久综合999| 一区二区三区观看| 成人av资源下载| 一区二区高清视频在线观看| 欧美xxxx黑人又粗又长密月| 美女爽到高潮91| 中文一区二区在线观看| 在线观看视频欧美| 国产精品伊人日日| 精品一区二区久久| 日韩一区有码在线| 日韩欧美美女一区二区三区| 免费看成人片| 成人av在线影院| 中文字幕av一区二区三区高| 中文字幕日韩一区二区三区| 99r精品视频| 日本aⅴ精品一区二区三区 | 久久99导航| 黄色小说综合网站| 亚洲精品国产高清久久伦理二区| 欧美一级二级三级九九九| 国产高清亚洲一区| 国产亚洲欧美日韩俺去了| 亚洲区一区二区三区| 91网址在线看| 精品一区二区三区在线观看| 国产精品福利一区二区| 日韩亚洲国产中文字幕欧美| 亚洲精品美女久久7777777| 99久久精品无码一区二区毛片| 亚洲美女区一区| 欧美精品一区二区三区四区| 在线观看成人av| 国产成人精品亚洲777人妖| 性欧美疯狂xxxxbbbb| 国产精品丝袜久久久久久app| 日本一区不卡| 精品亚洲国内自在自线福利| 日韩一级视频免费观看在线| 99高清视频有精品视频| 夜夜嗨av一区二区三区中文字幕 | av高清久久久| 久久国产福利国产秒拍| 亚洲一区二区三区中文字幕| 5566中文字幕一区二区电影| 亚洲精品国产精品久久| 久久久久久欧美精品色一二三四| 久久精工是国产品牌吗| 久久久久97国产精华液好用吗| 无码免费一区二区三区免费播放 | 国产精品无人区|