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!

640 Comments on “Scaleform, Unity3D & FlashDevelop

  1. What as up, I log on to your blogs on a regular basis. Your humoristic style is awesome, keep up the good work!

  2. Only wanna comment that you have a very decent website , I like the style and design it actually stands out.

  3. I think other web-site proprietors should take this website as an model, very clean and great user friendly style and design, as well as the content. You are an expert in this topic!

  4. Thank you a lot for giving everyone a very marvellous chance to read in detail from this site. It is always so cool plus stuffed with fun for me and my office fellow workers to search your website at the least three times in one week to see the fresh issues you have. Not to mention, I’m also certainly satisfied with all the incredible hints served by you. Some 1 ideas in this post are indeed the most suitable we have all had.

  5. Well I sincerely liked studying it. This tip offered by you is very practical for correct planning.

  6. It as difficult to It as difficult to acquire knowledgeable people on this topic, nevertheless, you sound like you know what you are dealing with! Thanks

  7. Major thanks for the article post.Really looking forward to read more. Keep writing.

  8. There is apparently a lot to know about this. I consider you made various good points in features also.

  9. It as hard to find experienced people for this subject, but you sound like you know what you are talking about! Thanks

  10. I needed to send you the tiny observation to be able to say thank you once again for your personal superb principles you have shown at this time. It was quite wonderfully generous of people like you to give unhampered all many of us could have distributed for an electronic book in order to make some dough for their own end, mostly seeing that you could have done it in the event you considered necessary. The tricks additionally served to become good way to be sure that some people have a similar zeal just as my very own to find out somewhat more on the subject of this matter. I am certain there are thousands of more pleasant occasions ahead for individuals that scan your blog.

Leave a Reply

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