Archive for the ‘GAMES’ Category

Wednesday, January 21st, 2009

The unity3d platform is about to realize about 900% or 9x more possible market for selling their wares and I believe will blow up with unity 2.5.  Unity3d 2.5 will bring a windows IDE and development environment to unity3d developers. Many game companies are heavily invested in Windows and having this option is breaking down a huge wall to get this development platform and engine into many new hands and companies.

The best part about unity 3d development is the hardware acceleration, the fantastic pipeline, the ability to publish desktop, web, mobile (iphone) and console (wii) is pretty amazing.  All using the powerful mono open source .net framework as a base.

Full update list:

Windows Editor Support

Unity 2.5 adds full support for Windows Vista and XP, with 100% feature parity and interoperability with Mac OS X. The Unity Editor has been rebuilt to look, feel, and function identically on both operating systems, each running the same underlying engine. The best part? Unity on either platform can build games for either platform — cross-platform in the truest sense.

A Whole New Look

Find the tools you need quickly and easily. The Play buttons are front and center, clearly visible and inviting you to play, test, and improve your work. And when you do, they light up, dimming the rest of the application, drawing your attention to the most important things in the play experience you’re creating.
Precise Navigation and Placement Tools

Improved Usability

Snap any object to customizable increments of position, scale, and rotation values. Drag objects around, clamped to any surface collision. Manipulate objects in local or world space. Use the new flythrough controls to get around easily. And did we mention the completely redesigned rotation tool?

3ds Max Importing

Drag and drop your .max files right into the Editor, including support for all skeletal based animation, multiple UVs, and vertex colors. Autodesk 3ds Max now joins the existing support for Maya, Blender, and all other 3D applications that integrate with the latest FBX plugin on the Windows platform.

Completely Customizable Editor

UnityGUI, Unity’s own GUI creation system, now powers the entire Editor and allows you to integrate your own unique level design tools, AI control tools, debugging tools, difficulty tuning tools, or anything else you need. Over 130 new API entry points enable you to create specialized, customized editor tools and build them into the existing Editor interface.

Tabbed Interface

We took cues from the best designed applications, and the rewritten editor has received dozens of improvements. The most visible change is the tabbed interface, where every part of the interface can be moved, undocked to a secondary monitor, and even stacked to achieve logical grouping.

Information at Your Fingertips

We’ve gone to great lengths to make sure that you always have the info you need, when you need it. Model files have previews right inside the inspector. Audio Clips show their waveform with click-to-play behaviour. Meshes show the detailed rendering stats – and that’s just scratching the surface.

Friday, January 16th, 2009

I use a SoundManager class for games and interactives that require it which I picked up at evolve by Matt Przybylski.  But I sometimes need to use Tweener rather than TweenLite depending on what the project uses already. So here is the class updated with Tweener.  Just grab the latest Tweener to work with this.  Sound is one of those things like tweening, it is easier to reuse code if everyone uses common libraries.

package game.util
{
	import caurina.transitions.properties.SoundShortcuts;
	import flash.media.Sound;
	import flash.media.SoundChannel;
	import flash.media.SoundLoaderContext;
	import flash.media.SoundTransform;
	import flash.net.URLRequest;
	import flash.utils.Dictionary;
	import flash.utils.getQualifiedClassName;
	import caurina.transitions.*;
	/**
	 * The SoundManager is a singleton that allows you to have various ways to control sounds in your project.
	 *
 
	 * The SoundManager can load external or library sounds, pause/mute/stop/control volume for one or more sounds at a time,
	 * fade sounds up or down, and allows additional control to sounds not readily available through the default classes.
	 *
 
	 * This class is dependent on TweenLite (http://www.tweenlite.com) to aid in easily fading the volume of the sound.
	 *
	 * @author Matt Przybylski [http://www.reintroducing.com]
	 * @version 1.0
	 *
	 * @author Ryan Christensen (http://drawlogic.com)
	 * @version 1.1 - added Tweener support and removed TweenLite support
	 */
	public class SoundManager
	{
//- PRIVATE & PROTECTED VARIABLES -------------------------------------------------------------------------
		// singleton instance
		private static var _instance:SoundManager;
		private static var _allowInstance:Boolean;
		private var _soundsDict:Dictionary;
		private var _sounds:Array;
//- PUBLIC & INTERNAL VARIABLES ---------------------------------------------------------------------------
//- CONSTRUCTOR -------------------------------------------------------------------------------------------
		// singleton instance of SoundManager
		public static function getInstance():SoundManager
		{
			if (SoundManager._instance == null)
			{
				SoundManager._allowInstance = true;
				SoundManager._instance = new SoundManager();
				SoundManager._allowInstance = false;
			}
			return SoundManager._instance;
		}
		public function SoundManager()
		{
			this._soundsDict = new Dictionary(true);
			this._sounds = new Array();
			if (!SoundManager._allowInstance)
			{
				throw new Error("Error: Use SoundManager.getInstance() instead of the new keyword.");
			}
		}
//- PRIVATE & PROTECTED METHODS ---------------------------------------------------------------------------
//- PUBLIC & INTERNAL METHODS -----------------------------------------------------------------------------
		/**
		 * Adds a sound from the library to the sounds dictionary for playing in the future.
		 *
		 * @param $linkageID The class name of the library symbol that was exported for AS
		 * @param $name The string identifier of the sound to be used when calling other methods on the sound
		 *
		 * @return Boolean A boolean value representing if the sound was added successfully
		 */
		public function addLibrarySound($linkageID:*, $name:String):Boolean
		{
			for (var i:int = 0; i < this._sounds.length; i++)
			{
				if (this._sounds[i].name == $name) return false;
			}
			var sndObj:Object = new Object();
			var snd:Sound = new $linkageID;
			sndObj.name = $name;
			sndObj.sound = snd;
			sndObj.channel = new SoundChannel();
			sndObj.position = 0;
			sndObj.paused = true;
			sndObj.volume = 1;
			sndObj.startTime = 0;
			sndObj.loops = 0;
			sndObj.pausedByAll = false;
			this._soundsDict[$name] = sndObj;
			this._sounds.push(sndObj);
			return true;
		}
		/**
		 * Adds an external sound to the sounds dictionary for playing in the future.
		 *
		 * @param $path A string representing the path where the sound is on the server
		 * @param $name The string identifier of the sound to be used when calling other methods on the sound
		 * @param $buffer The number, in milliseconds, to buffer the sound before you can play it (default: 1000)
		 * @param $checkPolicyFile A boolean that determines whether Flash Player should try to download a cross-domain policy file from the loaded sound's server before beginning to load the sound (default: false)
		 *
		 * @return Boolean A boolean value representing if the sound was added successfully
		 */
		public function addExternalSound($path:String, $name:String, $buffer:Number = 1000, $checkPolicyFile:Boolean = false):Boolean
		{
			for (var i:int = 0; i < this._sounds.length; i++)
			{
				if (this._sounds[i].name == $name) return false;
			}
			var sndObj:Object = new Object();
			var snd:Sound = new Sound(new URLRequest($path), new SoundLoaderContext($buffer, $checkPolicyFile));
			sndObj.name = $name;
			sndObj.sound = snd;
			sndObj.channel = new SoundChannel();
			sndObj.position = 0;
			sndObj.paused = true;
			sndObj.volume = 1;
			sndObj.startTime = 0;
			sndObj.loops = 0;
			sndObj.pausedByAll = false;
			this._soundsDict[$name] = sndObj;
			this._sounds.push(sndObj);
			return true;
		}
 
 
		/**
		 * Removes a sound from the sound dictionary.  After calling this, the sound will not be available until it is re-added.
		 *
		 * @param $name The string identifier of the sound to remove
		 *
		 * @return void
		 */
		public function removeSound($name:String):void
		{
			for (var i:int = 0; i < this._sounds.length; i++)
			{
				if (this._sounds[i].name == $name)
				{
					this._sounds[i] = null;
					this._sounds.splice(i, 1);
				}
			}
			delete this._soundsDict[$name];
		}
		/**
		 * Removes all sounds from the sound dictionary.
		 *
		 * @return void
		 */
		public function removeAllSounds():void
		{
			for (var i:int = 0; i &lt; this._sounds.length; i++)
			{
				this._sounds[i] = null;
			}
			this._sounds = new Array();
			this._soundsDict = new Dictionary(true);
		}
		/**
		 * Plays or resumes a sound from the sound dictionary with the specified name.
		 *
		 * @param $name The string identifier of the sound to play
		 * @param $volume A number from 0 to 1 representing the volume at which to play the sound (default: 1)
		 * @param $startTime A number (in milliseconds) representing the time to start playing the sound at (default: 0)
		 * @param $loops An integer representing the number of times to loop the sound (default: 0)
		 *
		 * @return void
		 */
		public function playSound($name:String, $volume:Number = 1, $startTime:Number = 0, $loops:int = 0):void
		{
			var snd:Object = this._soundsDict[$name];
			snd.volume = $volume;
			snd.startTime = $startTime;
			snd.loops = $loops;
			if (snd.paused)
			{
				snd.channel = snd.sound.play(snd.position, snd.loops, new SoundTransform(snd.volume));
			}
			else
			{
				snd.channel = snd.sound.play($startTime, snd.loops, new SoundTransform(snd.volume));
			}
			snd.paused = false;
		}
		/**
		 * Stops the specified sound.
		 *
		 * @param $name The string identifier of the sound
		 *
		 * @return void
		 */
		public function stopSound($name:String):void
		{
			var snd:Object = this._soundsDict[$name];
			snd.paused = true;
			snd.channel.stop();
			snd.position = snd.channel.position;
		}
		/**
		 * Pauses the specified sound.
		 *
		 * @param $name The string identifier of the sound
		 *
		 * @return void
		 */
		public function pauseSound($name:String):void
		{
			var snd:Object = this._soundsDict[$name];
			snd.paused = true;
			snd.position = snd.channel.position;
			snd.channel.stop();
		}
		/**
		 * Plays all the sounds that are in the sound dictionary.
		 *
		 * @param $useCurrentlyPlayingOnly A boolean that only plays the sounds which were currently playing before a pauseAllSounds() or stopAllSounds() call (default: false)
		 *
		 * @return void
		 */
		public function playAllSounds($useCurrentlyPlayingOnly:Boolean = false):void
		{
			for (var i:int = 0; i < this._sounds.length; i++)
			{
				var id:String = this._sounds[i].name;
				if ($useCurrentlyPlayingOnly)
				{
					if (this._soundsDict[id].pausedByAll)
					{
						this._soundsDict[id].pausedByAll = false;
						this.playSound(id);
					}
				}
				else
				{
					this.playSound(id);
				}
			}
		}
		/**
		 * Stops all the sounds that are in the sound dictionary.
		 *
		 * @param $useCurrentlyPlayingOnly A boolean that only stops the sounds which are currently playing (default: true)
		 *
		 * @return void
		 */
		public function stopAllSounds($useCurrentlyPlayingOnly:Boolean = true):void
		{
			for (var i:int = 0; i < this._sounds.length; i++)
			{
				var id:String = this._sounds[i].name;
				if ($useCurrentlyPlayingOnly)
				{
					if (!this._soundsDict[id].paused)
					{
						this._soundsDict[id].pausedByAll = true;
						this.stopSound(id);
					}
				}
				else
				{
					this.stopSound(id);
				}
			}
		}
		/**
		 * Pauses all the sounds that are in the sound dictionary.
		 *
		 * @param $useCurrentlyPlayingOnly A boolean that only pauses the sounds which are currently playing (default: true)
		 *
		 * @return void
		 */
		public function pauseAllSounds($useCurrentlyPlayingOnly:Boolean = true):void
		{
			for (var i:int = 0; i < this._sounds.length; i++)
			{
				var id:String = this._sounds[i].name;
				if ($useCurrentlyPlayingOnly)
				{
					if (!this._soundsDict[id].paused)
					{
						this._soundsDict[id].pausedByAll = true;
						this.pauseSound(id);
					}
				}
				else
				{
					this.pauseSound(id);
				}
			}
		}
		/**
		 * Fades the sound to the specified volume over the specified amount of time.
		 *
		 * @param $name The string identifier of the sound
		 * @param $targVolume The target volume to fade to, between 0 and 1 (default: 0)
		 * @param $fadeLength The time to fade over, in seconds (default: 1)
		 *
		 * @return void
		 */
		public function fadeSound($name:String, $targVolume:Number = 0, $fadeLength:Number = 1):void
		{
			var fadeChannel:SoundChannel = this._soundsDict[$name].channel;
			SoundShortcuts.init();
			Tweener.addTween(fadeChannel, { _sound_volume: $targVolume, time: $fadeLength, transition:"linear" } );
			//TweenLite.to(fadeChannel, $fadeLength, {volume: $targVolume});
		}
		/**
		 * Mutes the volume for all sounds in the sound dictionary.
		 *
		 * @return void
		 */
		public function muteAllSounds():void
		{
			for (var i:int = 0; i < this._sounds.length; i++)
			{
				var id:String = this._sounds[i].name;
				this.setSoundVolume(id, 0);
			}
		}
		/**
		 * Resets the volume to their original setting for all sounds in the sound dictionary.
		 *
		 * @return void
		 */
		public function unmuteAllSounds():void
		{
			for (var i:int = 0; i < this._sounds.length; i++)
			{
				var id:String = this._sounds[i].name;
				var snd:Object = this._soundsDict[id];
				var curTransform:SoundTransform = snd.channel.soundTransform;
				curTransform.volume = snd.volume;
				snd.channel.soundTransform = curTransform;
			}
		}
		/**
		 * Sets the volume of the specified sound.
		 *
		 * @param $name The string identifier of the sound
		 * @param $volume The volume, between 0 and 1, to set the sound to
		 *
		 * @return void
		 */
		public function setSoundVolume($name:String, $volume:Number):void
		{
			var snd:Object = this._soundsDict[$name];
			var curTransform:SoundTransform = snd.channel.soundTransform;
			curTransform.volume = $volume;
			snd.channel.soundTransform = curTransform;
		}
		/**
		 * Gets the volume of the specified sound.
		 *
		 * @param $name The string identifier of the sound
		 *
		 * @return Number The current volume of the sound
		 */
		public function getSoundVolume($name:String):Number
		{
			return this._soundsDict[$name].channel.soundTransform.volume;
		}
		/**
		 * Gets the position of the specified sound.
		 *
		 * @param $name The string identifier of the sound
		 *
		 * @return Number The current position of the sound, in milliseconds
		 */
		public function getSoundPosition($name:String):Number
		{
			return this._soundsDict[$name].channel.position;
		}
		/**
		 * Gets the duration of the specified sound.
		 *
		 * @param $name The string identifier of the sound
		 *
		 * @return Number The length of the sound, in milliseconds
		 */
		public function getSoundDuration($name:String):Number
		{
			return this._soundsDict[$name].sound.length;
		}
		/**
		 * Gets the sound object of the specified sound.
		 *
		 * @param $name The string identifier of the sound
		 *
		 * @return Sound The sound object
		 */
		public function getSoundObject($name:String):Sound
		{
			return this._soundsDict[$name].sound;
		}
		/**
		 * Identifies if the sound is paused or not.
		 *
		 * @param $name The string identifier of the sound
		 *
		 * @return Boolean The boolean value of paused or not paused
		 */
		public function isSoundPaused($name:String):Boolean
		{
			return this._soundsDict[$name].paused;
		}
		/**
		 * Identifies if the sound was paused or stopped by calling the stopAllSounds() or pauseAllSounds() methods.
		 *
		 * @param $name The string identifier of the sound
		 *
		 * @return Number The boolean value of pausedByAll or not pausedByAll
		 */
		public function isSoundPausedByAll($name:String):Boolean
		{
			return this._soundsDict[$name].pausedByAll;
		}
//- EVENT HANDLERS ----------------------------------------------------------------------------------------
//- GETTERS &amp; SETTERS -------------------------------------------------------------------------------------
		public function get sounds():Array
		{
			return this._sounds;
		}
//- HELPERS -----------------------------------------------------------------------------------------------
		public function toString():String
		{
			return getQualifiedClassName(this);
		}
//- END CLASS ---------------------------------------------------------------------------------------------
	}
}
Monday, January 12th, 2009


(use arrow keys and spacebar to control the red ball)

A new 3d physics library is under development and in early stages called jiglibflash.  Like the Box2D ports it is based on a C++ library of the same name called jiglib, only this is 3D instead of 2D.  It is similar in purpose to WOW Engine which is the other current open source 3d flash physics engine.  For more on this toolkit see the links below.

UPDATE: katopz has also ported this to use Away3D as the renderer.

UPDATE: Also updated for the sandy3d engine as the renderer.

Sunday, December 14th, 2008

Unity3D is a great platform for developing 3d games where you need hardware acceleration beyond what Flash 3d can give you for the web.

There are lots of great independent gaming companies and web gaming companies realizing this and here in the #phx Arizona market a few good ones including Flashbang Studios on their Unity3D gaming site Blurst. I have been developing Unity3D for about 6 months and it is great where you want 3d environments over 2000 polys for the web.  The power of 3d hardware rendering on the web combined with a great development environment is making it possible to make really fun games with unity3d.

Unity3D Games Released Recently

Flashbang recently released Minotaur China Shop to add to their Blurst.com site of Unity3D games and community. They detailed the launch day at their blog.  It is a pretty fun game and once you get further into the game design with different paths, selling products or thrashing your china shop for insurance and strategic upgrades it has legs to keep interest.

Minotaur China Shop Trailer

[vimeo]http://vimeo.com/2474951[/vimeo]

There are lots of great Unity 3d games out there here is a list of the best of 2008:

      [source]

      Friday, November 28th, 2008

      I am working with lots of content now that is flash and unity3d in game development for the web, and occasionally systems built in flash, javascript or other have to communicate with Unity3D and vice versa.  You can do this from the server side (WWW/WWWForm class or sockets) OR you can also communicate client side for many things such as sending name value pairs or variables into Unity3D, Flash or the javascript in page as needed. There are some great tools like UnityObject that is like swfobject (only you have to update it to work with latest browsers) that make this more simple to send in params and messages. The same can be applied to Silverlight. It is pretty simple all in all but having a sample to start with is good with all these technologies.

      Paul Tondeur threw togetother a little sample that shows how you can integrate Unity3D, Flash and javascript in the page fairly simply with lots of great demos.  It really is just about passing parameters around into the objects from javascript, then within Flash calling ExternalInterface to call external javascript or within Unity3D calling Application.ExternalCall.

      //Flash adding callback for javascript code
      ExternalInterface.addCallback("functionNameInBrowser", functionNameInFlash );
      //Unity3D calling javascript code
      Application.ExternalCall("javascriptFunction", "Parameter1");

      Nothing too tasking but if you want to see samples of this working together from flash, flex, javascript, unity3d then check it out. Zip on over to Paul’s site to grab the files and more demos and samples. All examples are bundled in one download, which includes all the Unity3D, Flash, Flex, Actionscript and Javascript files.

      Here’s some demos

      Saturday, October 11th, 2008


      as3isolib is a great isometric library for actionscript 3
      by Justin Opitz.  This is a lower level isometric library that could be used in building your own isometric gaming engine or learning more about the popular isometric view in games or other flash content.

      From building basic blocks…

      To constructing sprites and objects with individual iso objects with their own bounding boxes.


      This sample shows a two piece tree, a common issue with sprites in isometric is where to slice them up.  This sample shows a tree with the leaves able to be in front of a character so that you could walk under the tree and be in front of the trunk but covered by the trees.  Essentially height is respected.

      Sample code for the tree tutorial:

      package
      {
      import as3isolib.display.IsoSprite;
      import as3isolib.display.primitive.IsoBox;
      import as3isolib.display.scene.IsoGrid;
      import as3isolib.display.scene.IsoScene;
       
      import flash.display.Loader;
      import flash.display.Sprite;
      import flash.events.Event;
      import flash.net.URLRequest;
       
      public class IsoApplication extends Sprite
      {
       private var scene:IsoScene;
       private var assets:Object;
       
       private var loader:Loader
       
       private function loadAssets ():void
       {
        loader = new Loader();
        loader.contentLoaderInfo.addEventListener(Event.INIT, loader_initHandler);
        loader.load(new URLRequest("assets/swf/assets.swf"));
       }
       
       private function loader_initHandler (evt:Event):void
       {
        buildScene();
       }
       
       private function buildScene ():void
       {
        scene = new IsoScene();
        scene.hostContainer = this;
        scene.container.x = 200;
        scene.container.y = 200;
       
        var treeTrunkClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("TreeTrunk") as Class;
        var treeLeavesClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("TreeLeaves") as Class;
       
        var grid:IsoGrid = new IsoGrid();
        grid.showOrigin = false;
        scene.addChild(grid);
       
        var s0:IsoSprite = new IsoSprite();
        s0.setSize(25, 25, 65);
        s0.moveTo(50, 50, 0);
        s0.sprites = [treeTrunkClass];
        scene.addChild(s0);
       
        var s1:IsoSprite = new IsoSprite();
        s1.setSize(125, 125, 100);
        s1.moveTo(0, 0, 75);
        s1.sprites = [treeLeavesClass];
        scene.addChild(s1);
       
        scene.render();
       }
       
       public function IsoApplication ()
       {
        loadAssets();
       }
      }
      }

      current features

      • simple scene creation
      • 3 primitive types
      • base class for displaying user-created content
      • plenty of styling option on vector based primitives
      • integrates well with a variety of tween engines
      • standard 3D isometric positional sorting

      So get busy building the flash version of roller coaster tycoon…

      Thursday, October 9th, 2008

      Google has entered the flash gaming ads market.  Right now that is pretty much owned by MochiAds for flash game devleopers at least pre-game ads anyways.  Advertising can be annoying but MochiAds has pulled it off where the ads are usually advertising other games or interesting things and it monetizes game development for Flash, Unity3D, Director and others, which is a win.  There are many flash gaming sites that are great fun that use ads almost stylistically like Nitrome and typically the ads are pretty fast when they are during the game loading.

      Although advertisements in games have long been a scurge on gamers fun when they are trying to insert them into fat client, immersive MMOGs where it totally takes away from the experience, that doesn’t work.

      What does work is stuff like MochiAds and possibly Second Life type sponsorships, where advertisements are almost nostalgic or fun and integrated. Developers and publishers have to make money somehow, the better the experience the more impactful and the more games for all. The key is making the integration a good user experience.

      We shall see how Google plans to do this.  This might go along with their Lively strategy. The ad market entrance in games is possibly what started the rumors that Google was going to buy Valve for Steam, rumors which quickly died down.

      Anyways, the one good thing about this announcement is advertisments go to where the eyes and crowds are going or already at, they are apparantly going massively to online web games and causal experiences make for easy advertisment integration. TV, Radio and many other industries have been supported by advertisement interest due to consumers using and buying the content.  So online gaming is just another one of those entertainment industries and it will grow further with this news.

      Friday, September 12th, 2008

      A few weeks ago the makers of Unity3d released some really valuable information about casual gaming and general hardware of users that play online games.  It was an interesting report and very beneficial to developers on the Unity platform and others.  We wish other plugin makers would do the same in such a thorough method.

      Unity 3d creators listened to the market and have now posted updated numbers and information as well as a page that quarterly stats will be updated. Check the new, quarterly, hardware of the casual gamer stats.

      I would have seen this earlier but I have been deep in a Unity 3d project myself :) .  I am a big fan of all web based gaming platforms and Unity is almost a dream come true for 3d web gaming.  For the company to be this open that is a very good sign.

      What can you do with Unity3D?  Here is a list of games made with Unity3D on the web.  The one great thing about this platform is that is was made for gaming specifically from the start.  Simulations and game development with Unity3D is very fun and productive. I still love Flash, Director etc but Unity3D development is now very much in my rotation.

      Games made with Unity3D:

      Hancock Movie Games

      Tennis Stars Cup

      Duckateers

      Temploe (ninjas attack you)

      RC Laser Warrior

      Urban Race Star

      FlashBang studios

      TraceON

      EPIC Tower Defense

      InvinciCar

      Besmashed (multi)

      Global Conflicts

      Phoenix Final

      Doom Siege

      Mario Galaxy like run (third one down)

      Zombie Drive

      Pocket Piglets

      ChickenDemo

      Castle Conquest

      Tuesday, August 5th, 2008

      Here are some really stylish and well done uses of Papervision 3D to make fun games. The people at Bloc recently launched Meta4orce, a unique interactive sci-fi TV show site with some great and numerous uses of papervision 3d.  My favorite is the tron like style and the tower defense game called shock to the system.

      Shock to the system

      Mako User Interface

      Deadsphere Pt. I

      and many more check them out at Iain Lobb.

      Saturday, August 2nd, 2008

      Making great games, applications and tools using flash, silverlight or other tools that are emerging such as Unity3D takes great style, effort and knowing your target. We need to know what the end-user machine has at hand.  The Unity 3d guys put together a great post on the capabilities of casual gaming machines. With all the talk about flash 3d, unity3d and silverlight what level are you targeting and what group of people can actually PLAY your games as you envision.

      Pretty much everyone knows Valve’s hardware survey – it’s a very valuable resource that shows what hardware the typical “hardcore PC gamer” has (that is, gamers that play Valve’s games).

      However, the “casual gamer”, which is what Unity games are mostly targeted at, probably has slightly different hardware. “Slightly” being a very relative term of course.

      Lo and behold – we have a glimpse into that data.

      How? First time the Unity Web Player is installed, it submits anonymous hardware details (details in the EULA). This happens only once, and contains no personally identifiable information. It’s much like visitor statistics trackers on the websites that gather your OS, browser information and whatnot.

      Remember, all this data is from people who installed Unity Web Player (most likely because they wanted to play some Unity content on the web). Hardware of standalone game players might be different, and hardware of your game’s players might be different as well. The data set is well over a million samples at the moment.

      Check out the full stats here.

      The most interesting stats to me:

      OS Platforms

      Windows 96.8%

      Mac OS X 3.2%

      CPU Core count overall

      1 54.7%

      2 44.1%

      4 1.1%

      8 .1%

      Wow this one is surprising, but with the type of gamer that will play and download a quality new plugin to get to a game, maybe not.  They need to have the latest and greatest.  Multi-core processors have been selling for about 2-3 years so this is a continuing trend that will make Flash 3d and even plugins like Unity 3d better over the short term.

      Also when you check it over at Unity Blog note the top cards, it is a bit painful if you are a casual gamer developer.  Not a decent card in the top 10-15. But that is changing rapidly over the next 1-2 years in this regard. But this also vyes well for flash based games that rely on dual core software rendered results right now as a decent constraint for developers to keep content painfully accessible to all states of machinery out there.

      I wonder if this information is available on the flash player and public? This is specific to the Unity 3D plugin that is also a bit of a different market that is willing to install a plugin for better experiences.  With Flash it is usually preinstalled or auto updated for a casual user and might be different as Flash has a 98% penetration rate.  Or for that matter the Director users which would be more gaming focused which amout ot about 40% of internet users.  But as with the case of Unity it is specific to games right now and a small penetration rate, Flash is also apps, ads, tools, demos, interactives in addition to games.  Having this information on Flash or Director would be nice.