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!

24 Comments on “Scaleform, Unity3D & FlashDevelop

  1. Hi thanks for for everything…man! This rocks! A bit outdated, but I am a caveman too. Unity can make its own as I guess you already know. This however rocks, because I have used Flash for school some time ago. Animating was fun and adding script too was fun. I guess Flash isn’t dead for us ole timers depending how you see it and I am 35, born in November! Tech vs Art. It a memory. But memories get talked about and stimulate Brain dendrite synaptic connections at the burst and speed of light. UDK used scaleform back when I went to AIPOD. A school that liked UDK a lot among the professors. I made an example of such from a tutorial I saw. Please write more as an editorial on this? Its nostalgic and necessarily needed for geeks and nerds who love auto junk yards but for scripting and programming. I imagine. Since I used Flash Develop to do it in last time. Lol, now I am on Ubuntu. This flash thing does it crash the finicky Unity3d on Linux installs?

    Bao-Nguyen Doan
    Game artist
    (WIP: Tower Defense using unity)

  2. I have noticed you don’t monetize your blog, don’t waste your traffic, you can earn additional cash every month because you’ve got hi quality content.
    If you want to know how to make extra $$$, search for:
    Ercannou’s essential adsense alternative

  3. I have been surfing on-line more than 3 hours these days,
    but I never discovered any fascinating article like yours.
    It is beautiful worth enough for me. Personally, if all website owners and bloggers made just right content
    material as you probably did, the web will likely be much more
    helpful than ever before.

  4. Hi. I see that you don’t update your website too often. I know that writing content is time consuming and boring.
    But did you know that there is a tool that allows you to create new posts using existing content (from
    article directories or other blogs from your niche)?
    And it does it very well. The new posts are unique and pass the copyscape test.
    You should try miftolo’s tools

  5. Hi admin. It was hard to find this site in google.

    It’s not even in top10. You should focus on hq backlinks from high
    authority websites in your niche. I know of a very effective free
    method to get strong links and instant traffic. The best thing about
    this method is that you start getting clicks right away.
    For more info search in google for: masitsu’s tricks

  6. DreamProxies – Cheapest USA Private Proxies: Top notch superior, Indefinite data transfer rate, 1000 mb/s superspeed, 99,9 uptime, Neo constant IP’s, Zero application limits, A number of subnets, USA or The european countries proxies – Obtain Currently – DreamProxies.com

  7. Hey. I want to share with all the great news!

    A month ago an anonymous source sent me 7 bitcoins of wallets that double the bitcoins you sent and send back your purses twice as much.

    I am familiar with blockchain technology and therefore did not believe it.

    But my curiosity has gone up.

    I sent at my own risk and 0.5 bitcoins to one of these wallets and in just 2 hours, exactly 1 bitcoin came to my wallet.

    I was shocked!

    Then I started working with these bitcoins wallets and revealed the regularity that one wallet can send 0.5 to 5 bitcoins per day from one purse.

    At the moment I have 350 bitcoins of wallets from which I send 350 – 700 bitcoins daily and get twice as much.

    For a month, I became a multimillionaire.

    Another month I will work and become a billionaire.

    I already got what I wanted, I quit my job, paid off all my debts, bought a good house and a car from the Audi RS4.

    Now I feel like a human being and live for my own pleasure.

    These are the good bitcoins of wallets I earn:

    16mKn71otoYgAxij3y6MuCkWKco7MEa7Rn

    18WWctFEVNhLJKcg14wmykymx3kySuyTLy

    1BC2uQHHUdJzgRog7JMVE5cgWh37NCxwJc

    1L2NgRwBXb5kiQ4uNDT5iKHN1As6kkt4rL

    17dvrJFxoXA6dDxeGoLx3iVp7ogcbvr2nN

    1CnZgLpuPhr9e5PhPEJnDS8fh8HCM5w5oz

    1MaRdde6X7SGuoCdFNL2fmgpLomdx7peGC

    Now many people improve their financial status with these wallets but keep it a secret from everyone.

    I hate poverty, so I share with you all this method of earning, grab a piece of this huge and juicy cake.

    I will remind you once again. Send from one bitcoin your wallet strictly from 0.5 to 5 bitcoins per wallet per day, otherwise you will receive the same amount that you sent without doubling.

    This scheme of work is completely safe. You can work like me, create a lot of wallets and send them from each of them to the above wallets.

Leave a Reply

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