最近 Unity では C# でスクリプトを書いてますが、開発途中で突然思い立って言語を変えてしまったのでプロジェクト内に JavaScript(UnityScript) と C# が混在してしまう事に。それでも動いちゃうのが便利なところでもあるのだけど。
ただ後々の事を考えると全て C# で統一したいのでスクリプトを変換する事にした。
UnityScript と C# の主な違い
変換するにあたりどのような違いがあるのかを調べてみた。
文法的には簡単なものしか使ってなかったので細かいところはおいといて、どのように書き換えたら動くかをメモしておきます。
class 宣言を省略できない
UnityScript 内では class 宣言を行わないと暗黙的にそのファイル名の class として振る舞うが C# では省略できないので書く。ついでに using を追加するのを忘れないように。もっともこれは C# スクリプトを作成した段階で自動的に入力されている部分ですが。
// Unityscript
// 通常は省略するが class 宣言は以下のように書ける。
public class Hoge extends MonoBehaviour {
}
// C#
//ファイル名が Hoge.js であれば、
using UnityEngine;
using System.Collections;
public class Hoge : MonoBehaviour {
}
変数の宣言方法
Unityscript では型を指定しなくても動くけど C# では必ず指定する。型が明確なローカル変数は型の代わりに var で宣言もできるらしい。
一部の型は名称が若干異なるので注意。
US:boolean -> C#:bool
US:String -> C#:string
等
// Unityscript
var hoge:String = 'hoge';
var fuga:Char = 'f'[0];
var v3:Vector3 = Vector3(1.0f, 2.0f, 3.0f);
// C#
// string は "(ダブルクォーテション)を使用しないといけない。
string hoge = "hoge";
// char は '(シングルクォーテーション)
char fuga = 'f';
// オブジェクトのインスタンスを生成する際は new をつける
Vector3 v3 = new Vector3(1.0f, 2.0f, 3.0f);
キャスト
基本的に型の変換をちゃんとしないと動かない。UnityScript でも意識すべきだと思うけど。
// Unityscript
// 暗黙のキャストが行われたりもするけど...。
var hoge:int = 10.5f; // hoge == 10
// parseFloat などで変換も可能
var hoge:String = "10.5";
Debug.Log(hoge == 10.5f); // false
Debug.Log(parseFloat(hoge) == 10.5f); // true
// C#
// 明示的に変換しよう
int hoge = 10.5f; // error
int hoge = (int)10.5f; // ok
メソッドの定義
// Unityscript
function hoge() {
}
// C#
// 返り値の型を書く。無ければ void。
// 強制ではないが頭文字を大文字にするのが C# 風らしい。
void Hoge() {
}
// 匿名関数は以下のように
(fuga) => { Debug.Log(fuga.ToString()); }
// 例えばメソッドの引数として使ったり
Hoge(() => { Debug.Log("lambda?"); });
// メンバ変数に以下のように宣言しておいて
public delegate void HogeDelegate(int fuga);
public event HogeDelegate a;
// 匿名関数を変数に代入したり。
void Start() {
a = (fuga) => { Debug.Log (fuga.ToString()); };
a(10); // 10 と表示
}
foreach
for から foreach に。
// UnityScript
for (var v in hoge) {
}
// C#
foreach (var v in hoge) {
}
プロパティの変更
直接値を書き換えれない場合がある。値が public じゃないのだろう。
// UnityScript
transform.position.x = 1;
// C#
transform.position.x = 1; // error
Vector3 pos = transform.position;
pos.x = 1;
transform.position = pos; // ok
yield
書き方が変わる上にメソッドの定義も変更する必要がある。
// UnityScript
function hoge() {
yield WaitForSeconds(2.0f);
}
// C#
// yield を使用するメソッドの返り値は IEnumerator にする。
IEnumerator hoge() {
yield return new WaitForSeconds(2.0f);
}
UnityScript を C# へ変換してくれる Web サイト
手動はやっぱだるいので変換してくれる Web サイトを使うのも手。
Convert unity javascript (unityscript) to C#ただし変換精度がそこまで良くない。String なのに '(シングルクォート) のままだったり new してくれなかったり。。まー作業時間がある程度短縮できると思えば良いかな。