Announcement

Collapse
No announcement yet.

Unreal Engine 4 is available for Win10 UWP app dev now

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

    Originally posted by jsyarrow View Post
    [MENTION=24297]PhilMaguire[/MENTION] - The UWPDeviceDetector module that's failing is a little special in that it takes a dependency on a Win10 SDK winmd component (Windows:evices::Enumeration:eviceWatcher) in order to locate UWP devices on your local network (for e.g. in-editor deployment to an Xbox). Do you have the Windows 10 SDK installed (for VS2015, I'd recommend 14393)? If so, my only other thought is that maybe there's an incompatibility between SNDBS and use of winmd - that's not something I've tried. If necessary you can turn off use of winmd components in the editor via the branch-specific config variable bUseWindowsSDK10ForEditor (goes in the /Script/WindowsTargetPlatform.WindowsTargetSettings section, set it to false). But you might quickly run into similar issues with the UWP builds themselves.
    [MENTION=494622]jsyarrow[/MENTION] thank you for the advice. I disabled my SN-DBS service and now have an editor build. I can't package the UWP configuration due to our FMOD plugin not having been built to be UWP compatible. I will have to get in touch with them to get that resolved I expect

    Comment


      [MENTION=828801]Sparkash[/MENTION] - There's a NuGet reference in UWP.Automation.csproj - we use the Windows Device Portal Wrapper (source here) to assist with deploy and launch on remote UWP devices. If you haven't built that project in VS at least once then the reference may not have been resolved and downloaded. Once the necessary assembly is in place you should be able to package in the editor. (I'm going to try to move the resolution step into Setup.bat when I get a chance.)
      I grabbed that project, and built both the 'WindowDevicePortalWrapper' and the 'WindowDevicePortalWrapper.UniversalWindows' projects in it (in both debug and release), but I'm still getting the error.
      Any other ideas?

      Comment


        [MENTION=494622]jsyarrow[/MENTION] - It does appear that WindowsExports.TryGetVSInstallDir did fix my packaging problem. Thank you for that.

        Secondly, as expected, I am able to instantiate the LeaderboardQuery and the call to StatisticsManager::GetLeaderboard does return with an StatisticEventType::GetLeaderboardComplete:

        Code:
        LeaderboardQuery^ Query = ref new LeaderboardQuery();
        Query->SkipResultToMe = true;
        Query->MaxItems = 100;
        Query->Order = SortOrder::Descending;
        mgr->GetLeaderboard(LiveContext->User, StatName, Query);
        How do I go about getting the Leaderboard stats after GetLeaderboardComplete is returned?

        Code:
        void FOnlineLeaderboardsLive::Tick(float DeltaTime)
        {
            StatisticManager^ mgr = Microsoft::Xbox::Services::Statistics::Manager::StatisticManager::SingletonInstance;
            if (mgr != nullptr)
            {
                auto EventList = mgr->DoWork();
                for (StatisticEvent^ Event : EventList)
                {
                    if (Event->ErrorCode != 0)
                    {
                        UE_LOG_ONLINE(Warning, TEXT("DoWork error: %s"), Event->ErrorMessage->Data());
                    }
        
                    StatisticEventArgs^ args;
        
                    switch (Event->EventType)
                    {
                        case StatisticEventType::LocalUserAdded:
                            UE_LOG_ONLINE(Warning, TEXT("DoWork LocalUserAdded: %s"), Event->User->Gamertag->ToString());
                            break;
        
                        case StatisticEventType::LocalUserRemoved:
                            UE_LOG_ONLINE(Warning, TEXT("DoWork LocalUserRemoved: %s"), Event->User->Gamertag->ToString());
                            break;
        
                        case StatisticEventType::GetLeaderboardComplete:
                            UE_LOG_ONLINE(Warning, TEXT("DoWork GetLeaderboardComplete: %s"), Event->User->Gamertag->ToString());
                            args = Event->EventArgs;
        
                            IVectorView<Platform::String^>^ stats = mgr->GetStatisticNames(Event->User);
                            for (Platform::String^ stat : stats)
                            {
                                UE_LOG_ONLINE(Warning, TEXT("DoWork Stat: %s"), stat->ToString());
                            }
                            break;
        
                        case StatisticEventType::StatisticUpdateComplete:
                            UE_LOG_ONLINE(Warning, TEXT("DoWork StatisticUpdateComplete: %s"), Event->User->Gamertag->ToString());
                            args = Event->EventArgs;
                            break;
                    }
                }
            }
        }

        Finally, is there a way to determine if a User has already been added to the StatisticManager::AddLocalUser(LiveContext->User)?

        Code:
        try
        {
            mgr->AddLocalUser(LiveContext->User);
        }
        Last edited by Jerry.Richards; 07-12-2017, 12:50 PM.

        Comment


          Originally posted by Sparkash View Post
          I grabbed that project, and built both the 'WindowDevicePortalWrapper' and the 'WindowDevicePortalWrapper.UniversalWindows' projects in it (in both debug and release), but I'm still getting the error.
          Any other ideas?
          I realize my original advice was very poorly worded

          What I meant to say was that you should manually build the UWP.Automation.csproj within the Visual Studio solution for UE4. With default settings that will pull down the NuGet package for the device portal, which should resolve your error.

          Alternatively, again within the Visual Studio UE4 solution, you can right-click the solution root and hit 'Restore NuGet packages'.

          The link to the device portal source was really just in case you were interested in what this thing we needed actually was. You shouldn't ever need to clone it if you don't want to.

          Comment


            Originally posted by Jerry.Richards View Post
            How do I go about getting the Leaderboard stats after GetLeaderboardComplete is returned?
            The event you get back from DoWork carries the leaderboard data. So it should be something like
            Code:
            using namespace Microsoft::Xbox::Services::Statistic::Manager;
            using namespace Microsoft::Xbox::Services::Leaderboard;
            
            LeaderboardResultEventArgs^ LbResultEventArgs = safe_cast<LeaderboardResultEventArgs^>(Event->EventArgs);
            LeaderboardResult^ LbResult = LbResultEventArgs->Result;
            
            for (LeaderboardRow^ Row : LbResult->Rows)
            {
            	FString RowText = FString::Printf(TEXT("Leaderboard row: User %s, Stats "), Row->Gamertag->Data());
            	for (int32 i = 0; i < Row->Values->Size; ++i)
            	{
            		RowText.Append(FString::Printf(TEXT("(%s : %s) "), LbResult->Columns->GetAt(i)->DisplayName->Data(), Row->Values->GetAt(i)->Data()));
            	}
            
            	UE_LOG_ONLINE(Warning, *RowText);
            }
            ...though once again that's code that has never been anywhere near a compiler.

            Source for the types in the Microsoft::Xbox::Services::Leaderboard namespace is here.

            Originally posted by Jerry.Richards View Post
            Finally, is there a way to determine if a User has already been added to the StatisticManager::AddLocalUser(LiveContext->User)?
            Other than catching the exception for a double add, no. You should consider tracking this in your own code.

            Comment


              Originally posted by jsyarrow View Post
              The event you get back from DoWork carries the leaderboard data. So it should be something like
              Code:
              using namespace Microsoft::Xbox::Services::Statistic::Manager;
              using namespace Microsoft::Xbox::Services::Leaderboard;
              
              LeaderboardResultEventArgs^ LbResultEventArgs = safe_cast<LeaderboardResultEventArgs^>(Event->EventArgs);
              LeaderboardResult^ LbResult = LbResultEventArgs->Result;
              
              for (LeaderboardRow^ Row : LbResult->Rows)
              {
              	FString RowText = FString::Printf(TEXT("Leaderboard row: User %s, Stats "), Row->Gamertag->Data());
              	for (unsigned int i = 0; i < Row->Values->Size; ++i)
              	{
              		RowText.Append(FString::Printf(TEXT("(%s : %s) "), LbResult->Columns->GetAt(i)->DisplayName->Data(), Row->Values->GetAt(i)->Data()));
              	}
              
              	UE_LOG_ONLINE(Warning, *RowText);
              }
              Well that helped quite a bit. . .and seems to show an update problem:

              Click image for larger version

Name:	MissingKeyValuePair.jpg
Views:	1
Size:	128.6 KB
ID:	1131009


              Is the Key ("HighScore") missing then?

              Comment


                [MENTION=494622]jsyarrow[/MENTION] - I modified the above code some and discovered that the statName is NULL:

                Code:
                LeaderboardResultEventArgs^ LbResultEventArgs = safe_cast<LeaderboardResultEventArgs^>(Event->EventArgs);
                LeaderboardResult^ LbResult = LbResultEventArgs->Result;
                
                for (LeaderboardRow^ Row : LbResult->Rows)
                {
                    FString RowText = FString::Printf(TEXT("Leaderboard row: User %s, Stats "), Row->Gamertag->Data());
                    for (unsigned int i = 0; i < Row->Values->Size; ++i)
                   {
                        LeaderboardColumn^ statCol = LbResult->Columns->GetAt(i);
                        Platform::String^ statName = LbResult->Columns->GetAt(i)->DisplayName;
                
                         RowText.Append(FString::Printf(TEXT("(%s : %s) "), LbResult->Columns->GetAt(i)->DisplayName->Data(), Row->Values->GetAt(i)->Data()));
                    }
                }

                Click image for larger version

Name:	NullStatName.jpg
Views:	1
Size:	149.9 KB
ID:	1131010


                And yes, the score is correct: 932
                Last edited by Jerry.Richards; 07-12-2017, 02:01 PM.

                Comment


                  [MENTION=494622]jsyarrow[/MENTION]
                  Thanks for clearing it up. Unfortunately I get the same errors when attempting to build UWP.Automation within Visual Studio.
                  When I manage NuGet packages, I can see that 'WindowsDevicePortalWrapper' is installed. It was originally on the 0.9.4 (beta) version, so I updated to 0.9.5, but that didn't seem to make a difference.

                  Comment


                    Originally posted by Sparkash View Post
                    [MENTION=494622]jsyarrow[/MENTION]
                    Thanks for clearing it up. Unfortunately I get the same errors when attempting to build UWP.Automation within Visual Studio.
                    When I manage NuGet packages, I can see that 'WindowsDevicePortalWrapper' is installed. It was originally on the 0.9.4 (beta) version, so I updated to 0.9.5, but that didn't seem to make a difference.
                    That's odd. Can you see where WindowsDevicePortalWrapper.dll lands after the NuGet install? The project expects to be able to locate it in [Enlistment_Root]/Packages/WindowsDevicePortalWrapper.0.9.4.1-beta/lib/net452/ which should have been the default location for the 0.9.4 (beta) version.

                    Comment


                      [MENTION=494622]jsyarrow[/MENTION] - do you have any suggestions for the NULL stat name being returned in the LeaderboardRow?

                      Comment


                        Originally posted by Jerry.Richards View Post
                        [MENTION=494622]jsyarrow[/MENTION] - do you have any suggestions for the NULL stat name being returned in the LeaderboardRow?
                        I'm afraid anything at the moment is just guessing since I haven't had a chance to play with this myself. Is the StatisticName property also null? Does the DisplayName property on the LeaderboardResult itself (not the LeaderboardColumn) contain a valid string that you recognize?

                        Comment


                          The .dll was present. I removed and reinstalled WindowsDevicePortalWrapper back to the 0.9.4 version, and now I can build. Progress!

                          Unfortunately when I try to install the package I get this error -

                          Code:
                          Deployment Add operation with target volume C: on Package Game_1.0.0.0_x64__a78hwt03br9rj from:  (Game.appx)  failed with error 0x80070070. See http://go.microsoft.com/fwlink/?LinkId=235160 for help diagnosing app deployment issues.
                          I checked out that link, but the specific error code raised isn't detailed.

                          Comment


                            Originally posted by Sparkash View Post
                            I checked out that link, but the specific error code raised isn't detailed.
                            Since that HRESULT begins 8007 the low-order short is a traditional Win32 error code which you can find in winerror.h (or on MSDN, e.g. here
                            ). In this case, 0x70 is ERROR_DISK_FULL.

                            If you have another drive with more space you can change where new apps are installed in the Settings app (System->Storage->Change where new content is saved).

                            Comment


                              Thanks, that sorted it. Much appreciated!

                              Comment


                                Originally posted by jsyarrow View Post
                                I'm afraid anything at the moment is just guessing since I haven't had a chance to play with this myself. Is the StatisticName property also null? Does the DisplayName property on the LeaderboardResult itself (not the LeaderboardColumn) contain a valid string that you recognize?
                                Actually it was my mistake, I was confusing DisplayName with StatisticName

                                DisplayName was returned as a null. Now, unfortunately, I am not getting any results back from the server so I can't test my fix:

                                Code:
                                                case StatisticEventType::GetLeaderboardComplete:
                                                {
                                                    UE_LOG_ONLINE(Warning, TEXT("DoWork GetLeaderboardComplete: %s"), Event->User->Gamertag->ToString()->Data());
                                
                                                    LeaderboardResultEventArgs^ LbResultEventArgs = safe_cast<LeaderboardResultEventArgs^>(Event->EventArgs);
                                                    LeaderboardResult^ LbResult = LbResultEventArgs->Result;
                                
                                                    // how many columns are there? 1?
                                                    LeaderboardColumn^ lbCol = LbResult->Columns->GetAt(0);
                                                    Platform::String^ displayName = lbCol->DisplayName;
                                                    Platform::String^ statName = lbCol->StatisticName;
                                
                                                    for (LeaderboardRow^ Row : LbResult->Rows)
                                                    {
                                                        FString RowText = FString::Printf(TEXT("Leaderboard row: User %s, Stats "), Row->Gamertag->Data());
                                
                                                        for (unsigned int i = 0; i < Row->Values->Size; ++i)
                                                        {
                                                            Platform::String^ statValue = Row->Values->GetAt(i);
                                
                                                            RowText.Append(FString::Printf(TEXT("(%s : %s) "), statName->Data(), statValue->Data()));
                                                        }
                                
                                                        UE_LOG_ONLINE(Warning, *RowText);
                                                    }
                                                }
                                                break;
                                Last edited by Jerry.Richards; 07-13-2017, 03:29 PM.

                                Comment

                                Working...
                                X