-
About col000r
Markus Hofer
Indie Game Developer
Austria, Europe -
RECENT POSTS
- Moving
- Moving Oculus Home
- The dark side of VR
- The cloud
- Host a TNet server on Amazon EC2
- Tales from the Museum of Unnecessary Purchases: Komplete 9 on OS X 10.6.8
- A Rant: Software updates. What will they screw up this time?
- Unity: Log AnimationCurves
- Unity: Creating an Installer
- Making InControl work with NGUI
- Additive Shader
- Unity: Building for Android
- Kickstarter
- Unity: Marking classes or functions as Obsolete
-
Why the Unity subscription model isn’t good for
anyonemost people
Moving Oculus Home
I have an SSD as my main drive and it’s not that big, so I’m unhappy whenever stuff like Oculus Home insists on installing itself (and all the software you download through it) only on that drive. But luckily that’s easy to fix if you know how. So here it is. How to move away the Oculus Home software folder and create a symbolic link to make Oculus Home believe it’s still there.
- Quit Oculus Home
- In Windows Explorer, take C:\Program Files (x86)\Oculus\Software and move it somewhere else, like D:\Program Files (x86)\Oculus\Software
- Right-click on the Windows Start button and choose Command Prompt (Admin)
- mklink /J “C:\Program Files (x86)\Oculus\Software” “D:\Program Files (x86)\Oculus\Software“
Done! It should say something like Junction created! You can restart Oculus Home and everything should still be there and working normally!
The dark side of VR
VR is the future – I am convinced of that. Books, movies, games – they can all give you a look into a different world, but it’s never you in there. It’s always someone else’s story and you’re just looking in from the outside. But in VR it is you in there. And that makes all the difference. VR will allow all of us to experience things that previously only a few could. We’ll stand on a stage and be cheered at by 10.000 people, we’ll be there to see how Caesar gets stabbed and we’ll finally be able to experience what it’s like to be a pet. Okay, it’s still different from reality, but it’s a big leap closer than anything you’ve ever seen on a screen or imagined in your head.
In the not so distant future we’ll spend our evenings experiencing the architectural wonders of the world, studying the intricacies of our galaxy or playing the lead role in the newest hit movie.
But you know – this is the idealistic view of what’s to come. There will be a dark side too. Be prepared.
I was never too worried about people playing violent video-games on a screen. If you play GTA, you shoot a lot of people with all sorts of guns, steal cars and use those cars to run over random people. It might soften you up to violence and bad behavior, but if you don’t do this all day, every day – then I’m not worried about you. Shooting someone on the screen using a controller is not the same experience as actually shooting someone. When you’re done with GTA, you might be able to name a whole bunch of guns and you might have gotten really good at aiming with a controller, but you still wouldn’t know how to fire a real gun. In VR is different. With the Vive it’s different. You still hold a controller, but what you see is a gun right there in your hand. The controller’s trigger is right where the gun’s trigger is. To hit your target you have to aim just like you would aim with a real gun. You stretch out your arm, line up your sights and when you shoot someone in the face, he’s your size and he’s right there. He’s still not real and you might be well aware of that fact, but the entire experience is now as close to actually shooting someone in the face as it’s ever been. And once you’ve done this a hundred times, a thousand times, you’ve not only trained a skill that you could apply in the real world with a real gun, you’ve lowered a barrier, you’ve reduced your natural resistance against shooting someone in the face.
Are we approaching a point where video game violence is suddenly no longer that much different from real violence? When do we cross the line from it being an equivalent of playing tag to actually training killers?
When I was 10 and started to wonder about girls, the craziest thing I could come up with was to browse the girl’s underwear section in mail order catalogs. Today 1/3 of 10 year olds have watched porn online, by age 14 over 80% say they regularly watch online porn and they have learnt more about fetishes and abusive and subjecting practices than I ever want to know. This is definitely not a good thing, but if VR porn catches on – and it will – then they won’t just be watching these things on a screen, they’ll be experiencing them first-hand in full scale high quality VR.
I’m sure it won’t be all ugly weird stuff, but still: Is it a good thing that people who haven’t found their soulmate will be able to experience a semi-realistic intimacy in VR, or will it keep generations of young men from leading normal relationships because they’ve all gotten used to doing weird shit with virtual porn queens before they were old enough to even work up the courage to talk to a real girl?
Is it a good thing that the poor and unfortunate will be able to live out their hopes and dreams in virtual worlds? Or will they become so disconnected from real life that they won’t even care about the repercussions of anything they do in the real world anymore? If life sucks, will you try and make it through your work-hours as fast as possible just so you can flee back into your virtual happy lie? I’m sure there will be more than enough people lining up to take your money in exchange for a few hours of virtual entertainment. Ever wanted to be a famous rock-star, play a big show and take some groupies backstage afterwards? Here, let me take those $60 of yours. Enjoy the ride…
The cloud
It’s no longer enough to keep your data on your HD, if you want to be one of the cool kids you have to put it in the cloud, baby! Easy access from all your devies, backup, sharing with coworkers, friends and of course the NSA! Or maybe you’re just too lazy to get up and attach your Backup-HD?
Sorted by subjective feeling of worth, grouped by security.
The elephants. Probably storing your data in unencrypted form on US soil (you know what that means)
Dropbox - 2GB for free, 100GB for $9.99/month (personal) or 1TB/5 users minimum for $75/month (business) – I’m currently paying for this. Works well and does what it should.
Google Drive – 15GB for free, 100GB for $1.99/month (personal) or unlimited (1TB per user if < 5 users) for $10/user/month (business) – happily using this for documents.
OneDrive - 15GB for free, 100GB for $1.99/month (personal) or 1TB for $2.50/user/month (add 1GB for $0.20/month) – I’m not convinced.
Office 365 Small Business Premium – 1TB/user + full Office for $12.50/user/month – nah, I’m sticking to Google Docs.
iCloud - well. you can’t store files there. that alone makes all the other options better. Also: platform independence. On a regular day I use OS X, Windows, iOS, Android and WP8. iCloud Drive will arrive later this year, let’s see how that turns out…
Probably stored in unencrypted form, but in Norway:
Jottacloud – 5GB for free, unlimited for $9.99 (personal) or 100 GB for unlimited users for $10/month (add 100GB for $6/month) – I use this for more sensitive stuff. And I encrypt the files myself with GPG before uploading them. Not very practical, I know…
Client-side encryption, stored in encrypted form
Wuala - nothing for free, 5GB for EUR 0.99/month (+100GB for EUR 9.99) (personal) or 100GB for 5 users for EUR 389 / YEAR – client-side encryption, data stored in Switzerland, Germany, France – just subscribed to the minimal 5GB plan. seemed like the best option to back up sensitive data!
Bitcasa - 20GB for free, 1TB for $10/month – sounds really great, but it’s slow as hell. completely unusable
SpiderOak - 2GB for free, 100 GB For $10/month (personal) or 100GB for $10/user/month (business) – haven’t tried this one, client-side encryption sounds good, but it’s based in the US
TresorIt – file-size limits and data transfer limits even for the paid plan? No, thank you.
Mega – 50 GB for free or 500 GB for $9.99/month – no, too much shady stuff going on there…
So… How do you do it? Anyone doing the personal cloud thing?
Host a TNet server on Amazon EC2
Amazon lets you run your own server in the cloud for very little money (for free even, in your first year – later on it will cost you about $15-20 per month for a t2.micro instance). Let me introduce you to the Elasic Compute Cloud, also known as EC2. You just open up a server instance from their website (they call it the AWS Management Console), connect to it via Remote Desktop (on Windows, Mac, Android, iOS, etc.), launch your TNet server and… keep it running. While you disconnect and worry about other things.
Here’s how to do it:
- Sign up to Amazon Web Services and EC2 if you haven’t (it’s free to sign up, you only pay for what you use)
- Log into the AWS Mangement Console and navigate to EC2
- Start a new instance: Windows server 2012 R2 Base > t2.micro instance and make sure you open the TCP and UDP ports you want to use – per default TNet uses tcp 5127 and udp 5128-5129, though you might want to use tcp for the last one. ah, just open both. (Follow the tutorial here, add Rules for TCP/UDP under “6. Configure Security Group” – or you can always change these later on by going to Security Groups, select the group and click edit on the bottom)
- Follow these steps to connect to your server and transfer your files onto it
- Open the Server Manager Application and click “Add Roles and Features“, select your server, go to “Features“, select “.NET Framework 3.5” and install it
- Open the Windows Firewall and add rules for the tcp and udp ports you want to use to Inbound Rules (Right-click on “Inbound Rules”, then select “New Rule…”) – Reminder: Make sure you always open everything in two places, here and in the EC2 security group in the AWS Management Console!
- Start your headless TNet server by running TNServer.exe (or better yet, write a .bat-file to start it up with your custom ports)
You can now connect to your very own server! (Note down the IP of your server in the AWS Management Console)
Bonus Points:
- Use an Elastic IP. “Elasic IP” is Amazon-talk for a fixed IP address that you can associate with your instance so it will always have the same IP address instead of getting a new random one each time you shut down and restart your server. To do this, go to Elastic IP in your EC2 Dashboard, click Allocate new Address, select it and click Associate Address, click on the instance field and select your instance. Save and Done!
- Install Dropbox on your instance for easy file-syncing (best do selective sync with one folder as not to blow your Elastic Block Store Volume)
- Install a decent browser. Use IE only to download Chrome. Yes you have to click through 20 warnings to get there and enable File Downloads in the Security Settings. Install it and never look at IE ever again.
- Do more with your instance! Install a XAMPP webserver so you can use PHP/MySQL to store some player data – highscores, whatever (I’ve installed Komodo Edit and do my web-development right there on the server via Remote Desktop, but you could just as well do File > Open > Remote File… in Komodo to edit the files on your server via FTP on your machine – just set up the ftp server included in XAMPP)
- Go tell your friends you’re now running a t2.micro instance on AWS EC2 with a 30 GiB SSD EBS Volume supporting 90 IOPS.
Google and Microsoft offer similar services with Compute Engine and Azure respectively. If you have tried those, please let me know about your experiences – I’m very interested!
Tales from the Museum of Unnecessary Purchases: Komplete 9 on OS X 10.6.8
Dear diary,
It’s been a while since my good old Mid-2007 iMac was good for anything. Ever since the “upgrade” to Lion it was on a downhill path, but the Mavericks-upgrade made it unusable to a point where I didn’t even want to use it as a second screen for browsing the web anymore. And Logic 8 and Mavericks really did not want to get a long either… Well, 2 options: Throw it out and buy a new one -or- try and restore it to its former glory. Option 1 had to be abandoned due to a case of acute non-affordability, so I decided to wipe it and install good old 10.6 Snow Leopard on it, the last OS X I remember it running well. So this old iMac was to become my dedicated machine for making music!
INTERMISSION! Yes, just a year or two ago when I had to get a Windows PC for a PC-only work-project I was excited about taking my music-making back to Sonar on the PC, but well… I bought Sonar X2 and after a very painful setup process I did indeed get everything to run with acceptably small latency, but I don’t know what happened – this was nothing like the good old Sonar 2 (?) I remembered and nothing like the good old Cakewalk Pro Audio 8 (?) I used in my parent’s basement. Did someone mess up the interface that bad, or did I simply romanticize it in my memory? In any case, I still have Sonar X2 on there and I’ve come to accept the quiet hum of my desktop PC as the tape-hiss of the 21st century, but I don’t enjoy using it much. It’s simply too much hassle to use. I’d rather focus on the music-making instead.
So back to the Mac I go. Logic 8 is far from perfect, but it does a better job at getting out of the way. I installed OS X 10.6, updated it to 10.6.8, installed Logic 8 and Komplete 5 and everything just works. I can even have custom icons in the Finder-sidebar! Oh good old 10.6.8! Now tell me, am I getting old? Am I starting to reject change instead of embracing it? Am I getting to an age where I’m starting to miss the “good old days”? Or are they really simple ruining OS X more and more with every new version? (I mean Mavericks doesn’t even run all that well on my main work machine, a still-pretty-new Mid-2012 MBP) Whatever. Let’s not get into this again…
Now at long last, let’s get to the topic of this post! When the Native Instruments summer sale came along I took a look at our finances and even though it wasn’t looking too good, I managed to convince myself that it would be a good investment to upgrade to Komplete 9!
After I had pressed the buy button I had a good look around. I looked at the assortment of tablets and phones, the wacom pens, joysticks, gamepads, the kinect, the leap motion, the mini-keyboards, drum-pads, guitars, the boxes full of Kickstarter-rewards, the unplayed and still-wrapped PS3/PS4/Xbox-One games, the old and new game consoles, the 3D-printed experiments, the photo-equipment, the small bust of Socrates on my desk, the e-drumkit, the good old Marshall amp I can’t even use because the neighbors would freak out, the countless hard-disks and chargers and pencils and books and board-games. And then I realized that apparently this was no longer a home office. Somehow over the past few years this had turned into my very own Museum of Unnecessary Purchases. How much happiness does a Yongnuo RF-603C buy? A couple of minutes tops. How about a Zoom H4? Mhm, let’s say 45 mins. But that’s how it is. Money buys happiness. And these days you need quite a lot of money to buy enough happiness for the entire family.
Well, that didn’t quite work. Let me try once more to get to the topic of this post… Komplete 9 arrived. Even though the minimum requirements say OS X 10.7, it installed without problems (over the course of a day – it comes on 12 DVDs) on 10.6.8. (I had done my research on this) Only step left: Open control center, type in my serial number and activate everything. Ouch! Control Center says it require 10.7 to run. So all the products work just fine on 10.6.8, only the stupid flash-app you use to activate the products requires 10.7? *facepalm* Anyway: Deleted the entire Control Center folder, downloaded the last version that ran on 10.6.8 and installed that instead; works!
The dedicated music making machine is a go and I’m sure the 55 additional GB of samples will improve the quality of my music-making significantly, as you might or might not hear in the background of one of my future games. (Not New Orbit Ep2, that upped and died quite publicly on Kickstarter – in case you missed it)
Until next time, when we bring you new tales from the Museum of Unnecessary Purchases! [imagine dramatic exit music here]
A Rant: Software updates. What will they screw up this time?
Remember when software updates were making you excited?
Today they induce fear. What will they screw up this time?
Unity: Log AnimationCurves
I’ve grown to love AnimationCurves! I use them for all sorts of things and go to great lengths to tweak them to perfection.
But once they’re perfect, how do I get that perfect curve out of the curve editor and into the script, so that whenever I use this script in another project it will hold the same perfect curve?
Well, I’ve written a little editor-script that looks at all the scripts on your currently selected gameObjects and outputs all AnimationCurves it can find to the console, nicely formatted so you can simply copy/paste them into your script.
And bam! Perfection by default!
using UnityEngine; using UnityEditor; using System; using System.Collections; public class AnimationCurveOutput : EditorWindow { [MenuItem("Assets/Log AnimationCurves")] public static void LogAnimCurves() { //Get selection Transform[] trs = Selection.GetTransforms (SelectionMode.Deep | SelectionMode.DeepAssets); //Look for AnimationCurves foreach (Transform tr in trs) { Component[] components = tr.GetComponents<Component>(); for (int i = 0; i < components.Length; i++) { Component c = components[i]; if (c != null) { Type t = c.GetType(); System.Reflection.FieldInfo[] fieldInfo = t.GetFields(); foreach (System.Reflection.FieldInfo info in fieldInfo) { if(info.FieldType == typeof(AnimationCurve)) { Debug.Log (tr.name); LogAnimationCurve((AnimationCurve) info.GetValue(c)); } } } } } } static void LogAnimationCurve(AnimationCurve a) { LogAnimationCurve(a, false); } static void LogAnimationCurve(AnimationCurve a, bool square) { string str = "new AnimationCurve(new Keyframe[] { "; int count = 1; foreach(Keyframe k in a.keys) { str += "new Keyframe(" + (k.time * (square ? k.time : 1f)) + "f, " + k.value + "f, " + k.inTangent + "f, " + k.outTangent + "f)"; if(count < a.keys.Length) str += ", "; else str += " "; } str += " });"; Debug.Log(str); } }
Or check it out in Gist form on GitHub!
Unity: Creating an Installer
I’m using Triton Ocean in a Unity project. The difficulty is that Triton requires a few other things to be installed or the ocean simply won’t show up.
If you just want it to work on your own machine, no problem – simply install their unity demo app and the installer will take care of everything! If, however, you’re working on an external project you don’t really want to tell the customer to install the demo app of the middleware you’re using before he can use the app they’re paying you to build.
So let’s build our own installer. How hard can it be?
And we’re in luck. It really isn’t all that hard once you get the hang of it.
So what do we need?
- Unicode version of the Inno Setup QuickStart Pack (download and install!)
- The redistributable installers of the Visual C++ 2010 SP1 runtime libraries as well as the DirectX runtime libraries
And how do we do it?
- Make a build in Unity, put the correct things in the correct places for Triton to function.
- Run the Inno Setup New Script Wizard (File > New > New Script (Wizard) in Inno Script Studio) and go through all the steps (This tutorial might help – take special note of this quick tip – quote from the tutorial: “A quick note about the MyGame_Data folder. You can select it directly, then click edit and set the destination subfolder to MyGame_Data. This will create the proper subdirectory once the installation is done and you will not be including any unnecessary files.” – If you just add the directories and don’t to this step, their contents will be taken out of the directory and placed at app level, which is not at all what we want. Compare the result to my inno setup file if you’re unsure you did it correctly. You should be able to fix it from there…)
- Open the resulting script and add the redistributable files to the Files (unless you’ve added them in the wizard) and Run sections, so their installers are run during the installation.
- Project > Compile
- You should now find your setup file in the Output folder! Install and test!
If you want to go one step further and run the Visual C++ 2010 SP1 runtime installer only if it’s not installed already, check out my final inno setup script on Gist (and feel free to contribute!)
Making InControl work with NGUI
If you’ve ever worked with gamepad controls in Unity you know that it’s not a lot of fun. Unity’s Input-system is a bit of a mess to beginn with, but in addition the button mappings on all the different controllers don’t match up. (Just compare the PS3 controller mapping to the Xbox 360 Controller mapping for example)
Luckily Patrick over at Gallant Games has written InControl to fix the mess. And it works like a charm! (It’s open source, but he’s done such a great job that you should support him by getting it on the AssetStore here, like I did!)
Adding joystick controls to my game could have been a week of pain and misery, but with InControl it was done casually in one evening.
But now onwards to the actual gist of this post!
The only hurdle was making InControl work with NGUI. NGUI allows you to control your interface with keyboard and joystick simply by adding UIButtonKeys components to your widgets and defining which other element should be activated if you press up/down/left/right. All you need to do to make NGUI use InControl instead of looking for the “Vertical” and “Horizontal” axes (as it does by default) is to modify UICamera.cs like this:
Add this to the very top:
using InControl;
Look for the GetDirection method and replace
float val = Input.GetAxis(axis);
with this:
float val = 0f; InputDevice activeDevice = InputManager.ActiveDevice; if(axis == "Horizontal") { val = activeDevice.LeftStickX.Value + activeDevice.RightStickX.Value + activeDevice.DPadLeft.Value * -1f + activeDevice.DPadRight.Value; } else if(axis == "Vertical") { val = activeDevice.LeftStickY.Value + activeDevice.RightStickY.Value + activeDevice.DPadUp.Value + activeDevice.DPadDown.Value * -1f; }
Done! Now you can control your GUI with the D-Pad as well as the left and right sticks of any supported controller!
PS: One little problem: Remember that you’ll have to apply this change whenever you update NGUI. If anyone has an idea for a better solution than changing the actual UICamera script, please let me know! I wanted to solve it with inheritance, but since I can’t override a static method…