2012年12月11日火曜日

JavascriptをC#で呼び出す簡単な検証

昨日記事にて、Javascriptを特殊フォルダ(Standard Assets, Pluginsフォルダ)に配置して、C#から呼び出すことが出来る、ということを翻訳したものの、実際に試してみたことがなかったのでコンパイルが通るかどうかだけの簡単な実験を行った。

Unity初心者が学ぶC#スクリプトとJavascriptの相互参照
http://gamesonytablet.blogspot.jp/2012/12/unitycjavascript.html

検証にあたってはCharacter Controllerをインポートしてみて、これに含まれるCharacterMotor.jsを①Javascriptのフォルダ配置、②C#、Javascriptで呼び出すか、によってコンパイルが通るか確認する、という簡単な方法をとってみた。

正直にいって十分な検証とはいえないが、昨日の記事どおり「特殊フォルダに配置すればコンパイル順序は保証される」は確認できた。

しかし、そもそも論で「出来るかぎりJavascriptかC#のどちらかで統一すべき」という答えが明らかにベストで、その点で言えばC#使いにとってCharacter Controllerのような標準アセットの中に大量のJavascriptが混じっているのは面倒の始まりで、出来るかぎりC#版を探すべきといえる。
(実際、CharacterMotorもC#版に変更した凄い方がいたようだ)

また、逆にJavascriptとC#を混ぜるべき状況というのは記事にあったとおり、アセットストアなどで提供されていたパッケージが使用している言語がC#で自分はJavascript使いであった場合や、その逆のパターンなどにどうしても参照をする方法を残したい場合など、極めて限定的とおもう。

以下、お粗末ながら検証した内容を整理した:

1. コンパイル順序の検証

検証内容:Javascriptのフォルダ配置によりコンパイルが通るかどうか

環境:Unity4.0.0f7

 失敗パターン

  • #1 CharacterMotor.jsを特殊フォルダに配置しない
  • #2 CallCharacterMotor.csで#1を呼び出す コンパイルが失敗!

 成功パターン

  • #1 CharacterMotor.jsを特殊フォルダに配置
  • #2 CallCharacterMotor.csで#1を呼び出す コンパイル成功
※CallCharacterMotor.csは常に特殊フォルダ以外に配置

2. コンパイル順序の検証(二重呼び出し)

検証内容:C#、Javascriptで呼び出しを行うかによりコンパイルが通るかどうか

環境:Unity4.0.0f7

 失敗パターン

  • #1 CharacterMotor.jsを特殊フォルダに配置
  • #2 CallCharacterMotor.csで#1を呼び出す
  • #3 CallCallCharacterMotor.csで#2を呼び出す コンパイル失敗!

 成功パターン

  • #1 CharacterMotor.jsを特殊フォルダに配置
  • #2 CallCharacterMotor.csで#1を呼び出す
  • #3 CallCallCharacterMotor.csで#2を呼び出す コンパイル成功
※CallCharacterMotor.cs、CallCallCharacterMotor.csは常に特殊フォルダ以外に配置

用意したスクリプト

CallCharacterMotor.cs - C#

using UnityEngine;using System.Collections;public class CallCharacterMotor : MonoBehaviour {  private CharacterMotor motor;  // CharacterMotor呼出 (C#→java) void Start () {  motor = GetComponent<CallCharacterMotor>(); }}

CallCallCharacterMotor.js - Javascript

#pragma strictprivate var motor : CallCharacterMotor;// CallCharacterMotor呼出(二重呼び出し java→C#→java)function Start () { motor = GetComponent(CallCharacterMotor);}

CallCallCharacterMotor.cs - C#

using UnityEngine;using System.Collections;public class CallCallCharacterMotor : MonoBehaviour { private CallCharacterMotor motor;  // CallCharacterMotor呼出(二重呼び出し java→C#→C#) void Update () {  motor = GetComponent<CallCharacterMotor>();  }}

うーん、今回はわれながら微妙な検証・・・・より丁寧に掘り下げるべきだな (深く反省)

UnityはC#かJavascriptのどちらかに固めて学習を進めていこうぜ!

0 件のコメント:

コメントを投稿

ブックマークに追加

このエントリーをはてなブックマークに追加

自己紹介

自分の写真
Unity3D公式マニュアル翻訳やってる人がスマホ(iPhone, Android)のゲーム開発しています。気軽に面白く初心者が遊べる内容がモットー。Blogでは開発情報をひたすら、Twitterではゲーム作成の過程で参考にしている情報を中心につぶやきます

ページビューの合計

過去7日間の人気投稿

ブログ アーカイブ