tag:blogger.com,1999:blog-40620781208740504532024-03-18T02:48:44.592-07:00Kittehface SoftwareGames, Android live wallpapers and other fun stuff.Jeremy Statzhttp://www.blogger.com/profile/10803766425905048525noreply@blogger.comBlogger526125tag:blogger.com,1999:blog-4062078120874050453.post-27502179182346710092024-01-10T14:50:00.001-08:002024-01-10T14:50:12.922-08:00Unity Addressables Content Catalog Refresh<p> We're using Unity's Addressables to implement DLC for a multi-platform game, and on certain platforms, we don't actually know the path to the DLC until after it's loaded, which could be some time after the game has started. One method is to use a multiple catalog system, like <a href="https://github.com/juniordiscart/com.unity.addressables" target="_blank">this one</a> developed by LuGus-Jan and pdinklag. In our case, though, we wanted to stick to a single catalog system if at all possible, and we were able to come up with a way to refresh the Addressables content catalog at runtime, though normally Unity does it once when the game starts up. The code is written against Unity Addressables 1.19.19.</p><p><a href="https://gist.github.com/JBurkeKF/7d8d06ad0b4dafa15ec3fedc34df376e" target="_blank">Refresh Addressables Content Catalog</a></p><p>The Addressables system allows you to specify code to dynamically construct load paths at runtime, but those paths are resolved to strings during the initial content catalog load, and take whatever value the code returns at that point. Using this refresh operation, we can update the return value for the DLC path later while the game is running, and then force the Addressables system to re-resolve the paths to their correct values. Addressables can then be accessed from the DLC as expected.</p><p>The public method for loading an Addressables content catalog is made assuming that data is being downloaded from the internet, and so includes an automatic caching feature to avoid redundant downloads. However, the feature involves writing to <span style="font-family: courier;">Application.persistentDataPath</span>, which is not allowed on some platforms. For those cases, there is an alternate version that uses .NET reflection to access the internal methods and duplicate the same process, but avoid the step of reading and writing to the cache. This may need to be revised with future versions of the Unity Addressables package.</p>Joel Burkehttp://www.blogger.com/profile/13498348776664808746noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-63204962742105904652024-01-10T14:50:00.000-08:002024-01-10T14:50:05.433-08:00Unity Addressables Per-Platform Group SettingsWhile developing a project for multiple platforms, we've encountered issues where the recommended packing settings for Addressable Groups differs, particularly when it comes to compression. Some platforms don't natively compress the final package, so it's useful to compress the Addressable packed assets to keep the overall file size down. Other platforms have recommended packing settings to help with patching. In some cases, having uncompressed Addressable packed assets is ideal for patching. There's currently no way of specifying different packing settings per platform (as of Unity Addressables 1.19.19). Unity is <a href="https://forum.unity.com/threads/addressable-per-platform-asset-group-setting.1264907/#post-8068076" target="_blank">aware of the need for this</a>, but we have not seen any public progress on it.<div><br /></div><div>In the mean time, we've come up with a relatively straightforward way to handle this situation so that we don't have to manually change settings when switching platforms. In short, we have a new Addressable Group schema to apply where we can specify overrides for particular packing settings per platform, and a new Addressables build script that looks for this schema and replaces the actual packed schema with the overrides, if appropriate.</div><div><br /></div><div>The code is <a href="https://gist.github.com/JBurkeKF/99fc5427cb90a693af46dcbc0900c5d5" target="_blank">available here</a>.</div><div><br /></div><div>In addition to the code, there are several more manual steps that need to be taken before things become fully automated.</div><div><ol style="text-align: left;"><li>Create a new PlatformBuildScriptPackedMode Addressable Data Builder and (ideally) place it in <span style="font-family: courier;">Assets/AddressableAssetsData/DataBuilders</span>.<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgwYKW0Pc3oszCDILH8V6I-KKtTzPV1qyPEMByWrCHjm2f2VFdTmknlwL_125ohegOOqy8W2kA-rk_TAgfwaZWC_sCPLBBXYCxTzxUICCAX-c_n3_68piRCU69h1PYYQ9aFlk9oskkzFjTtYYidhV4VvfdjlmZ-f4L_dbPsOQJw52HIuDG8boEUMbRxUTM" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="283" data-original-width="1039" height="87" src="https://blogger.googleusercontent.com/img/a/AVvXsEgwYKW0Pc3oszCDILH8V6I-KKtTzPV1qyPEMByWrCHjm2f2VFdTmknlwL_125ohegOOqy8W2kA-rk_TAgfwaZWC_sCPLBBXYCxTzxUICCAX-c_n3_68piRCU69h1PYYQ9aFlk9oskkzFjTtYYidhV4VvfdjlmZ-f4L_dbPsOQJw52HIuDG8boEUMbRxUTM" width="320" /></a></div></li><li><div class="separator" style="clear: both; text-align: left;">Register this new Addressable Data Builder with the Addressables Settings. In your Addressable Asset Settings, add the new PlatformBuildScriptPackedMode asset to the list of "Build and Play Mode Scripts".<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiUux4HZfM2FLTPrRn6ZHGW4FO-GNcuXrUG06tKWigOFQmoxen5iR6iib9nQYdl40SMA5RzWbZtRJsyw0BXeg0zSijnfhDIExDBjKiT6_OBOFiLTZZ2bGVCZTSa-GCDQ8xGvHKSzRRsBb4xDfvhejoMt0bYbB_rQ-wx7wcVQf4wefL5pPm0B7FHeqLaEnk" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="181" data-original-width="565" height="103" src="https://blogger.googleusercontent.com/img/a/AVvXsEiUux4HZfM2FLTPrRn6ZHGW4FO-GNcuXrUG06tKWigOFQmoxen5iR6iib9nQYdl40SMA5RzWbZtRJsyw0BXeg0zSijnfhDIExDBjKiT6_OBOFiLTZZ2bGVCZTSa-GCDQ8xGvHKSzRRsBb4xDfvhejoMt0bYbB_rQ-wx7wcVQf4wefL5pPm0B7FHeqLaEnk" width="320" /></a></div><br /></div></li><li><div class="separator" style="clear: both; text-align: left;">Now go to individual Addressable Groups and add the new PlatformBundledAssetGroupSchema to each Group that needs an override.<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEixfwx8EUyknE0oFygiQl-UUEJ1ZEolSixeo-xzncNue9Thj8R4I0buAlt0VzzMOnagTqM-Z43qI7XEBNMrc4_k3E1L4Lu1F18AtCcSyE4vfhfP47QnuLKv5ai1Rrm5aP7M3e6oCB3vnJ5RsfPdJpPhv1lOELceQ-gV2AdnjT9ImqZnTQ4O3dtFYNGa6cY" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="672" data-original-width="678" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEixfwx8EUyknE0oFygiQl-UUEJ1ZEolSixeo-xzncNue9Thj8R4I0buAlt0VzzMOnagTqM-Z43qI7XEBNMrc4_k3E1L4Lu1F18AtCcSyE4vfhfP47QnuLKv5ai1Rrm5aP7M3e6oCB3vnJ5RsfPdJpPhv1lOELceQ-gV2AdnjT9ImqZnTQ4O3dtFYNGa6cY" width="242" /></a></div><br /></div></li><li><div class="separator" style="clear: both; text-align: left;">To actually build correctly, you need to select the new Platform Build Script Packed Mode builder from the Addressables build menu.<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjNg1mtQPRhgSO2Tn5VAi7krqbWPfFSHaJCWsK1QrRRBF7-MqXcBEHQ2HXwodLO7iyS52al7x2UK-WivJi5Q5kgEXt9Nzyvb50KEupVt0EXoYtZawASqfdHQg_FM6KzqHgqE8NFKkLkjtGLBm9YXLhD9CZR33PB98VCtr-iiuVdpiYk2BhLUM4PQ9v-cdY" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="117" data-original-width="841" height="45" src="https://blogger.googleusercontent.com/img/a/AVvXsEjNg1mtQPRhgSO2Tn5VAi7krqbWPfFSHaJCWsK1QrRRBF7-MqXcBEHQ2HXwodLO7iyS52al7x2UK-WivJi5Q5kgEXt9Nzyvb50KEupVt0EXoYtZawASqfdHQg_FM6KzqHgqE8NFKkLkjtGLBm9YXLhD9CZR33PB98VCtr-iiuVdpiYk2BhLUM4PQ9v-cdY" width="320" /></a></div><br /></div></li></ol><div style="text-align: left;">This should cover all the basics for using the platform overrides. If you want to automate builds and select the proper builder, we recommend following <a href="https://forum.unity.com/threads/automate-build-w-custom-addressables-build-script-ie-variation-in-example-repo.1073480/#post-6944516" target="_blank">this example from Unity</a>.</div></div><div style="text-align: left;"><br /></div><div style="text-align: left;">You can add more platforms as needed when you use the code, as well as more overrides for your specific use case. Right now, this schema does not support multi-editing, though that would be a very useful feature for future development.</div>Joel Burkehttp://www.blogger.com/profile/13498348776664808746noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-37645708778634062642023-12-08T11:27:00.000-08:002023-12-08T11:27:13.316-08:00Unity TextMesh Pro Font Disappearing at High Resolution<p> We encountered a problem recently where our TextMesh Pro text was failing to render when our Unity game ran at 4k resolution. We spent a long time trying to track down the issue. Eventually, we noticed we could reproduce it in the editor just by zooming in close enough to the text.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjh2F4qzKQ-9BvfOloC4mn6oP-BHGDQlEdSy55GMlbJ1BQDptJO79XeQBesoBFxD4cVw8H__fIw7ysSlsDvZhyXk6-Hm41HdINajn7uiRkV31aCEAVBBkjqRKxzVkZJc1dOSZmtmKk5nV9hCQo9PKYuuKGvvRAxAE7ojiH0yeqtNaPStjm0PmXL7oYM_NU" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="516" data-original-width="415" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEjh2F4qzKQ-9BvfOloC4mn6oP-BHGDQlEdSy55GMlbJ1BQDptJO79XeQBesoBFxD4cVw8H__fIw7ysSlsDvZhyXk6-Hm41HdINajn7uiRkV31aCEAVBBkjqRKxzVkZJc1dOSZmtmKk5nV9hCQo9PKYuuKGvvRAxAE7ojiH0yeqtNaPStjm0PmXL7oYM_NU" width="193" /></a></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">After fiddling with many settings, we discovered the culprit was the material "softness" value. If we accidentally set it to a negative value, the text would behave incorrectly. This is an issue with the TextMeshPro/Distance Field shader, but the TextMeshPro/Mobile/Distance Field shader has the softness value restricted to positive numbers.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgAymKtW_AZK6NKzf2C47HzOrQE7yNUsZ9ZYFjjvvkiS5FZOTXAU_xZ20oXItZFrsgnPItoisW88XPq3QrFzH52LYwmCbkoeRvWGIXpZOtZLu8BzGbLEyhwPwrCcdD0SiHrwyfLztaXaodxdLwxT1BBWoOmlZMKxGpZhl7fteKcJE5mN9xYDZ50xsO7VVw" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="481" data-original-width="644" height="239" src="https://blogger.googleusercontent.com/img/a/AVvXsEgAymKtW_AZK6NKzf2C47HzOrQE7yNUsZ9ZYFjjvvkiS5FZOTXAU_xZ20oXItZFrsgnPItoisW88XPq3QrFzH52LYwmCbkoeRvWGIXpZOtZLu8BzGbLEyhwPwrCcdD0SiHrwyfLztaXaodxdLwxT1BBWoOmlZMKxGpZhl7fteKcJE5mN9xYDZ50xsO7VVw" width="320" /></a></div><br />We did eventually find a <a href="https://forum.unity.com/threads/should-softness-not-scale-with-font-size.659395/#post-4415380" target="_blank">Unity forum post</a> that discusses this issue, but it took a while to track down, so we wanted to bring it up here in case anyone else is affected.</div><p>While this issue is indeed fixed in more recent versions of TextMesh Pro, it is worth noting that if you upgrade your TextMesh Pro package, it will not automatically update your TextMesh Pro Essential Resources, which is where the bug is present.</p><br /><p></p>Joel Burkehttp://www.blogger.com/profile/13498348776664808746noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-11437593035907765022023-10-25T17:53:00.009-07:002023-10-25T18:04:28.777-07:00Stray Souls!<p>Just in time for Halloween, Stray Souls is available now, on <a href="https://store.steampowered.com/app/1807210/Stray_Souls/">Steam</a>, <a href="https://www.xbox.com/en-US/games/store/stray-souls/9NJ6LB1R5N0Q">Xbox</a>, and <a href="https://store.playstation.com/en-us/concept/10004938">PlayStation</a>!</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv97b7FGLUtxyWEEbCB71RIgMEPswlMkDjmvpEnddBv3zI6SK-4WiDMIc_pyKLuEUgMdeDoEPrp6e7LWsYux-7T9EjArzJhlOhoB4GsjkTShzt0_zEDOTjGnxMyhdXnGUk53tT7yC9-1uIlQABst_Uq6otx6PYCndUOqehF8o6mqA72FrIt2jRqH2fkvo/s1024/Stray%20Souls.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv97b7FGLUtxyWEEbCB71RIgMEPswlMkDjmvpEnddBv3zI6SK-4WiDMIc_pyKLuEUgMdeDoEPrp6e7LWsYux-7T9EjArzJhlOhoB4GsjkTShzt0_zEDOTjGnxMyhdXnGUk53tT7yC9-1uIlQABst_Uq6otx6PYCndUOqehF8o6mqA72FrIt2jRqH2fkvo/w400-h300/Stray%20Souls.png" width="400" /></a></div><p>Stray Souls is an Unreal 5 based horror game inspired by titles like Silent Hill, and is an atmospheric experience that any fan of the genre should check out. We helped with optimization, menu and UI, and handled all the platform work!</p>Jeremy Statzhttp://www.blogger.com/profile/10803766425905048525noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-38959747567598860722023-10-01T18:02:00.001-07:002023-10-25T18:04:17.095-07:00Trepang2!<p>It's been a while since our last post, but we've kept busy! Trepang2 is an awesome, F.E.A.R. inspired action-shooter that's available now on <a href="https://www.xbox.com/en-US/games/store/trepang2/9ncdmpcpdtqf">Xbox</a> and <a href="https://store.playstation.com/en-us/concept/10007968">Playstation</a>!</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2M_SE1T6a7ZpD0ntR9fYn-ZJhbjBFo22OZYFmM1RsqiRsKx6RNFnfyxA-eyamKjjr1RGl8rDJB4XSKZq46KYKHJr4A1OlZDHhlToYiWZXeZS-QPwkkpWbYamKGMVDiJciea51UKIZQZbzziM2fEFNZZBr91lfmdTDFNC8wM6Q3_LYwX80O62fTDYa7f4/s616/capsule_616x353.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="353" data-original-width="616" height="229" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2M_SE1T6a7ZpD0ntR9fYn-ZJhbjBFo22OZYFmM1RsqiRsKx6RNFnfyxA-eyamKjjr1RGl8rDJB4XSKZq46KYKHJr4A1OlZDHhlToYiWZXeZS-QPwkkpWbYamKGMVDiJciea51UKIZQZbzziM2fEFNZZBr91lfmdTDFNC8wM6Q3_LYwX80O62fTDYa7f4/w400-h229/capsule_616x353.jpg" width="400" /></a></div><p>A mysterious super-soldier with no memory of his past braves both technological and supernatural enemies as he searches for the truth. Slow down time and shoot your way through battles with a million particle effects flying all over the place! We helped with optimization and handled the console versions of this excellent fast-action title.</p>Jeremy Statzhttp://www.blogger.com/profile/10803766425905048525noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-69146373262718374502023-02-14T07:00:00.001-08:002023-02-15T02:17:22.346-08:00Loverwatch!<p>Loverwatch is an official Overwatch 2 (non-canon) dating sim! Now available for play at <a href="https://loverwatch.gg/">https://loverwatch.gg/</a>, so go check it out!</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgcDWzja68xompkfQgZJApbn-cioxIyDoH7WST1_nVPGrI3i-Di1NwZJGom4vZ5ctIoZ2Gj3GxEA9t9olVgzGrTNs_TxaPDHON2dblZyC4fsoDxQXwXvUsMZv8KaZmI65eWN0RIlGHVzK7BFBHnXAbTT8OOc5ISkLSRRV7LZiWAW_O_qEDww_72Peyn" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="787" data-original-width="1400" height="225" src="https://blogger.googleusercontent.com/img/a/AVvXsEgcDWzja68xompkfQgZJApbn-cioxIyDoH7WST1_nVPGrI3i-Di1NwZJGom4vZ5ctIoZ2Gj3GxEA9t9olVgzGrTNs_TxaPDHON2dblZyC4fsoDxQXwXvUsMZv8KaZmI65eWN0RIlGHVzK7BFBHnXAbTT8OOc5ISkLSRRV7LZiWAW_O_qEDww_72Peyn=w400-h225" width="400" /></a></div><br />We worked with Akupara, PsyOp, and Blizzard on this quick turn-around project, handling most of the technical and feature implementation and overseeing things like asset standards. It's free for a limited time and you can unlock Overwatch 2 cosmetic items based on the ending you get!<p></p>Jeremy Statzhttp://www.blogger.com/profile/10803766425905048525noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-8062931005539475902023-01-25T21:16:00.006-08:002023-01-25T21:17:28.286-08:00Terror of Hemasaurus! On Switch!<p> Now available on the e-shop <a href="https://www.nintendo.com/store/products/terror-of-hemasaurus-switch/">here</a>!</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9CSS7S6XaIq20j9k-1ZYIXc9VnUmoyK-A1-s5wwaq91QfJolANLhPoeuh0r6QQkkMt6dtyloqVvrn-KcaSPpO-337m5OYmd0W-7wE0kv5-4gyndfhnzM-_JD-rOq6FJPxnMNGlf4xCOT_z0A52Yh6wXAZv_8tPFgonuWv860xhDFQMSYwn9AlH97B/s639/toh.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="361" data-original-width="639" height="226" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9CSS7S6XaIq20j9k-1ZYIXc9VnUmoyK-A1-s5wwaq91QfJolANLhPoeuh0r6QQkkMt6dtyloqVvrn-KcaSPpO-337m5OYmd0W-7wE0kv5-4gyndfhnzM-_JD-rOq6FJPxnMNGlf4xCOT_z0A52Yh6wXAZv_8tPFgonuWv860xhDFQMSYwn9AlH97B/w400-h226/toh.jpg" width="400" /></a></div>Jeremy Statzhttp://www.blogger.com/profile/10803766425905048525noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-36237565047080184852022-12-14T13:16:00.001-08:002022-12-14T13:16:33.572-08:00Unity Addressable Assets in WebGL with Dynamic Remote Load Path<p> We recently worked on a Unity WebGL project that used Addressable Assets, and it included a library that required us to load the Addressables from a Remote Load Path. However, we knew we would be hosting the final Addressable Assets at the same location as the WebGL application itself, so they would always have the same base URL. This location could change, though depending whether we were testing on a staging server or a live server, and we didn't want to remake the Unity build for each location we would be deploying to.</p><p>Originally, it seemed that we had to have a fixed Remote Load Path URL for the Unity build, and we created a Python script that would replace the path from Unity with a custom path depending on where we knew we were deploying to. This proved cumbersome, though, and we found a better solution.</p><p>This <a href="https://forum.unity.com/threads/remote-or-local-based-on-build-platform.1290617/" target="_blank">Unity forum thread</a> provides some helpful information about how to specify Addressable Assets paths with more dynamic information. The Addressable Assets system allows you to <a href="https://docs.unity3d.com/Packages/com.unity.addressables@1.21/manual/AddressableAssetsProfiles.html#profile-variable-syntax" target="_blank">specify variables in the build and load paths</a> that will be evaluated at either build time or runtime. Based on that and the fact we can look up the current location a web page is running from using <span style="font-family: courier;">window.location.href</span>, we can dynamically generate a Remote Load Path for our Addressables.</p><p>First, we create a <span style="font-family: courier;">MonoBehaviour</span> to handle the dynamic path. This is necessary in order to access it through Javascript at runtime.</p><p><span style="font-family: courier;">using UnityEngine;<br /><br />public class CustomAddressablePaths : MonoBehaviour<br />{<br /> public static string RemoteURL<br /> {<br /> if ( _instance != null )<br /> {<br /> if ( _instance.remoteURL.EndsWith( "/" ) )<br /> {<br /> return _instance.remoteURL + "ServerData";<br /> }<br /><br /> return _instance.remoteURL + "/ServerData";<br /> }<br /><br /> return "";<br /> }<br /><br /> private static CustomAddressablePaths _instance = null;<br /><br /> private string remoteURL = "";<br /><br /> private void Awake()<br /> {<br /> if ( _instance == null )<br /> {<br /> _instance = this;<br /> }<br /> else if ( _instance != this )<br /> {<br /> Destroy( gameObject );<br /><br /> return;<br /> }<br /><br /> DontDestroyOnLoad( gameObject );<br /> }<br /><br /> public void SetRemoteURL( string remoteURL )<br /> {<br /> this.remoteURL = remoteURL;<br /> }<br />}</span></p><p>Now, in the Remote Load Path in the Addressables Profile, we can use the <span style="font-family: courier;">{}</span> syntax to specify a runtime value of <span style="font-family: courier;">{CustomAddressablePaths.RemoteURL}</span>.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEi7MIReGxMEbLh6pWzZ5AR-U-Qa54NsnI7u_EYEdkDqLfzb2v_I_5NBU4GlpOrgNOThR2Lox4GcopEKAEHgEim1cb6Gqzp4za1RTyfnG_dlMtyCdhauB9Wxo4a3Av8HDxWK5dGsLbmPLYdMX8JQaJ4ah7YMwOoslFTcAvQ8hAVj7l4e2sHBIZUZKKyG" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="177" data-original-width="942" height="60" src="https://blogger.googleusercontent.com/img/a/AVvXsEi7MIReGxMEbLh6pWzZ5AR-U-Qa54NsnI7u_EYEdkDqLfzb2v_I_5NBU4GlpOrgNOThR2Lox4GcopEKAEHgEim1cb6Gqzp4za1RTyfnG_dlMtyCdhauB9Wxo4a3Av8HDxWK5dGsLbmPLYdMX8JQaJ4ah7YMwOoslFTcAvQ8hAVj7l4e2sHBIZUZKKyG" width="320" /></a></div><br /><p></p><p>In the startup scene of the project, create a new <span style="font-family: courier;">GameObject</span> named <span style="font-family: courier;">CustomAddressablePaths</span> and add the <span style="font-family: courier;">CustomAddressablePaths</span> component. In theory this should be set to exist before the Addressables system is initialized.</p><p>If you're not already using a custom WebGL template for the project, we can create a new one. Copy the contents of <span style="font-family: courier;"><Unity Editor install path>\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\WebGLTemplates\Default</span> to your project under <span style="font-family: courier;">Assets\WebGLTemplates</span>. Give it a new subfolder name (e.g. <span style="font-family: courier;">Assets\WebGLTemplates\MyNewTemplate</span>). Select the new template from the WebGL PlayerSettings "Resolution and Presentation" section.</p><p>In <span style="font-family: courier;">index.html</span> in the custom WebGL template, find where <span style="font-family: courier;">createUnityInstance()</span> is run, and where a variable called <span style="font-family: courier;">unityInstance</span> is returned. You can then run the following Javascript code:</p><p><span style="font-family: courier;">unityInstance.SendMessage( "CustomAddressablePaths", "SetRemoteURL", window.location.href );</span></p><p><span style="font-family: courier;"></span></p><div class="separator" style="clear: both; text-align: center;"><span style="font-family: courier;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiAgNSHpar8ksWvzXw0Q6kSQbY02NDhIsZ8T6NDUAu5YXHZlnGokGmXCnc6UnhdHBJl6OmeAZGqYYffpYJCoWHP58aXlzGVBRNpCXFdjG-OIGAandweaccMcpwO0Qm76n0cjlFR19osXu1suVcxqDXynkU54ZRXb1YLwvq5EWU3r09mHV3WJ3diBcbJ" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="203" data-original-width="836" height="78" src="https://blogger.googleusercontent.com/img/a/AVvXsEiAgNSHpar8ksWvzXw0Q6kSQbY02NDhIsZ8T6NDUAu5YXHZlnGokGmXCnc6UnhdHBJl6OmeAZGqYYffpYJCoWHP58aXlzGVBRNpCXFdjG-OIGAandweaccMcpwO0Qm76n0cjlFR19osXu1suVcxqDXynkU54ZRXb1YLwvq5EWU3r09mHV3WJ3diBcbJ" width="320" /></a></span></div><span style="font-family: courier;"><br /></span><p></p><p>Finally, when deploying your WebGL game, assuming your <span style="font-family: courier;">index.html</span> file is at <span style="font-family: courier;"><server root>\index.html</span>, the built Addressable Assets should be at <span style="font-family: courier;"><server root>\ServerData</span>. Now when the Addressables system attempts to download an asset, it should use the correct URL.</p>Joel Burkehttp://www.blogger.com/profile/13498348776664808746noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-70756676348929974432022-12-09T14:15:00.006-08:002022-12-23T14:59:32.380-08:00Terror of Hemasaurus!<p>What could be worse than a rampaging pixel-dinosaur annihilating everything in its path? Four of them, of course! Break out your extra controllers and join in four-player couch coop as you take humanity to task for its environmental sins! Topple physics-simulated buildings, kick cars into helicopters, then throw the helicopters into hydrogen-filled blimps!</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpWoUn-oGE2U5h3mSq7DDeBVodYtFVHdqaCYieHoidEGZN7Lw3A7Z1VkhDpwQ9sceuhYSNUkuI54605uUbLOvgCLCV6tieR4oVk9UbAC8BByTqCHNfv_ZZnMMS8Yy0NjGtIAc3fkMwLSbIVHNACnEj8Wj0i8D6snPNkuW3SKMjlHPi7RjGbhGxIPKd/s639/toh.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="361" data-original-width="639" height="226" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpWoUn-oGE2U5h3mSq7DDeBVodYtFVHdqaCYieHoidEGZN7Lw3A7Z1VkhDpwQ9sceuhYSNUkuI54605uUbLOvgCLCV6tieR4oVk9UbAC8BByTqCHNfv_ZZnMMS8Yy0NjGtIAc3fkMwLSbIVHNACnEj8Wj0i8D6snPNkuW3SKMjlHPi7RjGbhGxIPKd/w400-h226/toh.jpg" width="400" /></a></div><div><br /></div>We helped bring Terror of Hemasaurus to <a href="https://www.xbox.com/en-us/games/store/terror-of-hemasaurus/9p3x4m6hfz20">Xbox One</a>, <a href="https://store.playstation.com/en-us/product/UP2187-CUSA37229_00-6466513943967043">PS4</a>, and (once mid-January rolls around) Switch!<br /><p><br /></p>Jeremy Statzhttp://www.blogger.com/profile/10803766425905048525noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-5981288759711402912022-11-03T11:35:00.005-07:002022-12-23T15:00:50.812-08:00Ghost Song!<p>A loving modern homage to Metroid, Ghost Song features lovingly rendered 2D artwork and backgrounds with incredible layers of detail and depth. You're challenged to explore the desolate environments of the moon Lorian, finding new paths and new abilities and discovering its buried secrets.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSJ8T9Ul7WP_IoB6rZ1tb6iP8HBlTbFICTwiXyFIRapqrujeae2zE9BBBhUwd-5bPOIYD7RUKGFZwcNbv_SDDSqPdTTUi_DMW7_UzDoqg3hJm0PCifsxozx1A_HnTGGel-1kvautvn0BVF-Abm1KYZeZ4pqlJFvHIfK9Vg7VD1_xqmL6Yi-MQ1mz2s/s1920/Ghost-Song-Key-Art-1920x1080-1.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1080" data-original-width="1920" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSJ8T9Ul7WP_IoB6rZ1tb6iP8HBlTbFICTwiXyFIRapqrujeae2zE9BBBhUwd-5bPOIYD7RUKGFZwcNbv_SDDSqPdTTUi_DMW7_UzDoqg3hJm0PCifsxozx1A_HnTGGel-1kvautvn0BVF-Abm1KYZeZ4pqlJFvHIfK9Vg7VD1_xqmL6Yi-MQ1mz2s/w400-h225/Ghost-Song-Key-Art-1920x1080-1.jpg" width="400" /></a></div><div><br /></div>Ghost Song is built with Unity, and we worked with the original developer and Humble Bundle to achievement major performance improvements, and to make it available on all major platforms simultaneously. Get it on <a href="https://www.xbox.com/en-US/games/store/ghost-song/9pj2fc2lk9qd">Xbox</a>, <a href="https://store.playstation.com/en-us/concept/10005004/">PS4 & PS5</a>, <a href="https://www.nintendo.com/store/products/ghost-song-switch/">Switch</a>, <a href="https://store.steampowered.com/app/347800/Ghost_Song/">Steam</a>, and a variety of other storefronts.Jeremy Statzhttp://www.blogger.com/profile/10803766425905048525noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-39979382896248885282022-10-11T11:36:00.020-07:002022-11-03T11:41:21.740-07:00Eville!<p>Eville is a multiplayer social-deduction game, built using the Unreal engine. You find yourself in a village riddled by a series of murders. Some say it might have been you - or was it? Convince others you're not the perpetrator to stay alive, or use the unique abilities of your class to misdirect the investigation.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYoj37LlANFnlQoZK-BYIMOXE6R1EyHZ3jlEXGG4Xt5LoDwws2FGxdnRgeWl4KhrgMekOwBnH13PQtqi4mrp1igGWdnhN22UZ6ZIOg5I7uLcrgjNq5P7sxwLfLUz1Ze1xpc0lF1t3Vz3zW1Rmd0xIP3pF3gdQTYslR8LGOuRwPouKDsPvbBcgPGMWi/s620/t620x300-8c6e023d4eb84c018c0e0bc704ec2fb0.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="300" data-original-width="620" height="194" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYoj37LlANFnlQoZK-BYIMOXE6R1EyHZ3jlEXGG4Xt5LoDwws2FGxdnRgeWl4KhrgMekOwBnH13PQtqi4mrp1igGWdnhN22UZ6ZIOg5I7uLcrgjNq5P7sxwLfLUz1Ze1xpc0lF1t3Vz3zW1Rmd0xIP3pF3gdQTYslR8LGOuRwPouKDsPvbBcgPGMWi/w400-h194/t620x300-8c6e023d4eb84c018c0e0bc704ec2fb0.jpg" width="400" /></a></div><br /><p>We helped bring Eville to multiple consoles. Now <a href="https://eville-game.com/">available</a> on Steam and Xbox Gamepass, with full cross-play support!</p>Jeremy Statzhttp://www.blogger.com/profile/10803766425905048525noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-25863829969962436932022-07-20T08:11:00.007-07:002022-10-20T08:19:39.692-07:00Severed Steel!<p>Severed Steel is a single-player Unreal-based FPS featuring a fluid stunt system, destructible voxel environments, loads of bullet time, and a unique one-armed protagonist. It's you, your trigger finger, and a steel-toed boot against a superstructure full of bad guys. Chain together wall runs, dives, flips, and slides to take every last enemy down.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFb40lMeyCABeHIzl8a6_humUx7GIxCsG9eebzUuvEBlp77RyXyDVOUIVRX92DN6AO-HnAcbJAkl0eYbDsewa2R6qA766c0OtFCpQZxU4jBsWwpSzWIrnLnvVJpaPJVLbAocJqgyS6Th2IoQp9Jpyf9NKB3VWz0S9py8gqivwgT64SkZ-zClWcE7TY/s1440/SeveredSteelPromoArt.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1080" data-original-width="1440" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFb40lMeyCABeHIzl8a6_humUx7GIxCsG9eebzUuvEBlp77RyXyDVOUIVRX92DN6AO-HnAcbJAkl0eYbDsewa2R6qA766c0OtFCpQZxU4jBsWwpSzWIrnLnvVJpaPJVLbAocJqgyS6Th2IoQp9Jpyf9NKB3VWz0S9py8gqivwgT64SkZ-zClWcE7TY/w400-h300/SeveredSteelPromoArt.png" width="400" /></a></div><br /><p>We helped bring Severed Steel to <a href="https://store.playstation.com/en-us/product/UP2187-PPSA05105_00-3417830142526050">PlayStation</a>, <a href="https://www.xbox.com/en-US/games/store/severed-steel/9pj1qdb15fwr">Xbox</a>, and <a href="https://www.nintendo.com/store/products/severed-steel-switch/">Switch</a>!</p><p><br /></p>Jeremy Statzhttp://www.blogger.com/profile/10803766425905048525noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-85158258190077607372022-07-15T14:28:00.004-07:002022-07-15T14:28:59.244-07:00Dreadout 2!<p>A third-person horror adventure that draws inspiration from Indonesian folklore and urban legend! Use your camera to frighten off evil spirits, and when that doesn't work bludgeon them instead. Explore creepy environments as you search for answers, redemption, and acceptance towards your role in stopping mankind's greatest threats.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRFoHux4H8ve9PIytFmYiJZfqJGNxAn65FQaF8MNyUs18pguxbuwqTV9qPoRexFUvMhQXKk9ZkDcO1u6Hk4QxLptou8VqvL8p-zkBJNbbG_fyckL51Uys6qlUxgMXN-ExAU6iACInjZoClMw3nXfhNb5KQS1z7XeL0trOgiVFbb1h34yN60BAHzc9B/s1280/dreadout2logo.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="1280" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRFoHux4H8ve9PIytFmYiJZfqJGNxAn65FQaF8MNyUs18pguxbuwqTV9qPoRexFUvMhQXKk9ZkDcO1u6Hk4QxLptou8VqvL8p-zkBJNbbG_fyckL51Uys6qlUxgMXN-ExAU6iACInjZoClMw3nXfhNb5KQS1z7XeL0trOgiVFbb1h34yN60BAHzc9B/w400-h225/dreadout2logo.jpg" width="400" /></a></div><p>Dreadout 2 uses the Unreal engine, and we helped bring it to <a href="https://www.xbox.com/en-us/games/store/dreadout-2/9pf2g5ncrfcs">Xbox One, Xbox Series X</a>, <a href="https://store.playstation.com/en-us/concept/10003304">PS4, and PS5</a>.</p><p></p><p><br /></p>Jeremy Statzhttp://www.blogger.com/profile/10803766425905048525noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-45020070540764399442022-06-02T13:27:00.004-07:002022-06-06T10:22:30.118-07:00Unexplored 2!<p>A unique and beautiful roguelike with more adventure and less combat, Unexplored 2 tasks you with destroying the Staff of Yendor in persistent randomly generated world. Play different characters within the same world and see things change over time! Hear rumors of distant places, and go loot them! Unlock secrets and get attacked by bat creatures!</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjKRrhawzRfeCCGNu1lNx6KZBT-vip3oJnIt0UBUgK5Dd8m5BJ5_A0i4MRL7R6xQRZTZH-Wyi_mHN2YyJtDxClX9JlVQzqzl0v-2sNpzj_IEc_moPdzv5i5vMim1ukWHGYkgK6Itog4rAM6GTluF6xZir5gDQIMOnG1Gyo8JFXCVa9ibdKvw76vGDcY" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="353" data-original-width="616" height="229" src="https://blogger.googleusercontent.com/img/a/AVvXsEjKRrhawzRfeCCGNu1lNx6KZBT-vip3oJnIt0UBUgK5Dd8m5BJ5_A0i4MRL7R6xQRZTZH-Wyi_mHN2YyJtDxClX9JlVQzqzl0v-2sNpzj_IEc_moPdzv5i5vMim1ukWHGYkgK6Itog4rAM6GTluF6xZir5gDQIMOnG1Gyo8JFXCVa9ibdKvw76vGDcY=w400-h229" width="400" /></a></div><br />We worked with Ludomotion to make Unexplored 2 available on <a href="https://www.xbox.com/en-US/games/store/unexplored-2-the-wayfarers-legacy/9n5xqr87zz2w">Xbox One and Xbox Series X</a>, and on <a href="https://store.steampowered.com/app/1095040/Unexplored_2_The_Wayfarers_Legacy/">Steam</a>! Look for a PlayStation version in a few weeks!<p></p>Jeremy Statzhttp://www.blogger.com/profile/10803766425905048525noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-75330950598488810362021-12-03T13:18:00.003-08:002021-12-03T13:18:45.815-08:00Archvale!<p>Archvale takes you on an exciting quest through a bullet-hell RPG world. Do you wish Zelda was more like Enter the Gungeon? Today is your day!</p><p>We worked with idoz & phops and Humble to bring Archvale to <a href="https://www.xbox.com/en-US/games/store/archvale/9P3MGM8ZCS5D">Xbox One</a> and Windows Store! Also available on Switch and Steam, Archvale is a great title with a ton of roguelike dungeon-crawling fun!</p><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/--642-5T8ExM/YaqI2EKO65I/AAAAAAAAPhA/pi5sXiZEwToScnCzd1mc2Y7dHKrErMMmwCNcBGAsYHQ/s460/header.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="215" data-original-width="460" height="188" src="https://1.bp.blogspot.com/--642-5T8ExM/YaqI2EKO65I/AAAAAAAAPhA/pi5sXiZEwToScnCzd1mc2Y7dHKrErMMmwCNcBGAsYHQ/w400-h188/header.jpg" width="400" /></a></div><p><br /></p>Jeremy Statzhttp://www.blogger.com/profile/10803766425905048525noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-26607686759489300652021-11-05T15:08:00.002-07:002021-11-17T15:11:55.629-08:00First Class Trouble!<p> A sneaky social deduction game set on a futuristic space cruise, First Class Trouble challenges a pair of robotic Personoids to avoid detection while wiping out the remaining humans. Built in Unreal Engine 4, we helped bring the game to PS4 and PS5!</p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-Ntst1Zmuh5E/YZWL_4LwvnI/AAAAAAAAPeI/4MkF1TbYX7Mf7wXth2ptsETMP-GL3iq7wCLcBGAsYHQ/s1280/a2b33b90-ce49-40d7-9c28-cff27b990863.jpeg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="1280" height="225" src="https://1.bp.blogspot.com/-Ntst1Zmuh5E/YZWL_4LwvnI/AAAAAAAAPeI/4MkF1TbYX7Mf7wXth2ptsETMP-GL3iq7wCLcBGAsYHQ/w400-h225/a2b33b90-ce49-40d7-9c28-cff27b990863.jpeg" width="400" /></a></div><br /><p>If you're a Playstation Plus member it's available for play right <a href="https://www.playstation.com/en-us/games/first-class-trouble/">now</a>!</p>Jeremy Statzhttp://www.blogger.com/profile/10803766425905048525noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-14496617435629828452021-09-15T12:25:00.004-07:002021-09-15T12:25:56.049-07:00Flynn: Son of Crimson!<p>A charming and beautiful platform game built on GameMaker, Flynn is now available on <a href="https://www.nintendo.com/games/detail/flynn-son-of-crimson-switch/">Switch</a>, <a href="https://store.playstation.com/en-us/product/UP3864-CUSA27766_00-FLYNN0000000000A/">PS4</a>, <a href="https://www.microsoft.com/en-us/p/flynn-son-of-crimson/9MZNFF29W9ZX?activetab=pivot:overviewtab">Xbox</a>, and <a href="https://store.steampowered.com/app/737520/Flynn_Son_of_Crimson/">Steam</a>! We worked with Humble and Studio Thunderhorse to bring the title to all three console platforms. Explore Rosantica with your trusty dog, Dex, by your side. Push back the scourge and discover the truth behind what threatens your home!</p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-ETgDyVZCkCk/YUJIjVlRiXI/AAAAAAAAPUk/GPv7NoNUNmcfuMUNClnqvSrmMowJDYlMACLcBGAsYHQ/s616/0e6fc0e0b273f819688999acd4526c3b563357b4.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="353" data-original-width="616" height="229" src="https://1.bp.blogspot.com/-ETgDyVZCkCk/YUJIjVlRiXI/AAAAAAAAPUk/GPv7NoNUNmcfuMUNClnqvSrmMowJDYlMACLcBGAsYHQ/w400-h229/0e6fc0e0b273f819688999acd4526c3b563357b4.jpg" width="400" /></a></div><p><br /></p>Jeremy Statzhttp://www.blogger.com/profile/10803766425905048525noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-28052364605165155012021-09-03T17:46:00.001-07:002021-09-03T18:40:24.910-07:00Fixing Invalid Frameworks Folder in iOS App Store Upload<p><span style="font-family: Arial; font-size: 11pt; white-space: pre-wrap;">Upon moving a couple of recent projects to 2020.4, we learned that recent versions of Unity apparently have problems when exporting iOS applications. They’ll run and test fine, but upon uploading to the App Store, you’ll get an error. This reads:</span></p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><p style="text-align: left;"><span id="docs-internal-guid-499e67a6-7fff-c583-59d3-96edf5f2f05e"><span style="font-family: "Courier New"; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Invalid Bundle. The bundle at 'my.app/Frameworks/UnityFramework.framework' contains disallowed file 'Frameworks'.</span></span></p></blockquote><p><span style="font-family: Arial; font-size: 11pt; white-space: pre-wrap;">We spent a long while trying suggestions on forum threads and reviewing the build behavior before we came up with a solution that works for us. This also handles a further error we got after submitting the iOS app, which reads:</span></p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><p style="text-align: left;"><span id="docs-internal-guid-20064333-7fff-7d6a-cc60-c20d7080bdf1"><span style="font-family: "Courier New"; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Invalid Swift Support - The SwiftSupport folder is empty. Rebuild your app using the current public (GM) version of Xcode and resubmit it.</span></span></p></blockquote><p><span style="font-family: Arial; font-size: 11pt; white-space: pre-wrap;">You can use the solution we created by saving the below code out to a file called UpdateXcodeBuildSystemPostProcessor.cs and putting it in your project’s assets/editor folder.</span></p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: xx-small; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">using System.IO;</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;">using UnityEngine;</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;">using UnityEditor;</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;">using UnityEditor.Callbacks;</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">using UnityEditor.iOS.Xcode;</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;">#if UNITY_IOS || UNITY_TVOS</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;">// Create specific aliases for iOS.Xcode imports.</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;">// Unity Editor on macOS can report a conflict with other plugins</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;">using PlistDocument = UnityEditor.iOS.Xcode.PlistDocument;</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;">using PlistElementDict = UnityEditor.iOS.Xcode.PlistElementDict;</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;">#endif</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><br /></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;">public class UpdateXcodeBuildSystemPostProcessor : MonoBehaviour</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;">{</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> </span>[PostProcessBuild(999)]</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-size: xx-small;"><span style="font-family: "Courier New"; white-space: pre-wrap;"><span> </span>public static void OnPostProcessBuild(BuildTarget buildTarget, </span><span style="font-family: "Courier New"; text-indent: 36pt; white-space: pre-wrap;">string path)</span></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> </span>{</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-size: xx-small;"><span style="font-family: "Courier New"; white-space: pre-wrap;"><span><span> </span> </span>if (buildTarget == BuildTarget.iOS || </span><span style="font-family: "Courier New"; text-indent: 36pt; white-space: pre-wrap;">buildTarget == BuildTarget.tvOS)</span></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> <span> </span></span>{</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> </span><span> <span> </span></span>UpdateXcodeBuildSystem(path);</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span><span> </span> </span>}</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> </span>}</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><br /></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> </span>private static void UpdateXcodeBuildSystem(string projectPath)</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; text-indent: 36pt; white-space: pre-wrap;"><span> </span>{</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> <span> </span></span>string workspaceSettingsPath = Path.Combine(projectPath,</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; text-indent: 36pt; white-space: pre-wrap;"><span> </span><span> </span><span> </span>"Unity-iPhone.xcodeproj/project.xcworkspace/xcshareddata/" +</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-size: xx-small;"><span style="font-family: "Courier New"; text-indent: 36pt; white-space: pre-wrap;"><span> </span><span> </span><span> </span>"</span><span style="font-family: "Courier New"; text-indent: 36pt; white-space: pre-wrap;">WorkspaceSettings.xcsettings");</span></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; text-indent: 36pt; white-space: pre-wrap;"><br /></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span><span> </span> </span>if (File.Exists(workspaceSettingsPath))</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; text-indent: 36pt; white-space: pre-wrap;"><span> <span> </span></span>{</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> </span><span> <span> </span></span>// Read the plist document, and find the root element</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span><span> </span> </span><span> </span>PlistDocument workspaceSettings = new PlistDocument();</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> <span> </span></span><span> </span>workspaceSettings.ReadFromFile(workspaceSettingsPath);</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> </span><span> <span> </span></span>PlistElementDict root = workspaceSettings.root;</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><br /></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span><span> </span> </span><span> </span>// Modify the document as necessary.</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> <span> </span></span><span> </span>bool workspaceSettingsChanged = false;</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> </span><span> <span> </span></span>// Remove the BuildSystemType entry because it specifies the</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-size: xx-small;"><span style="font-family: "Courier New"; white-space: pre-wrap;"><span> </span><span> </span><span> </span>// </span><span style="font-family: "Courier New"; text-indent: 36pt; white-space: pre-wrap;">legacy Xcode build system, which is deprecated</span></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; text-indent: 36pt; white-space: pre-wrap;"><br /></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span><span> </span> </span><span> </span>if (root.values.ContainsKey("BuildSystemType"))</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> </span><span> <span> </span></span>{</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> </span><span> </span><span> <span> </span></span>root.values.Remove("BuildSystemType");</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span><span> </span> </span><span> </span><span> </span>workspaceSettingsChanged = true;</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> <span> </span></span><span> </span>}</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><br /></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-size: xx-small;"><span style="font-family: "Courier New"; white-space: pre-wrap;"><span> </span><span> <span> </span></span>// If actual changes to the document occurred, write the </span><span style="font-family: "Courier New"; text-indent: 36pt; white-space: pre-wrap;">result</span></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; text-indent: 36pt; white-space: pre-wrap;"><span> </span><span> </span><span> </span>// back to disk.</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span><span> </span> </span><span> </span>if (workspaceSettingsChanged)</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> <span> </span></span><span> </span>{</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-size: xx-small;"><span style="font-family: "Courier New"; white-space: pre-wrap;"><span> </span><span> <span> </span></span><span> </span>Debug.Log("UpdateXcodeBuildSystem: </span><span style="font-family: "Courier New"; text-indent: 36pt; white-space: pre-wrap;">Writing updated " + </span></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; text-indent: 36pt; white-space: pre-wrap;"><span> </span><span> </span><span> </span><span> </span><span> </span>"workspace settings to disk.");</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; text-indent: 36pt; white-space: pre-wrap;"><br /></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> </span><span> </span><span> <span> </span></span>try</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span><span> </span> </span><span> </span><span> </span>{</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-size: xx-small;"><span style="font-family: "Courier New"; text-indent: 36pt; white-space: pre-wrap;"><span> <span> </span></span><span> </span><span> </span><span> </span>workspaceSettings</span><span style="font-family: "Courier New"; text-indent: 36pt; white-space: pre-wrap;">.WriteToFile(workspaceSettingsPath);</span></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> </span><span> <span> </span></span><span> </span>}</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> </span><span> </span><span> <span> </span></span>catch (System.Exception e)</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span><span> </span> </span><span> </span><span> </span>{</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-size: xx-small;"><span style="font-family: "Courier New"; white-space: pre-wrap;"><span> <span> </span></span><span> </span><span> </span><span> </span>Debug.LogError(</span><span style="font-family: "Courier New"; text-indent: 36pt; white-space: pre-wrap;">string.Format("UpdateXcodeBuildSystem: " +</span></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-size: xx-small;"><span style="font-family: "Courier New"; text-indent: 36pt; white-space: pre-wrap;"><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span>"Exception occurred writing workspace </span><span style="font-family: "Courier New"; text-indent: 36pt; white-space: pre-wrap;">settings to " +</span></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; text-indent: 36pt; white-space: pre-wrap;"><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span>"disk: \n{0}",</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; text-indent: 36pt; white-space: pre-wrap;"><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span>e.Message));</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> </span><span> <span> </span></span><span> </span><span> </span>throw;</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> </span><span> </span><span> <span> </span></span>}</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span><span> </span> </span><span> </span>}</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> <span> </span></span><span> </span>else</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> </span><span> <span> </span></span>{</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-size: xx-small;"><span style="font-family: "Courier New"; white-space: pre-wrap;"><span> </span><span> </span><span> <span> </span></span>Debug.Log("UpdateXcodeBuildSystem: </span><span style="font-family: "Courier New"; text-indent: 36pt; white-space: pre-wrap;">workspace settings did " +</span></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-size: xx-small;"><span style="font-family: "Courier New"; text-indent: 36pt; white-space: pre-wrap;"><span> </span><span> </span><span> </span><span> </span><span> </span>"not require </span><span style="font-family: "Courier New"; text-indent: 36pt; white-space: pre-wrap;">modifications.");</span></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span><span> </span> </span><span> </span>}</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> <span> </span></span>}</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span><span> </span> </span>else</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; text-indent: 36pt; white-space: pre-wrap;"><span> <span> </span></span>{</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-size: xx-small;"><span style="font-family: "Courier New"; white-space: pre-wrap;"><span><span> </span><span> </span> </span>Debug.LogWarningFormat("UpdateXcodeBuildSystem: </span><span style="font-family: "Courier New"; text-indent: 36pt; white-space: pre-wrap;">could not find " +</span></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; text-indent: 36pt; white-space: pre-wrap;"><span> </span><span> </span><span> </span><span> </span>"workspace settings files [{0}]",</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; text-indent: 36pt; white-space: pre-wrap;"><span> </span><span> </span><span> </span><span> </span>workspaceSettingsPath);</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span><span> </span> </span>}</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><br /></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span><span> </span> </span>// Get the path to the Xcode project</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> <span> </span></span>string pbxProjectPath = PBXProject.GetPBXProjectPath(projectPath);</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span><span> </span> </span>var pbxProject = new PBXProject();</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><br /></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span><span> </span> </span>// Open the Xcode project</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> <span> </span></span>pbxProject.ReadFromFile(pbxProjectPath);</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><br /></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span><span> </span> </span>// Get the UnityFramework target GUID</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> <span> </span></span>string unityFrameworkTargetGuid =</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; text-indent: 36pt; white-space: pre-wrap;"><span> </span><span> </span><span> </span>pbxProject.GetUnityFrameworkTargetGuid();</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; text-indent: 36pt; white-space: pre-wrap;"><br /></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-size: xx-small;"><span style="font-family: "Courier New"; white-space: pre-wrap;"><span><span> </span> </span>// Modify the Swift version in the UnityFramework target to</span><span style="font-family: "Courier New"; text-indent: 36pt; white-space: pre-wrap;"> a</span></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; text-indent: 36pt; white-space: pre-wrap;"><span> </span><span> </span>// compatible string</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> <span> </span></span>pbxProject.SetBuildProperty(unityFrameworkTargetGuid,</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; text-indent: 36pt; white-space: pre-wrap;"><span> </span><span> </span><span> </span>"SWIFT_VERSION", "5.0");</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; text-indent: 36pt; white-space: pre-wrap;"><br /></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span><span> </span> </span>// Write out the Xcode project</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> <span> </span></span>pbxProject.WriteToFile(pbxProjectPath);</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><br /></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-size: xx-small;"><span style="font-family: "Courier New"; white-space: pre-wrap;"><span><span> </span> </span>Debug.Log("UpdateXcodeBuildSystem: </span><span style="font-family: "Courier New"; text-indent: 36pt; white-space: pre-wrap;">update Swift version in Xcode " +</span></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; text-indent: 36pt; white-space: pre-wrap;"><span> </span><span> </span><span> </span>"project.");</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;"><span> </span>}</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: "Courier New"; font-size: xx-small; white-space: pre-wrap;">}</span></p></blockquote><p><span style="font-family: Arial; font-size: 11pt; white-space: pre-wrap;">We do two things here:</span></p><p></p><ol style="text-align: left;"><li><span style="font-family: Arial; font-size: 11pt; white-space: pre-wrap;">Unity writes out the Xcode project using Xcode’s “Legacy Build System”, which is currently deprecated in Xcode 12.5.1 where this was tested. We remove the “BuildSystemType” key from the Xcode workspace settings so that Xcode uses the default build system.</span></li><li><span style="font-family: Arial; font-size: 11pt; white-space: pre-wrap;">Once Xcode is using the default build system, it no longer recognizes the format of the Swift version that Unity writes out in the Xcode project. Unity writes something like “5 0 5 1”, but Xcode expects “5.0”. So we forcibly set the Swift version to a value Xcode currently understands.</span></li></ol><div><span id="docs-internal-guid-ad36f129-7fff-a04f-5dbc-3fc2f8645132"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">You could do this manually. After making a Unity build for iOS, you would open the Xcode project, go to the File menu, select Project Settings, and change the Build System in the drop-down menu there. Changing this through Xcode will automatically fix the Swift version value.</span></span></div><div><span><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></span></div><div><span id="docs-internal-guid-2039c493-7fff-cfa4-31f8-c45138958c69"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Thanks to everyone on the various Unity forum threads who have been wrestling with this problem.</span></span></div><div><span id="docs-internal-guid-da659567-7fff-fc71-aded-266d63495040"><a href="https://forum.unity.com/threads/2019-3-validation-on-upload-to-store-gives-unityframework-framework-contains-disallowed-file.751112/" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">https://forum.unity.com/threads/2019-3-validation-on-upload-to-store-gives-unityframework-framework-contains-disallowed-file.751112/</span></a></span></div><div><br /></div><div><span id="docs-internal-guid-0a2900ca-7fff-1adb-6d41-224513764798"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Thanks also to user <a href="https://developer.apple.com/forums/profile/uannoymejo" target="_blank">uannoymejo</a> on this forum thread for bringing up the Xcode build system.</span></span></div><div><span id="docs-internal-guid-bb34cb95-7fff-3723-d6df-022f91ee5394"><a href="https://developer.apple.com/forums/thread/125027" style="text-decoration-line: none;" target="_blank"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">https://developer.apple.com/forums/thread/125027</span></a></span></div><div><br /></div><p></p>Joel Burkehttp://www.blogger.com/profile/13498348776664808746noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-46072606118361174052021-09-01T18:56:00.003-07:002021-09-03T18:57:52.367-07:00Apsulov: End of Gods<p>Apsulov is a stunning action-horror exploration of Norse mythology, now available on the <a href="https://store.playstation.com/en-us/concept/10000273/">PS4</a> and <a href="https://www.nintendo.com/games/detail/apsulov-end-of-gods-switch/">Switch</a> as either physical disk or digital download. Creep through dark sci-fi hallways as you explore the worlds of Yggdrasil, evade horrific creatures, and understand what brought you to this place. We worked with Digerati to bring this Unreal-based title to all three consoles.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-E-qLqTarTDs/YTLSDLsRQXI/AAAAAAAAPS4/-YKski3qQug58ebMmlYh1qFDFuVqHUfZQCLcBGAsYHQ/s616/apsulov.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="353" data-original-width="616" height="229" src="https://1.bp.blogspot.com/-E-qLqTarTDs/YTLSDLsRQXI/AAAAAAAAPS4/-YKski3qQug58ebMmlYh1qFDFuVqHUfZQCLcBGAsYHQ/w400-h229/apsulov.png" width="400" /></a></div>Jeremy Statzhttp://www.blogger.com/profile/10803766425905048525noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-45246784099690820232021-05-05T10:53:00.021-07:002021-11-19T11:00:11.044-08:00Nongunz!<p> Do you dig roguelike action-shooters? How about grimy black and white pixel art involving skulls and a variety of weapons and powers? Do you think text is overrated? Then it might be time to dive into the gritty nihilistic world of Nongunz and explore the mysteries of its skull-infused universe!</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-GbOSRt6X0Ew/YZfzzTmwqNI/AAAAAAAAPeQ/RyF378e4nRY_6UUwLIHGRyg2Ywpo_vtNACLcBGAsYHQ/s1088/nongunz%2Bhero.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="613" data-original-width="1088" height="225" src="https://1.bp.blogspot.com/-GbOSRt6X0Ew/YZfzzTmwqNI/AAAAAAAAPeQ/RyF378e4nRY_6UUwLIHGRyg2Ywpo_vtNACLcBGAsYHQ/w400-h225/nongunz%2Bhero.png" width="400" /></a></div><p>We brought Nongunz: Doppleganger Edition to <a href="https://www.nintendo.com/games/detail/nongunz-doppelganger-edition-switch/">Switch</a>, <a href="https://store.playstation.com/en-us/product/UP2187-CUSA24083_00-9997645169937208">PS4</a>, and <a href="https://www.xbox.com/en-US/games/store/nongunz-doppelganger-edition/9nrdvcw02jd7">Xbox</a>, and it's available now for all those platforms! This is a unique and fun platformer that's worth a look for any fans of the genre!</p><p></p><p><br /></p>Jeremy Statzhttp://www.blogger.com/profile/10803766425905048525noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-43673442904165108852021-04-15T18:42:00.001-07:002021-09-03T18:47:04.511-07:00Darkside Detective!Do you want to track down deeper and darker mysteries of ever-increasing spookiness? Darkside Detective is a tongue-in-cheek horror-inspired classic adventure, and we worked with Akupara to bring both episodes to all three consoles!<div><br /></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://lh3.googleusercontent.com/-7ZVe3MnMtuY/YTLPq_ZSOqI/AAAAAAAAPSk/FJdCK310CnoP_mYb0e8Ugxofs97SGZSSwCLcBGAsYHQ/image.png" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="613" data-original-width="1089" height="225" src="https://lh3.googleusercontent.com/-7ZVe3MnMtuY/YTLPq_ZSOqI/AAAAAAAAPSk/FJdCK310CnoP_mYb0e8Ugxofs97SGZSSwCLcBGAsYHQ/w400-h225/image.png" width="400" /></a></div><br />Check out the web site <a href="http://darksidedetective.com/">here</a>!</div>Jeremy Statzhttp://www.blogger.com/profile/10803766425905048525noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-64228653447553002792021-03-09T11:16:00.000-08:002021-03-09T11:16:59.541-08:00Provisioning MacOS Big Sur Devices<p> When you need to set up one of your brand new macOS Big Sur computers as a test device (as described in "Register Test Devices" in <a href="http://www.kittehface.com/2019/06/unity-games-using-cloudkit-on-macos-part1.html">a previous post</a>), be aware that Apple has changed the required value for current devices. When you visit System Report -> Hardware, there are now two entries in the Hardware Overview: Hardware UDID and Provisioning UDID. You must use the Provisioning UDID when you register your device on your developer device list. For Macs that have been upgraded to Big Sur, these two IDs are probably the same. But on a fresh new Big Sur device, they most likely will not be the same.</p><p>If you try to use the incorrect Hardware ID, you will probably get a cryptic error message saying something like "You do not have permission to open the application". (See <a href="https://stackoverflow.com/questions/64842819/cant-run-app-because-of-permission-in-big-sur">this StackOverflow post</a>.) It's non-obvious, but if you look at the console for the system log, you might see a message saying "Provisioning Profile Validation: profile 'XXXXX' is not provisioned for this device (<private>)". That's a good indication that you've used the wrong UDID.</p>Joel Burkehttp://www.blogger.com/profile/13498348776664808746noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-76771302400750417682021-02-19T17:26:00.006-08:002021-02-19T17:44:22.443-08:00Signing & Notarizing a MacOS Gamemaker Application<p><span style="font-family: Arial; font-size: 11pt; white-space: pre-wrap;">So you need to manually sign and notarize a MacOS application, and it isn’t working out of the box. Here’s the steps that worked for me, in particular for a Gamemaker VM build of a project. Obviously this could be automated via a shell script, if you so desire.</span></p><span id="docs-internal-guid-be961c00-7fff-6463-a6de-bb37d55d6955"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">First, manually sign the application. Using </span><span style="font-family: Arial; font-size: 11pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">--force</span><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> and </span><span style="font-family: Arial; font-size: 11pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">--deep</span><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> make it replace and be recursive, both of which we want here. Having </span><span style="font-family: Arial; font-size: 11pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">--timestamp</span><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> is required for notarization, and was not present in Gamemaker's default signing. Using </span><span style="font-family: Arial; font-size: 11pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">options=runtime</span><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> will set it to use hardened runtime, which is also required for notarization. Note that the certificate you sign with has to be a Developer ID Application and you MUST have the private key locally. If you can't open the key listing and see someone's name underneath in the keychain, don’t expect it to work because that’s only a public key.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">You’ll want to have an entitlements file. This needs to contain at least the com.apple.security.automation.apple-events if you're doing a hardened runtime, and past experience has shown me that bluetooth and USB access are generally necessary for gamepad. An example entitlements file is </span><a href="https://drive.google.com/file/d/1CKuEoY89KZip41vu9o6tXbcQ6eX1qL3d/view?usp=sharing" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">here</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, though those bottom few may not all be needed depending on your game and engine.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;"></span></span></p><blockquote><span style="font-family: courier;">codesign --sign "Developer ID Application: COMPANY NAME, LLC" "Your Game.app" --force --deep --timestamp --options=runtime --entitlements game.entitlements</span></blockquote></span><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">After this is done, zip the app. I read in more than one place to use this command-line rather than the right-click menu’s “compress” feature, though I’m not sure that’s really true. Still, easy enough.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;"></span></span></p><blockquote><span style="font-family: courier;">/usr/bin/ditto -c -k --keepParent "Your Game.app" YourGameBuildMacSteam_Resigned.zip</span></blockquote><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Now that you’ve signed the build and made a new archive of that, you’ll need to submit it for notarization. Note that asc-provider should match the organization of the Developer ID application in the first step, and I’ve obfuscated the one I used. The password is for an app-specific password, which you probably have around but you’ll need to </span><a href="https://support.apple.com/en-us/HT204397" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">create</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> one if not. Finally, you can add the password to your keychain with an </span><a href="https://support.apple.com/guide/keychain-access/add-a-password-to-a-keychain-kyca1120/mac" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">alias</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> so it doesn't end up in the command-line directly, which is what I did here. That’s important if you want to write a shell script for these steps and check it in.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;"></span></span></p><blockquote><span style="font-family: courier;">xcrun altool --notarize-app --primary-bundle-id "com.company.yourgame" --username flast@company.com --password "@keychain:APP_PASSWORD" --asc-provider J93FFYZ67E --file YourGameMacSteam_Resigned.zip</span></blockquote><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">This command will output a randomly generated ID, keep that around. Now you wait.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">If things go well, you’ll get an e-mail from Apple after a while saying notarization is a success. If notarization succeeds, you'll need to staple the result to the app. Note that this is the app, not the zip. I assume it figures out what to do based on the signature.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;"></span></span></p><blockquote><span style="font-family: courier;">xcrun stapler staple "Your Game.app"</span></blockquote><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">At this point, you should be able to upload your application to Steam, or zip it (remember, your existing zip is now out of date) and distribute it.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">If notarization failed, the e-mail from Apple will say as much. You can use altool to ask for reasons of the failure, using that randomly generated ID that you hopefully kept around.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: courier; font-size: 11pt; text-indent: 36pt; white-space: pre-wrap;"></span></p><blockquote>xcrun altool --notarization-info fdeb1abc-25ae-43f1-8bca-97b89078196c --username flast@company.com --password "@keychain:APP_PASSWORD”</blockquote><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Assuming the process is completed, this will give you a URL you can paste into a web browser. </span><span style="font-family: Arial; font-size: 14.6667px; white-space: pre-wrap;">Sometimes the listed reasons are clear and other times not. </span><span style="font-family: Arial; font-size: 11pt; white-space: pre-wrap;">If the process isn’t yet complete, it’ll say so.</span></p><div><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>Jeremy Statzhttp://www.blogger.com/profile/10803766425905048525noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-27120626550919061372020-12-09T13:34:00.011-08:002021-03-06T13:38:16.790-08:00Unto the End!<p>Unto the End is a thrilling, high-difficulty action-adventure. Guide a father in a harsh quest through snowy landscapes and frozen caverns, as he seeks a return to his family. Highly skill-based combat make for intense gameplay as you move seamlessly from one environment to the next!</p><p>We helped bring Unto the End to Stadia, and you can check out the Steam version <a href="https://store.steampowered.com/app/600080/Unto_The_End/">here</a>!</p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-T4Xl__b3Ruo/YEP1y0pS-5I/AAAAAAAAOJ8/rH3buhHGfD8LcY0EQ0LF_wczYI1hvjVCACLcBGAsYHQ/s460/unto_header.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="215" data-original-width="460" height="188" src="https://1.bp.blogspot.com/-T4Xl__b3Ruo/YEP1y0pS-5I/AAAAAAAAOJ8/rH3buhHGfD8LcY0EQ0LF_wczYI1hvjVCACLcBGAsYHQ/w400-h188/unto_header.jpg" width="400" /></a></div><br /><p><br /></p>Jeremy Statzhttp://www.blogger.com/profile/10803766425905048525noreply@blogger.com0tag:blogger.com,1999:blog-4062078120874050453.post-26638705998695542482020-12-03T14:17:00.008-08:002020-12-03T14:17:59.766-08:00The Legend of Bum-Bo!<p>Chase down your beloved coin and take out the trash, in this roguelike puzzle adventure! We helped TheLabel Games bring Legend of Bum-Bo to Android, where it's available as part of a Play Pass subscription! Trek through the sewers, brave a wide variety of poops, and show that mysterious jerk that nobody can scare Bum-Bo!</p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-1WKZJqeBpoE/X8lj3w9o7JI/AAAAAAAANyY/b3dCiJggTOw9fIMV8h36WHzC7GVsHOoUwCLcBGAsYHQ/s616/capsule_616x353.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="353" data-original-width="616" height="229" src="https://1.bp.blogspot.com/-1WKZJqeBpoE/X8lj3w9o7JI/AAAAAAAANyY/b3dCiJggTOw9fIMV8h36WHzC7GVsHOoUwCLcBGAsYHQ/w400-h229/capsule_616x353.jpg" width="400" /></a></div><br /><p>Available on Google Play <a href="https://play.google.com/store/apps/details?id=com.thelabel.bumbo">here</a>!</p>Jeremy Statzhttp://www.blogger.com/profile/10803766425905048525noreply@blogger.com0