• Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
2
Question by WillieZZy · Jul 05, 2010 at 08:43 PM ·

Converting Code from JavaScript to C#

What is the best means of converting JavaScript to C Sharp with a minimal amount of user interaction, meaning one that best converts the code without the user having to fix much of the code. Right now I use the converter at "http://www.m2h.nl/files/js_to_c.php", it works for the most part but it can't properly convert "var" over to C# and you must then specify a specific variable as that is what C# requires compared to the more openness of JavaScript variables. Such as when I convert the following code:

/* * This file is part of the Unity networking tutorial by M2H (http://www.M2H.nl) * The original author of this code is Mike Hergaarden, even though some small parts * are copied from the Unity tutorials/manuals. * Feel free to use this code for your own projects, drop us a line if you made something exciting! */ #pragma strict

public var gameName = "Example4"; public var serverPort = 35001;

public var hostData : HostData[];

private var natCapable : ConnectionTesterStatus = ConnectionTesterStatus.Undetermined; public var filterNATHosts = false; private var probingPublicIP = false; private var doneTestingNAT = false; private var timer : float = 0.0;

private var hideTest = false; private var testMessage = "Undetermined NAT capabilities";

private var tryingToConnectPlayNow : boolean = false; public var tryingToConnectPlayNowNumber : int = 0;

private var remotePort : int[] = new int[3]; private var remoteIP : String[] = new String[3]; public var connectionInfo : String = "";

public var lastMSConnectionAttemptForcedNat : boolean= false; private var NAToptionWasSwitchedForTesting : boolean = false; private var officialNATstatus : boolean = Network.useNat; public var errorMessage : String = ""; private var lastPlayNowConnectionTime : float;

public var nowConnecting : boolean = false;

function Awake () { sortedHostList = new Array ();

 // Start connection test
 natCapable = Network.TestConnection();

 // What kind of IP does this machine have? TestConnection also indicates this in the
 // test results
 if (Network.HavePublicAddress()){
     Debug.Log("This machine has a public IP address");
 }else{
     Debug.Log("This machine has a private IP address");
 }   

 /* //If you dont want to use the Unity masterserver..
 Network.natFacilitatorIP = myMasterServerIP;
 Network.natFacilitatorPort = 11111;//Change this
 MasterServer.ipAddress = myMasterServerIP;
 MasterServer.port = 22222;//Change this
 Network.connectionTesterIP = myMasterServerIP;
 Network.connectionTesterPort = 33333;//Change this
 */


}

function Start(){//must be in start because of coroutine

 yield WaitForSeconds(0.5);
 var tries : int=0;
 while(tries<=10){       
     if(hostData && hostData.length>0){
         //Waiting for hostData
     }else{
         FetchHostList(true);
     }
     yield WaitForSeconds(0.5);
     tries++;
 }

}

function OnFailedToConnectToMasterServer(info: NetworkConnectionError) { //Yikes }

function OnFailedToConnect(info: NetworkConnectionError) { Debug.Log("FailedToConnect info:"+info); FailedConnRetry(info);
}

function Connect(ip : String, port : int, usenat : boolean){ // Enable NAT functionality based on what the hosts if configured to do Network.useNat = usenat; lastMSConnectionAttemptForcedNat = usenat;

 Debug.Log("Connecting to "+ip+":"+port+" NAT:"+usenat);
 Network.Connect(ip, port);      
 nowConnecting=true; 

}

//This second definition of Connect can handle the ip string[] passed by the masterserver function Connect(ip : String[], port : int, usenat : boolean){ // Enable NAT functionality based on what the hosts if configured to do Network.useNat = usenat; lastMSConnectionAttemptForcedNat = usenat;

 Debug.Log("Connecting to "+ip[0]+":"+port+" NAT:"+usenat);
 Network.Connect(ip, port);      
 nowConnecting=true; 

}

function StartHost(players : int, port : int){ if(players<=1){ players=1; } //Network.InitializeSecurity(); Network.InitializeServer(players, port); }

function OnConnectedToServer(){ //Stop communication until in the game Network.isMessageQueueRunning = false;

 //Save these details so we can use it in the next scene
 PlayerPrefs.SetString("connectIP", Network.connections[0].ipAddress);
 PlayerPrefs.SetInt("connectPort", Network.connections[0].port);

}

function FailedConnRetry(info: NetworkConnectionError){ if(info == NetworkConnectionError.InvalidPassword){ mayRetry=false; }

 nowConnecting=false;

 //Quickplay
 if(tryingToConnectPlayNow){
     //Try again without NAT if we used NAT
     if(mayRetry &amp;&amp; Network.useNat &amp;&amp; lastMSConnectionAttemptForcedNat){
         Debug.Log("Failed connect 1A: retry without NAT");

         remotePort[0]=serverPort;//Fall back to default server port
         Connect(remoteIP, remotePort[0], false);
         lastPlayNowConnectionTime=Time.time;
     }else{
         //We didn't use NAT and failed
         Debug.Log("Failed connect 1B: Don't retry");

         //Reset NAT to org. value
         Network.useNat=officialNATstatus;

         //Connect to next playnow/quickplay host
         tryingToConnectPlayNowNumber++;
         tryingToConnectPlayNow=false;
     }
 }else{
     //Direct connect or via host list manually
     connectionInfo="Failed to connect!";

     if(mayRetry &amp;&amp; Network.useNat &amp;&amp; lastMSConnectionAttemptForcedNat){
         //Since the last connect forced NAT usage,
         // let's try again without NAT.     
         Network.useNat=false;
         Network.Connect(remoteIP, remotePort[0]);
         nowConnecting=true;
         lastPlayNowConnectionTime=Time.time;

     }else{
         Debug.Log("Failed 2b");

         if(info == NetworkConnectionError.InvalidPassword){
             errorMessage="Failed to connect: Wrong password supplied";
         }else if(info == NetworkConnectionError.TooManyConnectedPlayers){
             errorMessage="Failed to connect: Server is full";
         }else{
             errorMessage="Failed to connect";
         }

         //reset to default port
         remotePort[0]=serverPort;

         //Reset nat to tested value
         Network.useNat=officialNATstatus;

     }
 }   

}

public var CONNECT_TIMEOUT : float = 0.75; public var CONNECT_NAT_TIMEOUT : float = 5.00;

//Our quickplay function: Go trough the gameslist and try to connect to all games function PlayNow(timeStarted : float ){

     var i : int=0;

     for (var myElement in sortedHostList)
     {
         var element=hostData[myElement];

         // Do not try NAT enabled games if we cannot do NAT punchthrough
         // Do not try connecting to password protected games
         if ( !(filterNATHosts &amp;&amp; element.useNat) &amp;&amp; !element.passwordProtected  )
         {
             aHost=1;

             if(element.connectedPlayers&lt;element.playerLimit)
             {                   
                 if(tryingToConnectPlayNow){
                     var natText;
                     if(Network.useNat){
                         natText=" with option 1/2";
                     }else{
                         natText=" with option 2/2";
                     }
                     if((!Network.useNat &amp;&amp; lastPlayNowConnectionTime+CONNECT_TIMEOUT&lt;=Time.time) || (Network.useNat  &amp;&amp; lastPlayNowConnectionTime+CONNECT_NAT_TIMEOUT&lt;=Time.time)){
                         Debug.Log("Interrupted by timer, NAT:"+Network.useNat);
                         FailedConnRetry(NetworkConnectionError.ConnectionFailed);                           
                     }
                     return "Trying to connect to host "+(tryingToConnectPlayNowNumber+1)+"/"+sortedHostList.length+" "+natText; 
                 }       
                 if(!tryingToConnectPlayNow &amp;&amp; tryingToConnectPlayNowNumber&lt;=i){
                     Debug.Log("Trying to connect to game NR "+i+" &amp; "+tryingToConnectPlayNowNumber);
                     tryingToConnectPlayNow=true;
                     tryingToConnectPlayNowNumber=i;

                     // Enable NAT functionality based on what the hosts if configured to do
                     lastMSConnectionAttemptForcedNat=element.useNat;
                     Network.useNat = element.useNat;
                     var connectPort : int=element.port;
                     if (Network.useNat){
                         print("Using Nat punchthrough to connect");
                     }else{
                         //connectPort=serverPort; //bad idea!
                         print("Connecting directly to host");
                     }
                     Debug.Log("connecting to "+element.gameName+" "+element.ip+":"+connectPort);
                     Network.Connect(element.ip, connectPort);   
                     lastPlayNowConnectionTime=Time.time;
                 }
                 i++;        
             }
         }           
     }

     //If we reach this point then either we've parsed the whole list OR the list is still empty

     //Dont give up yet: Give MS 7 seconds to feed the list
     if(Time.time&lt;timeStarted+7){
         FetchHostList(true);    
         return "Waiting for masterserver..."+Mathf.Ceil((timeStarted+7)-Time.time); 
     }

     if(!tryingToConnectPlayNow){
         return "failed";
     }


}

function Update() { // If network test is undetermined, keep running if (!doneTestingNAT) { TestConnection(); } }

function TestConnection() { // Start/Poll the connection test, report the results in a label and react to the results accordingly natCapable = Network.TestConnection(); switch (natCapable) { case ConnectionTesterStatus.Error: testMessage = "Problem determining NAT capabilities"; doneTestingNAT = true; break;

     case ConnectionTesterStatus.Undetermined: 
         testMessage = "Undetermined NAT capabilities";
         doneTestingNAT = false;
         break;

     case ConnectionTesterStatus.PrivateIPNoNATPunchthrough: 
         testMessage = "Cannot do NAT punchthrough, filtering NAT enabled hosts for client connections, local LAN games only.";
         filterNATHosts = true;
         Network.useNat = true;
         doneTestingNAT = true;
         break;

     case ConnectionTesterStatus.PrivateIPHasNATPunchThrough:
         if (probingPublicIP)
             testMessage = "Non-connectable public IP address (port "+ serverPort +" blocked), NAT punchthrough can circumvent the firewall.";
         else
             testMessage = "NAT punchthrough capable. Enabling NAT punchthrough functionality.";
         // NAT functionality is enabled in case a server is started,
         // clients should enable this based on if the host requires it
         Network.useNat = true;
         doneTestingNAT = true;
         break;

     case ConnectionTesterStatus.PublicIPIsConnectable:
         testMessage = "Directly connectable public IP address.";
         Network.useNat = false;
         doneTestingNAT = true;
         break;

     // This case is a bit special as we now need to check if we can 
     // cicrumvent the blocking by using NAT punchthrough
     case ConnectionTesterStatus.PublicIPPortBlocked:
         testMessage = "Non-connectble public IP address (port " + serverPort +" blocked), running a server is impossible.";
         Network.useNat = false;
         // If no NAT punchthrough test has been performed on this public IP, force a test
         if (!probingPublicIP)
         {
             Debug.Log("Testing if firewall can be circumnvented");
             natCapable = Network.TestConnectionNAT();
             probingPublicIP = true;
             timer = Time.time + 10;
         }
         // NAT punchthrough test was performed but we still get blocked
         else if (Time.time &gt; timer)
         {
             probingPublicIP = false;        // reset
             Network.useNat = true;
             doneTestingNAT = true;
         }
         break;
     case ConnectionTesterStatus.PublicIPNoServerStarted:
         testMessage = "Public IP address but server not initialized, it must be started to check server accessibility. Restart connection test when ready.";
         break;
     default: 
         testMessage = "Error in test routine, got " + natCapable;
 }
 officialNATstatus=Network.useNat;
 if(doneTestingNAT){
     Debug.Log("TestConn:"+testMessage);
     Debug.Log("TestConn:"+natCapable + " " + probingPublicIP + " " + doneTestingNAT);
 }

}

private var lastHostListRequest : float = 0;

//Request the host limit, but we limit these requests //Max once every two minutes automatically, max once every 5 seconds when manually requested function FetchHostList(manual : boolean){ var timeout : int = 120; if(manual){ timeout=5; }

 if(lastHostListRequest==0 || Time.realtimeSinceStartup &gt; lastHostListRequest + timeout){
         lastHostListRequest = Time.realtimeSinceStartup;
         MasterServer.RequestHostList (gameName);            
         yield WaitForSeconds(1);//We gotta wait :/          
         hostData = MasterServer.PollHostList();
         yield WaitForSeconds(1);//We gotta wait :/  
         CreateSortedArray();
         Debug.Log("Requested new host list, got: "+hostData.length);
 }



}

//The code below is all about sorting the game list by playeramount

public var sortedHostList : Array;

function CreateSortedArray(){

 sortedHostList = new Array();   

 var i : int=0;
 var data : HostData[] = hostData;
 for (var element in data)
 {
     AddToArray(i);
     i++;        
 }           

}

function AddToArray(nr : int){ sortedHostList.Add (nr);
SortLastItem(); }

function SortLastItem(){ if(sortedHostList.length<=1){ return; } for(var i=sortedHostList.length-1;i>0;i--){ var value1 : int= hostData[sortedHostList[i-1]].connectedPlayers; var value2 : int = hostData[sortedHostList[i]].connectedPlayers; if(value1<value2){ SwapArrayItem((i-1), i); }else{ //Sorted! return; } } }

function SwapArrayItem(nr1, nr2){ var tmp=sortedHostList[nr1]; sortedHostList[nr1]=sortedHostList[nr2]; sortedHostList[nr2]=tmp; }

The code then ends up as:

// Converted from UnityScript to C# at http://www.M2H.nl/files/js_to_c.php - by Mike Hergaarden // Do test the code! You usually need to change a few small bits.

using UnityEngine; using System.Collections;

public class MYCLASSNAME : MonoBehaviour { / This file is part of the Unity networking tutorial by M2H (http://www.M2H.nl) The original author of this code is Mike Hergaarden, even though some small parts are copied from the Unity tutorials/manuals. Feel free to use this code for your own projects, drop us a line if you made something exciting! /

public FIXME_VAR_TYPE gameName= "Example4"; public FIXME_VAR_TYPE serverPort= 35001;

public HostData[] hostData;

private ConnectionTesterStatus natCapable = ConnectionTesterStatus.Undetermined; public FIXME_VAR_TYPE filterNATHosts= false; private FIXME_VAR_TYPE probingPublicIP= false; private FIXME_VAR_TYPE doneTestingNAT= false; private float timer = 0.0f;

private FIXME_VAR_TYPE hideTest= false; private FIXME_VAR_TYPE testMessage= "Undetermined NAT capabilities";

private bool tryingToConnectPlayNow = false; public int tryingToConnectPlayNowNumber = 0;

private int[] remotePort = new int[3]; private string[] remoteIP = new string[3]; public string connectionInfo = "";

public bool lastMSConnectionAttemptForcedNat= false; private bool NAToptionWasSwitchedForTesting = false; private bool officialNATstatus = Network.useNat; public string errorMessage = ""; private float lastPlayNowConnectionTime;

public bool nowConnecting = false;

void Awake (){ sortedHostList = new Array ();

 // Start connection test
 natCapable = Network.TestConnection();

 // What kind of IP does this machine have? TestConnection also indicates this in the
 // test results
 if (Network.HavePublicAddress()){
     Debug.Log("This machine has a public IP address");
 }else{
     Debug.Log("This machine has a private IP address");
 }   

 /* //If you dont want to use the Unity masterserver..
 Network.natFacilitatorIP = myMasterServerIP;
 Network.natFacilitatorPort = 11111;//Change this
 MasterServer.ipAddress = myMasterServerIP;
 MasterServer.port = 22222;//Change this
 Network.connectionTesterIP = myMasterServerIP;
 Network.connectionTesterPort = 33333;//Change this
 */


}

void Start (){//must be in start because of coroutine

 yield return new WaitForSeconds(0.5f);
 int tries=0;
 while(tries&lt;=10){       
     if(hostData &amp;&amp; hostData.length&gt;0){
         //Waiting for hostData
     }else{
         FetchHostList(true);
     }
     yield return new WaitForSeconds(0.5f);
     tries++;
 }

}

void OnFailedToConnectToMasterServer ( NetworkConnectionError info ){ //Yikes }

void OnFailedToConnect ( NetworkConnectionError info ){ Debug.Log("FailedToConnect info:"+info); FailedConnRetry(info);
}

void Connect ( string ip , int port , bool usenat ){ // Enable NAT functionality based on what the hosts if configured to do Network.useNat = usenat; lastMSConnectionAttemptForcedNat = usenat;

 Debug.Log("Connecting to "+ip+":"+port+" NAT:"+usenat);
 Network.Connect(ip, port);      
 nowConnecting=true; 

}

//This second definition of Connect can handle the ip string[] passed by the masterserver void Connect ( string[] ip , int port , bool usenat ){ // Enable NAT functionality based on what the hosts if configured to do Network.useNat = usenat; lastMSConnectionAttemptForcedNat = usenat;

 Debug.Log("Connecting to "+ip[0]+":"+port+" NAT:"+usenat);
 Network.Connect(ip, port);      
 nowConnecting=true; 

}

void StartHost ( int players , int port ){ if(players<=1){ players=1; } //Network.InitializeSecurity(); Network.InitializeServer(players, port); }

void OnConnectedToServer (){ //Stop communication until in the game Network.isMessageQueueRunning = false;

 //Save these details so we can use it in the next scene
 PlayerPrefs.SetString("connectIP", Network.connections[0].ipAddress);
 PlayerPrefs.SetInt("connectPort", Network.connections[0].port);

}

void FailedConnRetry ( NetworkConnectionError info ){ if(info == NetworkConnectionError.InvalidPassword){ mayRetry=false; }

 nowConnecting=false;

 //Quickplay
 if(tryingToConnectPlayNow){
     //Try again without NAT if we used NAT
     if(mayRetry &amp;&amp; Network.useNat &amp;&amp; lastMSConnectionAttemptForcedNat){
         Debug.Log("Failed connect 1A: retry without NAT");

         remotePort[0]=serverPort;//Fall back to default server port
         Connect(remoteIP, remotePort[0], false);
         lastPlayNowConnectionTime=Time.time;
     }else{
         //We didn't use NAT and failed
         Debug.Log("Failed connect 1B: Don't retry");

         //Reset NAT to org. value
         Network.useNat=officialNATstatus;

         //Connect to next playnow/quickplay host
         tryingToConnectPlayNowNumber++;
         tryingToConnectPlayNow=false;
     }
 }else{
     //Direct connect or via host list manually
     connectionInfo="Failed to connect!";

     if(mayRetry &amp;&amp; Network.useNat &amp;&amp; lastMSConnectionAttemptForcedNat){
         //Since the last connect forced NAT usage,
         // let's try again without NAT.     
         Network.useNat=false;
         Network.Connect(remoteIP, remotePort[0]);
         nowConnecting=true;
         lastPlayNowConnectionTime=Time.time;

     }else{
         Debug.Log("Failed 2b");

         if(info == NetworkConnectionError.InvalidPassword){
             errorMessage="Failed to connect: Wrong password supplied";
         }else if(info == NetworkConnectionError.TooManyConnectedPlayers){
             errorMessage="Failed to connect: Server is full";
         }else{
             errorMessage="Failed to connect";
         }

         //reset to default port
         remotePort[0]=serverPort;

         //Reset nat to tested value
         Network.useNat=officialNATstatus;

     }
 }   

}

public float CONNECT_TIMEOUT = 0.75f; public float CONNECT_NAT_TIMEOUT = 5.00f;

//Our quickplay function: Go trough the gameslist and try to connect to all games void PlayNow ( float timeStarted ){

     int i=0;

     foreach(var myElement in sortedHostList)
     {
         FIXME_VAR_TYPE element=hostData[myElement];

         // Do not try NAT enabled games if we cannot do NAT punchthrough
         // Do not try connecting to password protected games
         if ( !(filterNATHosts &amp;&amp; element.useNat) &amp;&amp; !element.passwordProtected  )
         {
             aHost=1;

             if(element.connectedPlayers&lt;element.playerLimit)
             {                   
                 if(tryingToConnectPlayNow){
                     FIXME_VAR_TYPE natText;
                     if(Network.useNat){
                         natText=" with option 1/2";
                     }else{
                         natText=" with option 2/2";
                     }
                     if((!Network.useNat &amp;&amp; lastPlayNowConnectionTime+CONNECT_TIMEOUT&lt;=Time.time) || (Network.useNat  &amp;&amp; lastPlayNowConnectionTime+CONNECT_NAT_TIMEOUT&lt;=Time.time)){
                         Debug.Log("Interrupted by timer, NAT:"+Network.useNat);
                         FailedConnRetry(NetworkConnectionError.ConnectionFailed);                           
                     }
                     return "Trying to connect to host "+(tryingToConnectPlayNowNumber+1)+"/"+sortedHostList.length+" "+natText; 
                 }       
                 if(!tryingToConnectPlayNow &amp;&amp; tryingToConnectPlayNowNumber&lt;=i){
                     Debug.Log("Trying to connect to game NR "+i+" &amp; "+tryingToConnectPlayNowNumber);
                     tryingToConnectPlayNow=true;
                     tryingToConnectPlayNowNumber=i;

                     // Enable NAT functionality based on what the hosts if configured to do
                     lastMSConnectionAttemptForcedNat=element.useNat;
                     Network.useNat = element.useNat;
                     int connectPort=element.port;
                     if (Network.useNat){
                         print("Using Nat punchthrough to connect");
                     }else{
                         //connectPort=serverPort; //bad idea!
                         print("Connecting directly to host");
                     }
                     Debug.Log("connecting to "+element.gameName+" "+element.ip+":"+connectPort);
                     Network.Connect(element.ip, connectPort);   
                     lastPlayNowConnectionTime=Time.time;
                 }
                 i++;        
             }
         }           
     }

     //If we reach this point then either we've parsed the whole list OR the list is still empty

     //Dont give up yet: Give MS 7 seconds to feed the list
     if(Time.time&lt;timeStarted+7){
         FetchHostList(true);    
         return "Waiting for masterserver..."+Mathf.Ceil((timeStarted+7)-Time.time); 
     }

     if(!tryingToConnectPlayNow){
         return "failed";
     }


}

void Update (){ // If network test is undetermined, keep running if (!doneTestingNAT) { TestConnection(); } }

void TestConnection (){ // Start/Poll the connection test, report the results in a label and react to the results accordingly natCapable = Network.TestConnection(); switch (natCapable) { case ConnectionTesterStatus.Error: testMessage = "Problem determining NAT capabilities"; doneTestingNAT = true; break;

     case ConnectionTesterStatus.Undetermined: 
         testMessage = "Undetermined NAT capabilities";
         doneTestingNAT = false;
         break;

     case ConnectionTesterStatus.PrivateIPNoNATPunchthrough: 
         testMessage = "Cannot do NAT punchthrough, filtering NAT enabled hosts for client connections, local LAN games only.";
         filterNATHosts = true;
         Network.useNat = true;
         doneTestingNAT = true;
         break;

     case ConnectionTesterStatus.PrivateIPHasNATPunchThrough:
         if (probingPublicIP)
             testMessage = "Non-connectable public IP address (port "+ serverPort +" blocked), NAT punchthrough can circumvent the firewall.";
         else
             testMessage = "NAT punchthrough capable. Enabling NAT punchthrough functionality.";
         // NAT functionality is enabled in case a server is started,
         // clients should enable this based on if the host requires it
         Network.useNat = true;
         doneTestingNAT = true;
         break;

     case ConnectionTesterStatus.PublicIPIsConnectable:
         testMessage = "Directly connectable public IP address.";
         Network.useNat = false;
         doneTestingNAT = true;
         break;

     // This case is a bit special as we now need to check if we can 
     // cicrumvent the blocking by using NAT punchthrough
     case ConnectionTesterStatus.PublicIPPortBlocked:
         testMessage = "Non-connectble public IP address (port " + serverPort +" blocked), running a server is impossible.";
         Network.useNat = false;
         // If no NAT punchthrough test has been performed on this public IP, force a test
         if (!probingPublicIP)
         {
             Debug.Log("Testing if firewall can be circumnvented");
             natCapable = Network.TestConnectionNAT();
             probingPublicIP = true;
             timer = Time.time + 10;
         }
         // NAT punchthrough test was performed but we still get blocked
         else if (Time.time &gt; timer)
         {
             probingPublicIP = false;        // reset
             Network.useNat = true;
             doneTestingNAT = true;
         }
         break;
     case ConnectionTesterStatus.PublicIPNoServerStarted:
         testMessage = "Public IP address but server not initialized, it must be started to check server accessibility. Restart connection test when ready.";
         break;
     default: 
         testMessage = "Error in test routine, got " + natCapable;
 }
 officialNATstatus=Network.useNat;
 if(doneTestingNAT){
     Debug.Log("TestConn:"+testMessage);
     Debug.Log("TestConn:"+natCapable + " " + probingPublicIP + " " + doneTestingNAT);
 }

}

private float lastHostListRequest = 0;

//Request the host limit, but we limit these requests //Max once every two minutes automatically, max once every 5 seconds when manually requested void FetchHostList ( bool manual ){ int timeout = 120; if(manual){ timeout=5; }

 if(lastHostListRequest==0 || Time.realtimeSinceStartup &gt; lastHostListRequest + timeout){
         lastHostListRequest = Time.realtimeSinceStartup;
         MasterServer.RequestHostList (gameName);            
         yield return new WaitForSeconds(1);//We gotta wait :/           
         hostData = MasterServer.PollHostList();
         yield return new WaitForSeconds(1);//We gotta wait :/   
         CreateSortedArray();
         Debug.Log("Requested new host list, got: "+hostData.length);
 }



}

//The code below is all about sorting the game list by playeramount

public Array sortedHostList;

void CreateSortedArray (){

 sortedHostList = new Array();   

 int i=0;
 HostData[] data = hostData;
 foreach(var element in data)
 {
     AddToArray(i);
     i++;        
 }           

}

void AddToArray ( int nr ){ sortedHostList.Add (nr);
SortLastItem(); }

void SortLastItem (){ if(sortedHostList.length<=1){ return; } for(FIXME_VAR_TYPE i=sortedHostList.length-1;i>0;i--){ int value1= hostData[sortedHostList[i-1]].connectedPlayers; int value2 = hostData[sortedHostList[i]].connectedPlayers; if(value1<value2){ SwapArrayItem((i-1), i); }else{ //Sorted! return; } } }

void SwapArrayItem (nr1, nr2){ FIXME_VAR_TYPE tmp=sortedHostList[nr1]; sortedHostList[nr1]=sortedHostList[nr2]; sortedHostList[nr2]=tmp; } }


As you see, the "var" parts get turned into "FIXME_VAR_TYPE" because it doesn't know the proper var, is there any list of any kind showing the differnet variable types you can use or could someone please tell me the proper things to put in those spots. And should I make the "Array" places into "Array List"? Any help or another converter would be appreciated.

Comment
Add comment · Show 1
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image WillieZZy · Jul 05, 2010 at 11:46 PM 0
Share

I would like to thank all of you for answering, I put Jashan's answers as the best because that is what everyone else voted for, but I think all of your answers are great and all of the answers definetely have helped me. Also, a thanks to Eric5h5 for editng my question to put the codes in scrollable boxes. I never knew this website had so many helpful people, and again thanks to all of ya'll. :)

6 Replies

· Add your reply
  • Sort: 
avatar image
7
Best Answer

Answer by jashan · Jul 05, 2010 at 09:32 PM

Actually, converting UnityScript to C# is probably best done via a .NET reverse compiler, of which there are quite a few available. Simply put the UnityScript file into Unity and let Unity compile the file. Then, grab the bytecode DLL from the folder [yourProject]/Library/ScriptAssemblies

Then, finally, take a .NET reverse compiler like .NET Reflector, use the DLL (it's called "Assembly - UnityScript.dll", or, if you have editor scripts in UnityScript you might need to look for the file "Assembly - UnityScript - Editor.dll"), look up the class in the tree, do disassemble on it, and show the methods - there you go.

What you get there is perfect C# code that will compile without any problem (well, it is compiled already). The only thing that will be missing is the comments; but you could easily copy those over if you really need them (obviously depends on what you want to use this for).

This is also a very interesting way to figure out how certain things in UnityScript/JavaScript are actually implemented in bytecode (it's sometimes good to know because sometimes, UnityScript will "look very simple" but produce code that's simply less than perfect ;-) ).

Comment
Add comment · Show 1 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Lttldude · Jun 05, 2012 at 09:02 PM 0
Share

Since .Net Reflector isn't free, this one works as well. http://wiki.sharpdevelop.net/ilspy.ashx

avatar image
2
Best Answer

Answer by Mike 3 · Jul 05, 2010 at 08:53 PM

All of the FIXME_VAR_TYPE instances in the code are either bool, string or int (should be fairly easy to work out which is which)

And yes - you'll need to change Array to ArrayList, though that should be the only change I think seeing as ArrayList has Add just the same as Array

I don't think there is another convertor, so that's the best you're going to get (and I'll be honest, it's pretty damned good considering unity's javascript isn't much like other javascript implementations)

If you need to search for a list of types, MSDN has a pretty long list you can look through

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image
0

Answer by fherbst · Jul 05, 2010 at 09:29 PM

You should change

public var gameName = "Example4";
public var serverPort =  35001;
...
public var filterNATHosts = false;

to

public var gameName : String = "Example4";
public var serverPort : int = 35001;
...
public var filterNATHosts : boolean = false;

and so on.

I don't know why #pragma strict does not complain about it (probably because you assign the variables directly), but if you tell javascript what type the variables are, your converter will know it, too.

Comment
Add comment · Show 2 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Mike 3 · Jul 05, 2010 at 09:36 PM 1
Share

It's not mandatory when the compiler can infer the type, so #pragma strict doesn't and shouldn't complain about it. Works exactly like var in c# 3 (which is probably going to make convertors much easier to write when unity 3 is released)

avatar image fherbst · Jul 06, 2010 at 08:09 AM 0
Share

Thanks $$anonymous$$ike, I thought it would be this way.

avatar image
0

Answer by trepan · Jul 31, 2014 at 05:26 AM

I recently faced this same question myself and in my madness decided to write a new conversion tool...

For simple to medium complexity projects CSharpatron really will do everything necessary to fully convert a project from Unityscript to C# (e.g. I can convert the old Penelope example project in under 5 minutes with zero manual edits). For more complex projects (e.g. my own project at 107,000 lines), it brings conversion time down to a few hours with supporting tools for every step of the way.

CSharpatron is available on the Asset Store here. Hope it helps someone else.

Chris

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image
0

Answer by blenderblender · Nov 08, 2014 at 03:15 PM

http://www.m2h.nl/files/js_to_c.php

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
  • 1
  • 2
  • ›

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Welcome to Unity Answers

If you’re new to Unity Answers, please check our User Guide to help you navigate through our website and refer to our FAQ for more information.

Before posting, make sure to check out our Knowledge Base for commonly asked Unity questions.

Check our Moderator Guidelines if you’re a new moderator and want to work together in an effort to improve Unity Answers and support our users.

Follow this Question

Answers Answers and Comments

2 People are following this question.

avatar image avatar image

Related Questions

how would i write this in C#? 1 Answer

split screen multiplayer car game? 2 Answers

Quaternion .js to c# 2 Answers

JS to C#, anyone? 1 Answer

Need help converting js to C 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges