Search Unity

  1. Unity 2018.3 is now released.
    Dismiss Notice
  2. The Unity Pro & Visual Studio Professional Bundle gives you the tools you need to develop faster & collaborate more efficiently. Learn more.
    Dismiss Notice
  3. We've updated our Terms of Service. Please read our blog post from Unity CTO and Co-Founder Joachim Ante here
    Dismiss Notice
  4. Want to provide direct feedback to the Unity team? Join the Unity Advisory Panel.
    Dismiss Notice
  5. Improve your Unity skills with a certified instructor in a private, interactive classroom. Watch the overview now.
    Dismiss Notice

Unity Cloud Build Feature Requests

Discussion in 'Unity Cloud Build' started by David-Berger, Jun 2, 2015.

  1. David-Berger


    Unity Technologies

    Jul 16, 2014
    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!
    P_Jong and junglemason like this.
  2. goldbug


    Oct 12, 2011
    @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?
    erlioniel likes this.
  3. ollieblanks


    Unity Technologies

    Aug 21, 2017
    @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.
    goldbug likes this.
  4. StaffanEk


    Jul 13, 2012
    Include my template file in the WebGL build, and stop blowing smoke up my ass about hosting. I don't care about hosting.
  5. PlayItSafe_Fries


    Jan 17, 2018
    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 <YOUR TEMPLATE NAME> part with your actual template name.

    Code (CSharp):
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using UnityEditor.Callbacks;
    5. using UnityEditor;
    6. using System.IO;
    7. using System;
    8. using System.Text.RegularExpressions;
    9. using System.Linq;
    11. public class PostProcessWebGL
    12. {
    13.     //The name of the WebGLTemplate. Location in project should be Assets/WebGLTemplates/<YOUR TEMPLATE NAME>
    14.     const string __TemplateToUse = "<YOUR TEMPLATE NAME>";
    16.     [PostProcessBuild]
    17.     public static void ChangeWebGLTemplate(BuildTarget buildTarget, string pathToBuiltProject)
    18.     {
    19.         if (buildTarget != BuildTarget.WebGL) return;
    22.         //create template path
    23.         var templatePath = Paths.Combine(Application.dataPath, "WebGLTemplates", __TemplateToUse);
    25.         //Clear the TemplateData folder, built by Unity.
    26.         FileUtilExtended.CreateOrCleanDirectory(Paths.Combine(pathToBuiltProject, "TemplateData"));
    28.         //Copy contents from WebGLTemplate. Ignore all .meta files
    29.         FileUtilExtended.CopyDirectoryFiltered(templatePath, pathToBuiltProject, true, @".*/\.+|\.meta$", true);
    31.         //Replace contents of index.html
    32.         FixIndexHtml(pathToBuiltProject);
    33.     }
    35.     //Replaces %...% defines in index.html
    36.     static void FixIndexHtml(string pathToBuiltProject)
    37.     {
    38.         //Fetch filenames to be referenced in index.html
    39.         string
    40.             webglBuildUrl,
    41.             webglLoaderUrl;
    43.         if (File.Exists(Paths.Combine(pathToBuiltProject, "Build", "UnityLoader.js")))
    44.         {
    45.             webglLoaderUrl = "Build/UnityLoader.js";
    46.         }
    47.         else
    48.         {
    49.             webglLoaderUrl = "Build/UnityLoader.min.js";
    50.         }
    52.         string buildName = pathToBuiltProject.Substring(pathToBuiltProject.LastIndexOf("/") + 1);
    53.         webglBuildUrl = string.Format("Build/{0}.json", buildName);
    55.         //webglLoaderUrl = EditorUserBuildSettings.development? "Build/UnityLoader.js": "Build/UnityLoader.min.js";
    56.         Dictionary<string, string> replaceKeywordsMap = new Dictionary<string, string> {
    57.                 {
    58.                     "%UNITY_WIDTH%",
    59.                     PlayerSettings.defaultWebScreenWidth.ToString()
    60.                 },
    61.                 {
    62.                     "%UNITY_HEIGHT%",
    63.                     PlayerSettings.defaultWebScreenHeight.ToString()
    64.                 },
    65.                 {
    66.                     "%UNITY_WEB_NAME%",
    67.                     PlayerSettings.productName
    68.                 },
    69.                 {
    70.                     "%UNITY_WEBGL_LOADER_URL%",
    71.                     webglLoaderUrl
    72.                 },
    73.                 {
    74.                     "%UNITY_WEBGL_BUILD_URL%",
    75.                     webglBuildUrl
    76.                 }
    77.             };
    79.         string indexFilePath = Paths.Combine(pathToBuiltProject, "index.html");
    80.       Func<string, KeyValuePair<string, string>, string> replaceFunction = (current, replace) => current.Replace(replace.Key, replace.Value);
    81.         if (File.Exists(indexFilePath))
    82.         {
    83.           File.WriteAllText(indexFilePath, replaceKeywordsMap.Aggregate<KeyValuePair<string, string>, string>(File.ReadAllText(indexFilePath), replaceFunction));
    84.         }
    86.     }
    88.     private class FileUtilExtended
    89.     {
    91.         internal static void CreateOrCleanDirectory(string dir)
    92.         {
    93.             if (Directory.Exists(dir))
    94.             {
    95.                 Directory.Delete(dir, true);
    96.             }
    97.             Directory.CreateDirectory(dir);
    98.         }
    100.         //Fix forward slashes on other platforms than windows
    101.         internal static string FixForwardSlashes(string unityPath)
    102.         {
    103.             return ((Application.platform != RuntimePlatform.WindowsEditor) ? unityPath : unityPath.Replace("/", @"\"));
    104.         }
    108.         //Copies the contents of one directory to another.
    109.       public static void CopyDirectoryFiltered(string source, string target, bool overwrite, string regExExcludeFilter, bool recursive)
    110.         {
    111.             RegexMatcher excluder = new RegexMatcher()
    112.             {
    113.                 exclude = null
    114.             };
    115.             try
    116.             {
    117.                 if (regExExcludeFilter != null)
    118.                 {
    119.                     excluder.exclude = new Regex(regExExcludeFilter);
    120.                 }
    121.             }
    122.             catch (ArgumentException)
    123.             {
    124.               UnityEngine.Debug.Log("CopyDirectoryRecursive: Pattern '" + regExExcludeFilter + "' is not a correct Regular Expression. Not excluding any files.");
    125.                 return;
    126.             }
    127.             CopyDirectoryFiltered(source, target, overwrite, excluder.CheckInclude, recursive);
    128.         }
    129.       internal static void CopyDirectoryFiltered(string sourceDir, string targetDir, bool overwrite, Func<string, bool> filtercallback, bool recursive)
    130.         {
    131.             // Create directory if needed
    132.             if (!Directory.Exists(targetDir))
    133.             {
    134.                 Directory.CreateDirectory(targetDir);
    135.                 overwrite = false;
    136.             }
    138.             // Iterate all files, files that match filter are copied.
    139.             foreach (string filepath in Directory.GetFiles(sourceDir))
    140.             {
    141.                 if (filtercallback(filepath))
    142.                 {
    143.                     string fileName = Path.GetFileName(filepath);
    144.                     string to = Path.Combine(targetDir, fileName);
    147.                     File.Copy(FixForwardSlashes(filepath),FixForwardSlashes(to), overwrite);
    148.                 }
    149.             }
    151.             // Go into sub directories
    152.             if (recursive)
    153.             {
    154.                 foreach (string subdirectorypath in Directory.GetDirectories(sourceDir))
    155.                 {
    156.                     if (filtercallback(subdirectorypath))
    157.                     {
    158.                         string directoryName = Path.GetFileName(subdirectorypath);
    159.                       CopyDirectoryFiltered(Path.Combine(sourceDir, directoryName), Path.Combine(targetDir, directoryName), overwrite, filtercallback, recursive);
    160.                     }
    161.                 }
    162.             }
    163.         }
    165.         internal struct RegexMatcher
    166.         {
    167.             public Regex exclude;
    168.             public bool CheckInclude(string s)
    169.             {
    170.                 return exclude == null || !exclude.IsMatch(s);
    171.             }
    172.         }
    174.     }
    176.     private class Paths
    177.     {
    178.         //Combine multiple paths using Path.Combine
    179.         public static string Combine(params string[] components)
    180.         {
    181.             if (components.Length < 1)
    182.             {
    183.                 throw new ArgumentException("At least one component must be provided!");
    184.             }
    185.             string str = components[0];
    186.             for (int i = 1; i < components.Length; i++)
    187.             {
    188.                 str = Path.Combine(str, components[i]);
    189.             }
    190.             return str;
    191.         }
    192.     }
    194. }
    196. #endif
    Good luck!
    technicat likes this.
  6. iMer


    May 21, 2013
    ..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.
    Immu, thibouf, mmortall and 5 others like this.
  7. mmortall


    Dec 28, 2010
    Looks like Unity not working on Unity Cloud anymore. All the same, as it was 2 years ago.
    StaffanEk likes this.
  8. Karsten


    Apr 8, 2012
    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.
  9. darbotron


    Aug 9, 2010

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

    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 :)
    Last edited: Sep 14, 2018
    ollieblanks likes this.
  10. darbotron


    Aug 9, 2010
    d'oh! I'll add this to the actual feature request site. my bad.
    ollieblanks likes this.
  11. TanselAltinel


    Jan 7, 2015
  12. FMaroy


    Oct 8, 2015
    What about Blender files support? Is it coming some time?
  13. james7132


    Mar 6, 2015
    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.
  14. jmanx18


    Feb 6, 2013