Friday, December 5, 2014

Unity3D language communication C#, JS

        Hmm.. problem is you have a code written in javascript and most of your codes written in c# and you really want to use javascript with your c# script or other way around. Is there way to do that. Of course you can. Unity3d has this special topic in their documentation [Special Folders and Script Compilation Order].

Simplified note
  • If you want to use javascript on your c# script javascript need to compile before the c# script.
  • There are some special folders to do that (compilation folder order)
    1. Standard Assets
    2. Pro Standard Assets
    3. Plugins
    4. Editor
    5. Other folders will compile last
  • Lets see a simple cube moving example for this c# and javascript communication.
Setting up the environment
  1. Add a cube game object
  2. Add a empty game object called JavaScriptComponent (This is for attach js)
  3. Add a folder name called Script (to put our calling scripts)
  4. Add a folder name called Standard Assets or Plugins (Any one of the special folder)

How to call a javascript from c# script

  • The JavaScript
  1. Go to Input.GetAxis documentation sample and grab the JS version of the code.
  2. Make the rotation & translation variables global.
  3. Add 2 public functions call getRotation(), getTranslation() that returns rotation & translation
  4. Save the script inside Standard Assets
  5. Attach this script to JavaScriptComponent empty gameobject
  6. Find the code snippet of the MoveScript.js
      //[code snippet from]
 // A very simplistic car driving on the x-z plane.
 var speed : float = 10.0;
 var rotationSpeed : float = 100.0;
 private var translation : float;
 private var rotation : float;
 function Update () {
  // Get the horizontal and vertical axis.
  // By default they are mapped to the arrow keys.
  // The value is in the range -1 to 1
  translation = Input.GetAxis ("Vertical") * speed;
  rotation = Input.GetAxis ("Horizontal") * rotationSpeed;
  // Make it move 10 meters per second instead of 10 meters per frame...
  translation *= Time.deltaTime;
  rotation *= Time.deltaTime;
 //We are going to access these 2 methods from csharp script
 public function getRotation(){
  return rotation;
 public function getTranslation(){
  return translation;
  • The CSharp Script
  1. So now we know which game object holds our javascript.
  2. Use GameObject.Find ("JavaScriptComponent").GetComponent<MoveScriptJs>();  this code to get the js script reference.
  3. Attach the script to the Cube game object
  4. Find the Player.cs code snippet.
using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour {

 private MoveScriptJs javaScript;

 // Use this for initialization
 void Start () {
  javaScript = GameObject.Find ("JavaScriptComponent").GetComponent<MoveScriptJs>();
 // Update is called once per frame
 void Update () {
  // Move translation along the object's z-axis
  transform.Translate (0, 0, javaScript.getTranslation());
  // Rotate around our y-axis
  transform.Rotate (0, javaScript.getRotation(), 0);

Now you can run the scene and see cube can be rotate and move, Most part of the code is done by javascript. Only rotation and transform floating point values are applying to this game object vectors by using c# script.How cool is that. Yes I know, this is a stupid way to move a game object but I wanted to show a kinda complex example and in next tutorial I want to show how to use the unity standard asset mobile joystick with c# script. The problem is unity ships this joystick assets with only javascript so how do we use this for mobile game that programmed using c# ? I know if you had follow this tutorial properly you can do it alone :) #happyCoding

Download the unity3d project [link]