/// <summary> /// To make Getting Started sample as simple as possible all code required for creating and /// displaying an avatar is placed here in a single function. This function is also a good example of how to /// chain asynchronous requests, just like in traditional sequential code. /// </summary> protected virtual IEnumerator GenerateAndDisplayHeadRoutine(byte[] photoBytes, PipelineType pipeline, Action <AsyncRequest> callback = null) { if (avatarProvider == null) { Debug.LogError("avatarProvider null"); yield break; } // Choose all available parameters var parametersRequest = avatarProvider.GetParametersAsync(ComputationParametersSubset.ALL, pipeline); yield return(AwaitRoutine(parametersRequest)); ComputationParameters allParameters = parametersRequest.Result; ComputationParameters parameters = ComputationParameters.Empty; parameters.haircuts = allParameters.haircuts; parameters.blendshapes = allParameters.blendshapes; parameters.modelInfo = allParameters.modelInfo; parameters.modelInfo.hairColor.Value = true; parameters.modelInfo.predictHaircut.Value = true; // generate avatar from the photo and get its code in the Result of request var initializeRequest = avatarProvider.InitializeAvatarAsync(photoBytes, "name", "description", pipeline, parameters); yield return(AwaitRoutine(initializeRequest)); var avatarCode = initializeRequest.Result; var calculateRequest = avatarProvider.StartAndAwaitAvatarCalculationAsync(avatarCode); yield return(AwaitRoutine(calculateRequest)); string avatarName = "Avatar " + System.DateTime.Now.ToString("dd/MM/yy HH:mm:ss"); WriteAvatarNameByCode(avatarCode, avatarName); if (callback != null) { callback.Invoke(calculateRequest); } UpdateAvatarList(); if (!calculateRequest.IsError) { yield return(ShowAvatarByCode(avatarCode)); } else { Debug.LogErrorFormat("Unable to calculate avatar: {0}", avatarName); } }