Unity Cloud Build Feature Requests

Starting today the Unity Feedback site has a new category for Unity Cloud Build.

You’ll be able to check this area to see which feature requests are currently popular, and to vote for (or suggest!) the features you care about the most.

Every user receives 10 votes to use, and if there is a feature you REALLY care about you can vote for it up to three times.

You’ll notice that each feature has a status:

  • Active: Any Feedback which is currently not Completed, Declined or Invalid.
  • Under review: We’re considering this feature.
  • Planned: We’ve agreed that this feature should be implemented, and found a place for it on our roadmap
  • Started: We’ve started work on this feature.
  • Completed: This feature is complete.
  • Declined: We’ve considered this feature but decided not to implement it.
  • Invalid: Feedback which was rejected as it does not fit to the Service.

When you’re discussing Cloud Build features on the forum, using Twitter, or anywhere else, try to remember to link to the feature request on the feedback site so that other users will find it and up-vote it! And if someone suggests something brilliant, encourage them to submit it to the feedback site so it can be documented and considered. The Cloud Build team will try to keep the requests updated and will reach out to the person who posted the request if any clarification is necessary.

Thanks to all of you for using the service and being a vocal part of the Cloud Build community. We remain dedicated to helping relieve you of repetitive workflows so you can stay focused on building awesome games!

3 Likes

@David-Berger , the last completed feature is 2 years old, nothing is started, nothing is planned and nothing new is in review.

Are you guys watching the Unity feedback site? Is there any development in cloud build?

3 Likes

@goldbug Thank you for raising this concern. We are always making a conscious effort to respond to our user’s feedback and keep our users up to date with new developments.

Cloud Build is under active development, and most of that effort in recent months has gone into maintaining support for the existing platforms, reducing the error rates (such as the work with teams across Unity on solving the shader compiler errors), and working on a few key new features such as the new deployments service (for which Xiaomi’s Mi Game Center is the first target).

We have still been monitoring and reviewing new feedback items, although it is evident that the Feedback site has not been kept up to date as it should.

2 Likes

Include my template file in the WebGL build, and stop blowing smoke up my ass about hosting. I don’t care about hosting.

1 Like

Instead of waiting for Unity to fix this, I decided to write a workaround myself. This will allow you to use your custom template with cloud build.

Just put this code anywhere in your project (Preferrably under an /Editor folder) and don’t forget to replace the part with your actual template name.

#if UNITY_EDITOR && UNITY_WEBGL
using System.Collections.Generic;
using UnityEngine;
using UnityEditor.Callbacks;
using UnityEditor;
using System.IO;
using System;
using System.Text.RegularExpressions;
using System.Linq;

public class PostProcessWebGL
{
    //The name of the WebGLTemplate. Location in project should be Assets/WebGLTemplates/<YOUR TEMPLATE NAME>
    const string __TemplateToUse = "<YOUR TEMPLATE NAME>";

    [PostProcessBuild]
    public static void ChangeWebGLTemplate(BuildTarget buildTarget, string pathToBuiltProject)
    {
        if (buildTarget != BuildTarget.WebGL) return;


        //create template path
        var templatePath = Paths.Combine(Application.dataPath, "WebGLTemplates", __TemplateToUse);

        //Clear the TemplateData folder, built by Unity.
        FileUtilExtended.CreateOrCleanDirectory(Paths.Combine(pathToBuiltProject, "TemplateData"));

        //Copy contents from WebGLTemplate. Ignore all .meta files
        FileUtilExtended.CopyDirectoryFiltered(templatePath, pathToBuiltProject, true, @".*/\.+|\.meta$", true);

        //Replace contents of index.html
        FixIndexHtml(pathToBuiltProject);
    }

    //Replaces %...% defines in index.html
    static void FixIndexHtml(string pathToBuiltProject)
    {
        //Fetch filenames to be referenced in index.html
        string
            webglBuildUrl,
            webglLoaderUrl;
    
        if (File.Exists(Paths.Combine(pathToBuiltProject, "Build", "UnityLoader.js")))
        {
            webglLoaderUrl = "Build/UnityLoader.js";
        }
        else
        {
            webglLoaderUrl = "Build/UnityLoader.min.js";
        }

        string buildName = pathToBuiltProject.Substring(pathToBuiltProject.LastIndexOf("/") + 1);
        webglBuildUrl = string.Format("Build/{0}.json", buildName);

        //webglLoaderUrl = EditorUserBuildSettings.development? "Build/UnityLoader.js": "Build/UnityLoader.min.js";
        Dictionary<string, string> replaceKeywordsMap = new Dictionary<string, string> {
                {
                    "%UNITY_WIDTH%",
                    PlayerSettings.defaultWebScreenWidth.ToString()
                },
                {
                    "%UNITY_HEIGHT%",
                    PlayerSettings.defaultWebScreenHeight.ToString()
                },
                {
                    "%UNITY_WEB_NAME%",
                    PlayerSettings.productName
                },
                {
                    "%UNITY_WEBGL_LOADER_URL%",
                    webglLoaderUrl
                },
                {
                    "%UNITY_WEBGL_BUILD_URL%",
                    webglBuildUrl
                }
            };

        string indexFilePath = Paths.Combine(pathToBuiltProject, "index.html");
      Func<string, KeyValuePair<string, string>, string> replaceFunction = (current, replace) => current.Replace(replace.Key, replace.Value);
        if (File.Exists(indexFilePath))
        {
          File.WriteAllText(indexFilePath, replaceKeywordsMap.Aggregate<KeyValuePair<string, string>, string>(File.ReadAllText(indexFilePath), replaceFunction));
        }

    }

    private class FileUtilExtended
    {
    
        internal static void CreateOrCleanDirectory(string dir)
        {
            if (Directory.Exists(dir))
            {
                Directory.Delete(dir, true);
            }
            Directory.CreateDirectory(dir);
        }

        //Fix forward slashes on other platforms than windows
        internal static string FixForwardSlashes(string unityPath)
        {
            return ((Application.platform != RuntimePlatform.WindowsEditor) ? unityPath : unityPath.Replace("/", @"\"));
        }



        //Copies the contents of one directory to another.
      public static void CopyDirectoryFiltered(string source, string target, bool overwrite, string regExExcludeFilter, bool recursive)
        {
            RegexMatcher excluder = new RegexMatcher()
            {
                exclude = null
            };
            try
            {
                if (regExExcludeFilter != null)
                {
                    excluder.exclude = new Regex(regExExcludeFilter);
                }
            }
            catch (ArgumentException)
            {
              UnityEngine.Debug.Log("CopyDirectoryRecursive: Pattern '" + regExExcludeFilter + "' is not a correct Regular Expression. Not excluding any files.");
                return;
            }
            CopyDirectoryFiltered(source, target, overwrite, excluder.CheckInclude, recursive);
        }
      internal static void CopyDirectoryFiltered(string sourceDir, string targetDir, bool overwrite, Func<string, bool> filtercallback, bool recursive)
        {
            // Create directory if needed
            if (!Directory.Exists(targetDir))
            {
                Directory.CreateDirectory(targetDir);
                overwrite = false;
            }

            // Iterate all files, files that match filter are copied.
            foreach (string filepath in Directory.GetFiles(sourceDir))
            {
                if (filtercallback(filepath))
                {
                    string fileName = Path.GetFileName(filepath);
                    string to = Path.Combine(targetDir, fileName);

                
                    File.Copy(FixForwardSlashes(filepath),FixForwardSlashes(to), overwrite);
                }
            }

            // Go into sub directories
            if (recursive)
            {
                foreach (string subdirectorypath in Directory.GetDirectories(sourceDir))
                {
                    if (filtercallback(subdirectorypath))
                    {
                        string directoryName = Path.GetFileName(subdirectorypath);
                      CopyDirectoryFiltered(Path.Combine(sourceDir, directoryName), Path.Combine(targetDir, directoryName), overwrite, filtercallback, recursive);
                    }
                }
            }
        }

        internal struct RegexMatcher
        {
            public Regex exclude;
            public bool CheckInclude(string s)
            {
                return exclude == null || !exclude.IsMatch(s);
            }
        }

    }

    private class Paths
    {
        //Combine multiple paths using Path.Combine
        public static string Combine(params string[] components)
        {
            if (components.Length < 1)
            {
                throw new ArgumentException("At least one component must be provided!");
            }
            string str = components[0];
            for (int i = 1; i < components.Length; i++)
            {
                str = Path.Combine(str, components[i]);
            }
            return str;
        }
    }

}

#endif

Good luck!

3 Likes

@ollieblanks
…and a month and a half later still nothing notable has happened

Please find some time to fix all the smaller issues (looking over the feedback site: headless builds, being able to edit signing credentials, more predefined webhook endpoints, svn externals and more) people have been complaining about for YEARS.
It’s just mindboggling why Unity hasn’t invested any time in sorting these sore spots in a otherwise fairly good service ESPECIALLY since cloud build is a fully fledged paid product under Unity Teams now

I don’t need a solution this instant, I just want to see something is happening at least.
Give us a roadmap, update us, tell us what’s going on. Please.

8 Likes

Looks like Unity not working on Unity Cloud anymore. All the same, as it was 2 years ago.

1 Like

Can we please have an option for a public download link for Builds OR if UT fears too much traffic an option to upload ready builds to FTP or Google Faildrive or Dropbox (FTP prefered because pro…) would be awesome.As it looks like the links from the Build success webhook work only for people with a Unity Teams seat/account .
I will recommend you for the Alan Touring avard if you implement a way to share a public link or an upload to an alternate space.
Thanks.

Hi

Firstly, love cloudbuild - it’s a great bit of tech and has saved countless hours :slight_smile:

A couple of feature requests:

1) public sharing links
I think it would be great to be able to manage these separately from the individual builds.

Ideally I’d like to be able to auto-remove links for builds as they move down the build queue (e.g. just keep them for the top X entries).

2) Integrations
(Yeah, I know these are beta)
We have people from our publisher on our slack who don’t have Unity accounts for our project, so it would be awesome if the integration for slack could optionally generate a public sharing link.

I’m sure I could implement these myself with the Unity / Slack webhook APIs but since I think these would be super useful features for lots of people using cloud build I thought I’d mention them here :slight_smile:

1 Like

d’oh! I’ll add this to the actual feature request site. my bad.

1 Like

When a local build is uploaded, send a notification to Slack.
https://feedback.unity3d.com/suggestions/local-build-upload-slack-notification

What about Blender files support? Is it coming some time?

2 Likes

A small one: use a different archive format for desktop platforms other than ZIP.

When processing the result of the build in a continuous deployment system following a build, because the ZIP file format requires the file metadata to be stored at the end of a file instead of at the beginning. This means the entire file must be downloaded to disk to locally process the build. This can be quite costly when the build is several gigabyte while working in a low disk or even diskless environment.

If possible, could we also get the build artifacts uploaded in some other fomat? Either as compressed individual files (w/file hash) or some archive format that supports stream decompression like *.tar.gz.

I would like to request QR Code Image on the Share Page for cloud builds https://feedback.unity3d.com/suggestions/include-qr-code-on-the-share-page

1 Like

This is a perfect feature for us. We have many Android devices for testing. Typing URL or opening URL on all devices is a tedious job. Scanning QR codes save a ton of time.

It would be even more awesome if QR code was visible to anyone and not only members of the cloud service. Eg. Member of SLACK channel (external QA tester) gets notified with new build available and link to download APK. If he doesn’t want to have all testing devices connected to SLACK or manually type the URL, he has to generate his QR code to speed up the process. What do you think about this
@ollieblanks ?

Thanks.

Hey guys!

I often build for iOS TestFlight. It would be handy to have the option to override some “Player Settings” like version # and build # before clean build or build.

This feature would be especially useful if a developer is making commits from Windows. As far as I am aware there is no option to change build number for the iOS target from Windows.

@ollieblanks Please let me know if this is possible or we should find work around.

3 Likes

@ollieblanks Thank you for fixing our account!

Since our account can Auto-Build which is extremely helpful, we suggest that you integrate opt-in delay to auto-build. The reason would be that we push several commits at once yet Unity cloud will only pick up on the first one and initiate the build which takes time. Not having to waste time we have to cancel manually and request to build the last commit manually. Thus it defeats the purpose of Auto-Build.
BTW: We are RAPID PROTOTYPING, so there are several builds to a day.

2 Likes

THANKS GUYS that QR update to the share page is extremely helpful true heroes.

1 Like

@jmanx18 , :slight_smile:

@Snupiman , All of these are great feedback items! Please submit them to the Feedback page to raise awareness with our Product Managers and the community.

  • If you have further feedback you want to submit, please do so here.
  • If you have a support issue with the Cloud Build service, please log a ticket via the Cloud Build section of the Developer Dashboard

Happy building everyone!!

2 Likes

Feature Request: Unity Cloud Build Integration of the AppStore Connect API for pushing iOS cloud builds to TestFlight and for publishing apps later

See App Store Connect API | Apple Developer Documentation

2 Likes