DEV STUFF

Damien Pegoraro

Scaleform, Unity3D & FlashDevelop

scaleform

If you’ve ever tried building GUI with Unity3D, you may know how painful it can be.
Made by Autodesk, Scaleform gives you the ability to add a Flash layer to your 3D projet to make things easier.

Here’s a little walthrough to start creating GUI in a Unity + Flash Develop context.

This tutorial is meant to be as simple as possible and is focused on the workflow. No big code involved!

First of all, download an evaluation copy of Scaleform and unzip it somewhere. (give a valid mail to grab your licence key).

http://gameware.autodesk.com/scaleform/public/downloads

Scaleform Public SDK Downloads  Autodesk Gameware - Google Chrome

Create a new Unity3D project without using any default package.

Import Scaleform unitypackage to your project.

Assets -> Import package -> custom package -> your Scaleform_Unity_Integration-Evaluation.unitypackage

This operation may take a while. Grab a coffee.

If this error shows up, just forget it, we don’t care about 3DS max for now.

3ds Max could not be found.
Make sure that 3ds Max is installed and the max file has 3ds Max as its ‘Open with’ application!

Let’s try the sample scene:

Open Assets/scenes/main_level , don’t save your empty useless opened scene, and hit run.

Play with the demo to get a quick overview of the features :

– Sweet fonts, render textures, 3D-> flash -> 3D interactions …

Unity - main_level.unity - TutoScaleform - PC, Mac & Linux Standalone

My Unity was crashing at this point because of some DX11 issue. I just had to convert my project to DX9 :

Edit -> Project Settings -> Player -> untick use Direct3D 11

That’s cool, but what we’re really trying to achieve is building our first GUI from scratch.

Now let’s create our own scene named myfirstgui in Assets/scenes.

What we’re trying to achieve is a SWF gui with a button calling a Unity method.
This method will invoke some callback on our SWF.

First of all, create a C# script that will be the proxy for our SWF:

Assets/scripts/ScaleFormGUI.cs

using System;
using System.Collections;
using UnityEngine;
using Scaleform;

public class ScaleFormGUI : Movie {

protected Value theMovie = null;
private SFCamera parent = null;

public ScaleFormGUI(SFCamera parent, SFManager sfmgr, SFMovieCreationParams cp) :
base(sfmgr, cp)
{
this.parent = parent;
SFMgr = sfmgr;
this.SetFocus(true);
}

public void OnRegisterSWFCallback(Value movieRef)
{
Debug.Log("SWF REGISTERED") ;
theMovie = movieRef;
}

public void TestCallback()
{
Debug.Log("CALLED ") ;
theMovie.Invoke("fromUnity");
}

}

We put two callbacks : OnRegisterSWFCallback will be called when swf is ready, TestCallback will be called on mouse click.

We then have to write a Scaleform camera script :

using UnityEngine;
using System.Runtime.InteropServices;
using System;
using System.IO;
using System.Collections;
using Scaleform;

public class ScaleformCamera : SFCamera {

public ScaleFormGUI myGUI = null ;

new public IEnumerator Start()
{
// The eval key must be set before any Scaleform related classes are loaded, other Scaleform Initialization will not
// take place.
#if (UNITY_STANDALONE_WIN || UNITY_STANDALONE_OSX || UNITY_EDITOR) && !UNITY_WP8
SF_SetKey("XDXSTZCND3W*************9TETWFON4J434KHRLA6DB96KV");
#elif UNITY_IPHONE
SF_SetKey("");
#elif UNITY_ANDROID
SF_SetKey("");
#elif UNITY_WP8
sf_setKey("");
#endif

InitParams.TheToleranceParams.Epsilon = 1e-5f;
InitParams.TheToleranceParams.CurveTolerance = 1.0f;
InitParams.TheToleranceParams.CollinearityTolerance = 10.0f;
InitParams.TheToleranceParams.IntersectionEpsilon = 1e-3f;
InitParams.TheToleranceParams.FillLowerScale = 0.0707f;
InitParams.TheToleranceParams.FillUpperScale = 100.414f;
InitParams.TheToleranceParams.FillAliasedLowerScale = 10.5f;
InitParams.TheToleranceParams.FillAliasedUpperScale = 200.0f;
InitParams.TheToleranceParams.StrokeLowerScale = 10.99f;
InitParams.TheToleranceParams.StrokeUpperScale = 100.01f;
InitParams.TheToleranceParams.HintedStrokeLowerScale = 0.09f;
InitParams.TheToleranceParams.HintedStrokeUpperScale = 100.001f;
InitParams.TheToleranceParams.Scale9LowerScale = 10.995f;
InitParams.TheToleranceParams.Scale9UpperScale = 100.005f;
InitParams.TheToleranceParams.EdgeAAScale = 0.95f;
InitParams.TheToleranceParams.MorphTolerance = 0.001f;
InitParams.TheToleranceParams.MinDet3D = 10.001f;
InitParams.TheToleranceParams.MinScale3D = 10.05f;

InitParams.UseSystemFontProvider = false;
return base.Start();
}

new public void Update()
{
CreateGameHud();

}

private void CreateGameHud()
{
if (myGUI == null)
{
myGUI = Util.CreateSwf("mygui.swf", true, new Color32(255, 255, 255, 0));
}
else
{
myGUI.SFMgr.ProcessCommands() ;
}

}
}

Replace your licence key and attach this script to your camera.

We now have to make our mygui.swf with a single button. So let’s create a new AS3 FlashDevelop project.

Here’s my Main.as :

package
{
import flash.display.Sprite;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.external.ExternalInterface;

public class Main extends Sprite
{

private var s:Sprite;

public function Main():void
{
stage.scaleMode = StageScaleMode.NO_SCALE ;
stage.align = "TL" ;
init() ;
}

private function init():void
{
s = new Sprite() ;
addChild( s) ;

s.graphics.beginFill( 0x00FF00 ) ;
s.graphics.drawCircle( 200, 200, 50 ) ;
s.graphics.endFill() ;
s.addEventListener(MouseEvent.CLICK, callUnity ) ;

if ( ExternalInterface.available ){
ExternalInterface.call ("OnRegisterSWFCallback", this);
}
}

private function callUnity(e:MouseEvent):void
{
trace("click") ;
if ( ExternalInterface.available ) ExternalInterface.call("TestCallback") ;
}

public function fromUnity( ) : void
{
s.graphics.clear() ;
s.graphics.beginFill( Math.random() * 0xFFFFFF ) ;
s.graphics.drawCircle( 200, 200, 50 ) ;
s.graphics.endFill() ;
}
}

}

Just notice that calling a Unity method is the same thing as calling a Javascript method with ExternalInterface. Methods that will be called from Unity must be declared as public.

We made a code with a round button that calls a Unity method. This method calls flash again to change the button’s color to random.

Don’t forget to set the output in your Unity project StreamingAssets folder and build your swf.

Now we just have to run our Unity projet and if everything’s okay, clicking the green button should change it’s color.

You should see something like that:

Unity - myfirstgui.unity - TutoScaleform - PC, Mac & Linux Standalone_2

I added a cube on my scene just to show that there’s 3D running in the background…

Note that flash trace calls will be redirected to Unity debug console.

That was pretty easy! Tell me if you read something unclear or wrong!

1,454 Comments on “Scaleform, Unity3D & FlashDevelop

  1. [url=http://levitrabest.us.org/]levitra[/url] [url=http://azithromycinbest.us.org/]azithromycin 500 dosage online pharmacy[/url] [url=http://synthroidbest.us.org/]synthroid levothyroxine[/url] [url=http://sildenafilbest.us.org/]sildenafil citrate[/url] [url=http://inderalbest.us.com/]inderal la 60mg[/url] [url=http://1stlevitra.com/]price of levitra 20 mg[/url] [url=http://1stacyclovir.com/]cheap acyclovir online[/url] [url=http://nolvadexbest.us.org/]buy nolvadex without prescription[/url] [url=http://1stprednisone.com/]prednisone[/url] [url=http://1stmetformin.com/]metformin prices[/url]

  2. What as up everyone, I am sure you will be enjoying here by watching these kinds of comical movies.

  3. [url=http://paxilbest.us.org/]PAXIL 40 MG[/url] [url=http://xenicaloffers.us.org/]buy cheap xenical[/url] [url=http://acyclovirbest.us.org/]acyclovir[/url] [url=http://sildenafilbest.us.org/]sildenafil citrate generic[/url] [url=http://nolvadexbest.us.org/]nolvadex d[/url] [url=http://azithromycinbest.us.org/]Azithromycin[/url] [url=http://1stsynthroid.com/]generic for synthroid[/url] [url=http://xenicalbest.us.org/]Orlistat Over The Counter[/url] [url=http://phenerganbest.us.com/]Phenergan[/url] [url=http://1stdoxycycline.com/]doxycycline[/url]

  4. Hello. I have checked your babeuf.net and i see you’ve got some duplicate content so
    probably it is the reason that you don’t rank high in google.

    But you can fix this issue fast. There is a tool that generates
    content like human, just search in google: miftolo’s tools

  5. [url=http://levitrabest.us.org/]med price levitra[/url] [url=http://cafergotbest.us.org/]click this link[/url] [url=http://acyclovirbest.us.org/]homepage[/url] [url=http://1stprednisone.com/]Prednisone 2.5 Mg[/url] [url=http://tadalafilbest.us.com/]Cheap Tadalafil 20mg[/url] [url=http://azithromycinbest.us.com/]price of azithromycin[/url] [url=http://mobicbest.us.com/]MOBIC 15MG[/url] [url=http://1stretina.com/]order retin a without a prescription[/url] [url=http://1stdoxycycline.com/]where to purchase doxycycline[/url] [url=http://xenicalbest.us.com/]buy xenical cheap[/url]

  6. That is a good tip particularly to those new to the blogosphere.
    Short but very precise info… Many thanks for sharing this one.
    A must read post!

  7. It as genuinely very complex in this busy life to listen news on TV, thus I only use internet for that purpose, and get the most up-to-date news.

  8. This is really interesting, You are a very skilled blogger. I have joined your rss feed and look forward to seeking more of your great post. Also, I have shared your website in my social networks!

  9. Skill without imagination is craftsmanship and gives us many useful objects such as wickerwork picnic baskets. Imagination without skill gives us modern art.

  10. Register a domain, search for available domains, renew and transfer domains, and choose from a wide variety of domain extensions.

  11. [url=http://buypropecia.us.com/]propecia pills[/url] [url=http://albuterolgenericonline.com/]Albuterol[/url] [url=http://prozacgenericbuy.com/]prozac 20 mg[/url] [url=http://furosemide.in.net/]furosemide[/url] [url=http://ampicillin.us.org/]ampicillin tablets[/url] [url=http://baclofen.in.net/]baclofen online[/url] [url=http://buysuhagra.us.org/]silagra[/url] [url=http://buymetformin.us.com/]Buy Metformin[/url] [url=http://kamagrabest.us.org/]kamagra[/url] [url=http://baclofenbest.us.org/]BACLOFEN PRICE[/url]

  12. I truly appreciate this post. I have been looking all over for this! Thank goodness I found it on Google. You have made my day! Thank you again.

  13. This website was how do you say it? Relevant!! Finally I ave found something that helped me. Thank you!

  14. [url=http://xenicalgenericbuy.com/]xenical[/url] [url=http://vardenafilgenericbuy.com/]purchase vardenafil[/url] [url=http://albuterolgenericonline.com/]Ventolin Albuterol Inhaler[/url] [url=http://vermoxbest.us.com/]vermox[/url] [url=http://avodartbest.us.com/]cost of avodart[/url] [url=http://furosemide.in.net/]furosemide 20 mg[/url] [url=http://propranolol.in.net/]propranolol[/url] [url=http://buypropecia.us.com/]visit your url[/url] [url=http://clonidinebest.us.com/]Clonidine 0.1 Mg Oral Tablets[/url] [url=http://buymetformin.us.com/]metformin pharmacy[/url]

  15. This blog is without a doubt educating as well as factual. I have picked up a lot of interesting stuff out of this amazing blog. I ad love to return again soon. Cheers!

Leave a Reply

Your email address will not be published. Required fields are marked *