JScript problem

hi,

I have a weird problem. I sometimes need to import Blender Shape keys into Unity, and I always used MetaMorph developed by Foolish Frost without problem. In one recent project, however, I got tons of compiling errors. I finally got around by modifying an old project with a working MetaMorph script into the new one. But the problem kept gnaw at me and I feel uneasy not knowing what’s wrong. I included both the error messages from one function and the corresponding function definition below. Hopefully someone can tell me what’s wrong.

Jason

-----CompilerOutput:-stderr----------
-----EndCompilerOutput---------------

  • Finished compile Library/ScriptAssemblies/Assembly-UnityScript-firstpass.dll
    Assets/Standard Assets/Scripts/MetaMorph.js(311,74): BCE0019: ‘length’ is not a member of ‘Object’.

(Filename: Assets/Standard Assets/Scripts/MetaMorph.js Line: 311)

Assets/Standard Assets/Scripts/MetaMorph.js(313,96): BCE0048: Type ‘Object’ does not support slicing.

(Filename: Assets/Standard Assets/Scripts/MetaMorph.js Line: 313)

Assets/Standard Assets/Scripts/MetaMorph.js(318,98): BCE0048: Type ‘Object’ does not support slicing.

(Filename: Assets/Standard Assets/Scripts/MetaMorph.js Line: 318)

Assets/Standard Assets/Scripts/MetaMorph.js(329,70): BCE0004: Ambiguous reference ‘parseFloat’: UnityScript.Lang.UnityBuiltins.parseFloat(double), UnityScript.Lang.UnityBuiltins.parseFloat(int), UnityScript.Lang.UnityBuiltins.parseFloat(String), UnityScript.Lang.UnityBuiltins.parseFloat(float).

(Filename: Assets/Standard Assets/Scripts/MetaMorph.js Line: 329)

Assets/Standard Assets/Scripts/MetaMorph.js(331,97): BCE0048: Type ‘Object’ does not support slicing.

(Filename: Assets/Standard Assets/Scripts/MetaMorph.js Line: 331)

Assets/Standard Assets/Scripts/MetaMorph.js(336,101): BCE0004: Ambiguous reference ‘parseFloat’: UnityScript.Lang.UnityBuiltins.parseFloat(double), UnityScript.Lang.UnityBuiltins.parseFloat(int), UnityScript.Lang.UnityBuiltins.parseFloat(String), UnityScript.Lang.UnityBuiltins.parseFloat(float).

(Filename: Assets/Standard Assets/Scripts/MetaMorph.js Line: 336)

Assets/Standard Assets/Scripts/MetaMorph.js(369,66): BCE0048: Type ‘Object’ does not support slicing.

function ReadAnimationFile(datafile : TextAsset) : Array
{
	// This read blender 3d ShapeKeys that have been exported with the diffmap.
	// It's a good idea for each animation to contained in it's own file under it's own name.
	Report("Loading Animation Recording: " + datafile.name, 2);
	var Animation_Array = new Array();
	//var Total_String = datafile.text;
		
	var Total_Array = new Array();
	Total_Array = datafile.text.Split("

"[0]);

	var line : int;
	for ( line = 0 ; line<Total_Array.length ; line=line+1 )
	{
		var Line_String : String = Total_Array[line];
		
		// parse out all the crap.
		var boo = Regex.Match(Line_String,"(\\[|\\])");
		if (boo.Success)
		{
			Line_String = Regex.Replace(Line_String,"(

|\r|\f)“,”“);
Line_String = Regex.Replace(Line_String,”(\[|\])“,”“);
Line_String = Regex.Replace(Line_String,”\s*(,)\s*“,”|“);
Line_String = Regex.Replace(Line_String,”'“,”");

			var Line_Array = new Array();
			Line_Array = Line_String.Split("|"[0]);
			
			var item : int;
			
			// We really want the floating point numbers to be stored as floating points, and not strings...
			if (Animation_Array.length == 0)
			{
				Animation_Array.Add(Line_Array);
				
				var Line_Array2 = new Array();
				for ( item = 0 ; item<Animation_Array[0].length ; item=item+1 ) // Line 311
				{
					var Found : int = FindName( Diff_Maps, [Animation_Array[0][item]] ); // Line 313
					if ( Found != -1)
					{
						Line_Array2.Add(Found); // Writing line two, the diff map indexes.  Faster than name lookups per frame.
					} else {
						Report("ERROR: Morph not found" + Animation_Array[0][item], 0); // Line 318
						Debug.Break();
					}
				}
				Animation_Array.Add(Line_Array2);
				
			}
			else
			{
				for ( item = 0 ; item<Line_Array.length ; item=item+1 )
				{
					Line_Array[item] = parseFloat(Line_Array[item]); // Line 329
					
					var Found2 : int = FindName( Diff_Maps, [Animation_Array[0][item]] ); // Line 331
					if ( Found2 != -1)
					{
						if (Animation_Array.length == 2 && Diff_Maps[Found2].DM_Multiplier == 0)
						{
							Diff_Maps[Found2].DM_Multiplier = parseFloat(Line_Array[item]); // Line 336
						}
					}
				}
				Animation_Array.Add(Line_Array);
			}
		}
	}
	
	return Animation_Array;
}

All of the error messages you posted are really the same problem appearing in different forms. The problem is that the standard array class doesn’t return an array, an animation, a String, a number, or anything really usable. It returns a generic Object. The only thing the program knows about this object that it’s a packet of data in Unity. Not terribly useful.

Here’s my recomendations:

  • DON’T use the Array() class if you can avoid it. I’ve never gotten it to work. ever. Use standard “built-in” arrays.
  • Declare the contents of your arrays explicitly.

For example, if you want to work with a 2-d Array of Strings, try this:

    var myArray : String[,] = new String[4,2];
    myArray[0,1] = "A string";

    for(var X : int = 0; X < myArray.Length(0); X++)
        for(var Y: int = 0; Y < myArray.Length(1); Y++)
        {
            myArray[X,Y] = "(" + X + ", " + Y + ")";
            Debug.Log(myArray[X,Y]);
        }

If you replace Every instance of the Array() class with a builtInArray, then your problems should go away.