平成
26
年度卒業論文
ウィザードを用いて
プログラムコードを生成させる
対話的なアプリケーションの提案
情報・通信工学科 情報数理工学コース
1111164
平田 吉久
指導教員 寺田 実 准教授
提出日
2015
年
1
月
28
日
1
概要
目的
コンピュータは身近になってきており, 初等教育・中等教育でもコンピュータを使うようなことが増えて きたが, プログラミング教育はあまりなされていない. プログラミング初学者が簡単にプログラムソースを 作れるような環境ができないかと考えた. 具体的には, ウィザード形式で質問に答えることでソースコード を出力することを目的とする.方法
本研究では, Microsoft の.NET を用いて GUI を構成し, テンプレートエンジン Mustache を用いて出力す るソースコードの原型を作る. ウィザードの選択結果・入力結果によってテンプレートの文字列(コード断 片)を合成し, 最終的にその形成されたコードを出力する.
結論
本研究では,事前に用意したテンプレートを用いてソースファイルを出力することで,初学者に.NET ア プリケーションとしてそのシステムを実装した.コード断片をテンプレートエンジンで実装したが,困難を 極めた.2
3
4
5
第
1
章
序論
1.1
背景
プログラムというのは身近なものとなりつつある. 情報学教育はコンピュータが一般家庭に浸透し始まっ た昨今において, 熱心に取り組まれるようになってきた [1]. しかしながらプログラミング教育というのはあ まり熱心に行われておらず, プログラミングそのものも専門的知識が必要なため, あまり進んでいないのが 現状である.1.2
着眼点
Visual Programming Language というプログラミング言語の種類があり, これは図や絵を順番よく配置する ことでアルゴリズムを立てて, アプリケーションを開発することができるものがある. また統合開発環境で は, 開発のはじめにウィザードが表示され, そこから開発に必要なプログラムコードの一部が生成される. そ こで本研究では, ウィザード形式のアプリケーションで実際に動作するようなソースコードを出力するよう なものを作れるのではないか, という点に着眼した.
1.3
目標
本研究ではウィザード形式のインターフェースを用いることで, プログラムコードを生成を行う. それに よりプログラミング初学者に対して, プログラミングをより簡単に直感的にできるようなアプリケーション の開発を目的とする.1.4
本論文の構成
論文の構成を簡単に説明する. • 本章では, 序論として研究の背景及び着目点, 目標について述べた. • 第 2 章では, 本研究に関連する研究について述べる. • 第 3 章では, 本研究の提案するアプリケーションについて述べる. • 第 4 章では, 本研究で提案するアプリケーションの実装について述べる.第 1 章 序論 6 • 第 5 章では, 実験の結果と考察について述べる.
7
第
2
章
関連システム
,
関連研究
2.1
Visual Programming Language
Visual Programming Language (以下 VPL) とはプログラミング言語の一つで, 主にプログラミング初学者 のために目に見える形でアルゴリズムをくみ上げていくプログラミング言語である.
一番最初の VPL は Ivan E. Sutherl が 1963 年に発表した SketchPad[4] で, ペンを使うことでコンピュータ に指示をするようなものだった. VPL としてはもとより, オブジェクト指向プログラミングにも影響を与え た言語で, GUI の祖先としても扱われる. 図 2.1: SketchPad の操作の様子 [4] 以下 VPL の例を挙げる.
2.1.1
Scratch
1 マサチューセッツ工科大(MIT)が作成した VPL[3] で, 日本語を含む多くの言語で利用できる. 「キャラ クタを N 歩進ませる」「M 秒間繰り返す」などといった,関数呼び出しや if や for ブロックのに相当する 各パーツを上から順々に重ねていくことで,その順番の通りキャラクタが動作するような仕組みなってい る.また作成したプロジェクトを共有2することができ, 2015 年 1 月時点で約 790 万の制作物が Scratch 上 で共有されている. 1http://scratch.mit.edu/ 2http://scratch.mit.edu/explore/?date=this_month第 2 章 関連システム, 関連研究 8 図 2.2: Scratch のインターフェース
2.1.2
Viscuit
3 Viscuit は日本の NPO 法人デジタルポケット4が開発した VPL で,小児や高齢者に対して「コンピュー タというものはこういうものなのだ」ということを直観的に知ってもらうためとして作られた5.2.2
統合開発環境におけるプログラミング開始時のウィザード
次に統合開発環境におけるプログラミング開始時のウィザードについて説明する. 統合開発環境は簡単に 開発を始められるようにウィザードが用意されおり, これにより最低限のソースコードが用意された状態で 開発できる. 以下各統合開発環境における例を挙げる.2.2.1
Eclipse
6Java 等の開発によく用いられる Eclipse では, Java の新規クラスの生成時に図 2.3 のようなウィザード画 面を出し, コード 2.1 のような java ファイルの断片を生成することができる. これを見るとクラス名だけで なく,
public final
のようなクラスの修飾子を選択することや public static void main(String[] args){}
のように, main メソッドをチェックボックスにチェックを入れるだけで必要なプログラム断片を出力するこ とができる. 3http://www.viscuit.com/ 4http://www.digitalpocket.org/ 5http://www.viscuit.com/about/ 6http://scratch.mit.edu/
第 2 章 関連システム, 関連研究 9
図 2.3: Eclipse のコード生成ウィザード
1 package paperProject ;
2
3 public class ProjectMain {
4
5 public static void main ( String [] args ) {
6 / / T O D O 自動生成されたメソッド・スタブ 7 8 } 9 10 } コード 2.1: 図 2.3 のウィザードで生成した.java ファイル
第 2 章 関連システム, 関連研究 10
2.2.2
Microsft Visual Studio
7Microsoft 社の Visual Studio でも GUI ウィザードを用いて初期のソースコードの生成をする. 図 2.4 は Microsoft Fundamental Classes(以下 MFC)を用いるアプリケーションの作成の為に用意されたウィザード
である. MFC は win32 用 C++のクラス群であるから, 比較的記述しなければならない内容も多く, そのため
出力するファイルも複数の場合が多い.
図 2.4: Microsoft Visual Studio におけるコード生成ウィザード
第 2 章 関連システム, 関連研究 11
2.3
その他関連項目
一般にプログラムのソースコードを出力するプログラムのことをメタプログラムと言うが, これは Lisp
の時代から行われてきたものである. Ruby on Rails8などもテンプレート生成するプログラミング言語で,
MVC モデルと非常に相性がよいフレームワークとしてよく使われている.
また, GUI からソースを出力するものとして, Jingguo Ge らの研究 [2] があり, これは GUI を使ってロボッ トを動かすためのアルゴリズムとなるような RAPID 言語のプログラムファイルを外部に出力するようなア プリケーションに関する研究である.
図 2.5: Ge らによる RAPID ソース出力ツールの UI[2]
12
第
3
章
提案システム
第 2 章の関連研究であげた, VPL と統合開発環境におけるウィザードから, ウィザードを用いて対話的に プログラムのソースコードを出力できるようなアプリケーションを提案する.3.1
出力するプログラム及びその言語
出力するファイルは C#のソースコード (.cs) でゲームエンジン Unity で動くようなものとする.3.2
機能
主な機能として以下に機能の詳細を説明していく.3.2.1
1 ページ目
1 ページ目では,アプリケーションについての説明と「次へ」「キャンセル」ボタンのみを用意しており, ユーザに次に進んでもらうようにする.3.2.2
2 ページ目
2 ページ目から本格的にウィザードが始まる.出力するクラス名を入力してもらい次へを押してもらう.3.2.3
3 ページ目以降
3 ページ目以降は主にチェックボックスを入れるか入れないかで,コードが出力されるようする.必要に 応じて数値やファイル名,条件などを記入してもらうためのテキストボックスやプルダウンメニューを用意 してユーザに記入・選択させる.なお今回は 5 ページ目まで実装した.3.2.4
保存ページ
保存 最終ページの一つ前のページには保存ボタンを用意しており, Windows 標準の保存ダイアログがでてくる. ここで今まで回答してきた内容に合わせて C#のソースコード (.cs) が任意のディレクトリに保存することが できる.第 3 章 提案システム 13
図 3.1: 1 ページ目のスクリーンショット
第 3 章 提案システム 14
図 3.3: 3 ページ目
第 3 章 提案システム 15
3.2.5
最終ページ
最終ページには終了ボタンが用意されており,アプリケーションを終了することができる.
第 3 章 提案システム 16
図 3.6: Unity のスクリーンショット
3.2.6
Unity
Unity1は米 Unity Technologie 社が開発したゲームエンジンである. Unity はコンピュータ・ゲーム機・携 帯端末などのマルチプラットフォームに対応した, 主に 3D ゲームを開発するためのゲームエンジンで, GUI によりオブジェクトを配置, 初期値も自由に GUI から設定することができる. 詳細を設定するためにスクリ プトを書くこともでき, JavaScript・C#・Boo2に対応している. 本研究では, このためのスクリプトを出力するようなアプリケーションを開発した 1http://unity3d.com/ 2Python に影響を受けた言語 http://boo.codehaus.org/
17
第
4
章
実装
4.1
開発環境
本アプリケーションは Microsoft Windows 上で動くことを想定たものである. 言語としては C#と Microsoft .NET Framework を用いて開発した. また外部のテンプレートエンジンとして Mustache(後述)を使用した.
開発環境は表 4.1 の通りである.
表 4.1: 開発環境
OS Microsoft Windows 8.1
統合開発環境 Microsoft Visual Studio Community 2013
Visual Studio Version 12.0
.NET Framework Version 4.5
Unity Version 4.6.1
4.1.1
Mustache
Mustache1は Github 上で公開されている軽量なテンプレートエンジン2である. 今回は C#用の Mustache である Mustache-Sharp3を使用した. 詳細は付録??を参照.4.2
実装
以下実際に実装した内容について述べる.対象とするユーザは,C もしくはそれに派生した言語の必要最 低限の文法,if ブロック for ブロックがどんなものかが分かる程度くらいの人とする.4.2.1
枠や初期値など
App.xaml.cs では各処理における初期値などを設定した. FormatCompiler と Generator は Mustache の ための初期化クラスで,第 4.2.5 節でも触れている., sReader は読み込んだテンプレートの文字列を読み 込むもの, dic は第 4.1.1 節における Mustache の対応させている JSON の代わりのデータである.
1http://mustache.github.io/
2データとテンプレートを合成することで文字列を出力することのできるエンジン 3https://github.com/jehugaleahsa/mustache-sharp
第 4 章 実装 18
1 public partial class App : Application
2 {
3 static public FormatCompiler comp = new FormatCompiler () ;
4 static public Generator gen ;
5
6 static public string gStr = "";
7
8 static public StreamReader sReader ;
9 static public string mainSourse ;
10 11
12 / / B o o l e a n m e m b e r s f o r M u s t a c h e ’ s t e m p l a t e
13 static public const string TRUE = "1";
14 static public const string FALSE = "";
15
16 static public Dictionary < string , string > dic = new Dictionary < string ,
string >() ; 17 18 } コード 4.1: App.xaml.cs(一部) MainWindow.xaml では, アプリケーションのタイトルや大きさなど, 基本的な項目について設定した.
1 < NavigationWindow x:Class =" MakeApp . MainWindow "
2 xmlns =" http: // schemas . microsoft . com / winfx /2006/ xaml / presentation "
3 xmlns:x =" http: // schemas . microsoft . com / winfx /2006/ xaml "
4 Title =" MainWindow " Width =" 800 " Height =" 600 "
5 ResizeMode =" NoResize " WindowStartupLocation =" CenterScreen "/ >
コード 4.2: MainWindow.xaml
MainWindow.xaml.cs では Navigate メソッドを呼び出し, 一ページ目を出力するようにする.
1 this . ShowsNavigationUI = false ;
2 this . Navigate ( new Page1 () );
コード 4.3: MainWindow.xaml.cs(一部s)
4.2.2
1 ページ目
一ページ目では, テンプレートの読み込みを行い, うまく読み込めないときは終了する. 画面上では次へを 押すことで 2 ページ目に移動するかキャンセルを押してアプリケーションを終了させるのみである.1 public partial class Page1 : Page
2 {
3 public Page1 ()
第 4 章 実装 19 5 InitializeComponent () ; 6 / / E d i t t i t l e 7 this . WindowTitle = "ようこそ"; 8 try 9 {
10 App . sReader = new StreamReader (@" ../ sourse " , System . Text . Encoding .
Default );
11 }
12 catch ( FileLoadException e)
13 {
14 var result = MessageBox . Show ("ファイルが読み込めませんでした. アプリケーション
を終了します. ", "エラー", MessageBoxButton .OK , MessageBoxImage .Error);
15 if ( result == MessageBoxResult . OK )
16 Application . Current . Shutdown () ;
17 }
18 catch ( FileNotFoundException e)
19 {
20 var result = MessageBox . Show ("必要なファイルが見つかりませんでした. アプリケー
ションを終了します. ", "エラー
" , MessageBoxButton .OK , MessageBoxImage . Error );
21 if ( result == MessageBoxResult . OK )
22 Application . Current . Shutdown () ;
23 }
24 catch ( IOException e)
25 {
26 var result = MessageBox . Show ("ファイルが開けませんでした. アプリケーションを終
了します. ", "エラー", MessageBoxButton .OK , MessageBoxImage .Error);
27 if ( result == MessageBoxResult . OK )
28 Application . Current . Shutdown () ;
29 }
30 App . mainSourse = App . sReader . ReadToEnd () ;
31
32 }
33
34 private void NextPage_Click ( object sender , RoutedEventArgs e)
35 {
36 this . NavigationService . Navigate ( new Page2 () );
37 }
38
39 private void Cancel_Click ( object sender , RoutedEventArgs e)
40 {
41 Application . Current . Shutdown () ;
42 }
43 }
コード 4.4: Page1.xaml.cs(一部)
第 4 章 実装 20
1 < TextBlock Text ="ようこそ.これからで動作するスクリプトファイルをつくるウィザードを開始しま
す.Unity" HorizontalAlignment ="Left" Margin ="43 ,46 ,0 ,0" VerticalAlignment = " Top " FontSize =" 20 "/ >
2 < TextBlock Text ="次へをクリックしてください." HorizontalAlignment =" Left " Margin =
" 43 ,83 ,0 ,0 " VerticalAlignment =" Top " FontSize =" 20 " / > 3 < Button Name =" NextPage " Content ="次へ
" Margin =" 0 ,0 ,12 ,12 " Height =" 23 " VerticalAlignment =" Bottom " HorizontalAlignment =" Right " Width =" 75 " Click =" NextPage_Click " / > 4 < Button Name =" Cancel " Content ="キャンセル
" Margin =" 0 ,0 ,93 ,12 " Height =" 23 " VerticalAlignment =" Bottom " HorizontalAlignment =" Right " Width =" 75 " Click =" Cancel_Click " / >
コード 4.5: Page1.xaml(一部)
4.2.3
2 ページ目
2 ページ目では出力されるクラス名を入力してもらい,第 4.2.1 節で定義した dic に追加していく.
1 private void ReturnPage_Click ( object sender , RoutedEventArgs e )
2 {
3 if ( NavigationService . CanGoBack )
4 NavigationService . GoBack () ;
5 }
6
7 private void NextPage_Click ( object sender , RoutedEventArgs e)
8 {
9 App . dic . Add (" ClassName " , ClassName . Text );
10 this . NavigationService . Navigate ( new Page3 () );
11 }
コード 4.6: Page2.xaml.cs(一部)
1 < TextBlock Text ="まず,生成するクラス名を入力してください." HorizontalAlignment ="
Left " Margin =" 33 ,242 ,0 ,0 " VerticalAlignment =" Top " FontSize =" 20 "/ >
2 < TextBox Name =" ClassName " Width =" 350 " Text =" Class_Name " HorizontalAlignment =" Left " Margin =" 404 ,246 ,0 ,290 " FontSize =" 15 "/ >
3 < Button Name =" NextPage " Content ="次へ
" Margin =" 0 ,0 ,12 ,12 " Height =" 23 " VerticalAlignment =" Bottom " HorizontalAlignment =" Right " Width =" 75 " Click =" NextPage_Click " / > 4 < Button Name =" ReturnPage " Content ="戻る
" Margin =" 0 ,0 ,93 ,12 " Height =" 23 " VerticalAlignment =" Bottom "
HorizontalAlignment =" Right " Width =" 75 " Click =" ReturnPage_Click " / >
コード 4.7: Page2.xaml(一部)
4.2.4
3 ページ目以降
第 4 章 実装 21
4.2.5
保存ページ
保存ページでは第 4.2.1 節で触れた Generator クラスを用いてテンプレートと dic のデータを結合する. その後標準の保存ダイアログを出し,保存時に IOException が発生せず,正しく保存することが出来れば そのまま最終ページに移行する.1 private void Save_Click ( object sender , RoutedEventArgs e)
2 {
3 App . gen = App . comp . Compile ( App . mainSourse );
4
5 var dialog = new SaveFileDialog () ;
6
7 dialog . Filter = "Cファイル# (*. cs ) |*. csすべてのファイル| (*.*) |*.* ";
8 dialog . FilterIndex = 1;
9 dialog . RestoreDirectory = true ;
10
11 if ( dialog . ShowDialog () == DialogResult . OK )
12 {
13 string result = App . gen . Render ( App . dic );
14 try
15 {
16 File . WriteAllText ( dialog . FileName , result );
17 }
18 catch ( IOException er )
19 {
20 var error = System . Windows . MessageBox . Show ("ファイルが保存できません
でした.アプリケーションを終了します.", "エラー
" , MessageBoxButton .OK , MessageBoxImage . Error );
21 if ( error == MessageBoxResult . OK )
22 System . Windows . Application . Current . Shutdown () ;
23 }
24 this . NavigationService . Navigate ( new PageEnd () );
25 26 } 27 28 } コード 4.8: SavePage.xaml.cs(一部)
22
第
5
章
評価実験
5.1
目的
評価実験では, 本研究が提案するアプリケーションが意図した動作を正しく行うかを検証する. 具体的に は, 被験者たちが思ったようなソースコードを出力することが出来ているかを被験者に実際に体験してもら い検証をしてもらう. また, 使いやすさなど,インターフェースについても意見を問うことを想定している.5.2
方法
実際にアプリケーションを各被験者にインストールしてもらい,それを実際に使用してもらう.23
第
6
章
結論
本研究では,事前に用意したテンプレートを用いてソースファイルを出力することで,初学者に.NET ア プリケーションとしてそのシステムを実装した. 実装してみたことで,断片どうしで組み合わせをおこないソースを生成しようとしても,断片のつなげ 方でコンパイルが通らないようなソースが生成されてしまったりと,思ったような動作をさせるのが難し かった.6.1
今後の課題
6.1.1
コード断片の充実
コード断片は多ければ多いほど作成できるソースコードの幅も広がる.コード断片をより多く増やして, エンドユーザでも楽により多くプログラミングができるよう,コード断片を増やしていきたい.6.1.2
対応言語の充実
さらに多くの言語で対応できるように考えている.今回の場合では非常に限定された条件である C#によ る Unity のコードしか生成することができなかった.今後は Unity だけに限らずコンソールアプリケーショ ンや計算アルゴリズムなど様々なパターンを想定し開発することで,ユーザに多様な言語をサポートでき るよう,開発していきたい.6.1.3
インターフェースの充実
現状のシステムではインターフェースが簡素となってしまった.ライトユーザー向けのアプリケーション ということで,見た目を重視していく必要があったが,そちらへ注力できなかった.色や図などを多く取り 入れ,より直観的でわかりやすいインターフェースを作っていきたい.24
第
7
章
謝辞
この論文を執筆するにあたって, 電気通信大学情報・通信工学科コンピュータサイエンスコース寺田研究 室, 寺田実准教授のご指導の下卒業研究としておこなわれました. 寺田実准教授には卒業研究のアイデア, ア ドバイス, 参考論文の探し方や論文の書き方, 発表時の方法や注意など様々な部分でご指導頂きました. 心か ら感謝を申し上げます. また,明星大学情報学部情報学科の丸山一貴准教授にも研究室輪講時などにおいて, 様々なご意見, 協力 を頂戴いたしました. 修士課程 1 年の海老澤雄太さん, 長利槙吾さん, 齊藤令さん, 学部 4 年の 阿部真之さん, 鈴木佑樹さん, 本 田裕人さん, その他多数の方々には研究のアイデアやアドバイス, 協力等をいろいろな面で頂きました. 大変 感謝をいたします.25
参考文献
[1] 「情報教育の実践と学校の情報化:文部科学省」. http://www.mext.go.jp/a_menu/shotou/zyouhou/ 020706.htm.
[2] Jingguo Ge, Fusheng Tan, and Hui Zhang. ”robotic machining: A force-control-based fast programming method”. In Robotics, Automation and Mechatronics, 2008 IEEE Conference on, pp. 730–735. IEEE, 2008. [3] Mitchel Resnick, John Maloney, Andr´es Monroy-Hern´andez, Natalie Rusk, Evelyn Eastmond, Karen
Bren-nan, Amon Millner, Eric Rosenbaum, Jay Silver, Brian Silverman, et al. ”scratch: programming for all”.
Communications of the ACM, Vol. 52, No. 11, pp. 60–67, 2009.
[4] Ivan E Sutherland. ”sketch pad a man-machine graphical communication system”. In Proceedings of the
26
付 録
A
A.1
Mustashe
によるテンプレート
Mustache は Ruby や JavaScript などのスクリプト言語から開発が始まり, Java や C#など非スクリプト言 語でも使用することができるようになったテンプレートエンジンである. 現在では 33 の言語・環境で使用 することができる. 使い方としては, あらかじめ対応するデータ1を 1 { 2 " Name " , " John " 3 } のように用意しておき, Hello {{Name}}! のように扱いたいテンプレート文字列中の対応させたい部分に{{ }} で括りタグ付けをすることで, 文字列の コンパイル実行時にそのタグ付けされた部分が展開されて Hello John! といったように出力されるようになる. 今回の Mustache-sharp は改行文字を改行として認識しないため,改行を要する場合そこの部分に対して 1 {{# newline }} と記入することでテンプレートを展開する際,改行として認識される. また,if タグも存在し 1 {{# if foo }} 2 Hello {{ Name }}! 3 {{# else }} 4 Bye {{ Name }}! 5 {{/ if }} のようなものを用意したとき,foo に何らかの,空文字列以外の文字列が定義されていれば,if ブロック 内の文字列が展開され,空文字列が定義されていれば else 内の文字列が展開される.これを用いて大本と なるソースを作り, ウィザードの結果によって出力する内容を変化させる. 1ここでは JSON 形式で書いているが, 使用する環境によって異なる.本研究では C#の Dictionary<string,string> 用いた
付 録 A 27 1 using UnityEngine ; 2 {{# newline }} 3 using UnityEngine . UI ; 4 {{# newline }}
5 using System . Collections ;
6 {{# newline }}
7 using System ;
8 {{# newline }}
9
10 {{# newline }}
11 public class {{ ClassName }} : MonoBehaviour {
12 {{# newline }}{{# newline }}
13 public GameObject playerObject ;
14 {{# newline }} 15 Animator ani ; 16 {{# newline }} 17 ParticleSystem particles ; 18 {{# newline }} 19 LineRenderer line ; 20 {{# newline }} 21 AudioSource audio ; 22 {{# newline }} 23 Light light ; 24 {{# newline }} 25 GameObject camera ; 26 {{# newline }} 27 AudioSource audio ; 28 {{# newline }} 29 {{# if NeedNav }} 30 NavMeshAgent nav ; 31 {{# newline }} 32 Transform target ; 33 {{# newline }} 34 {{/ if }} 35 {{# if NeedVelocity0 }}
36 public float speed = {{ Speed }};
37 {{# newline }}
38 {{# newline }}
39 {{/ if }}
40 {{# if NeedAngVelocity0 }}
41 public float tumble = {{ Tumble }};
42 {{# newline }}
43 {{# newline }}
44 {{/ if }}
付 録 A 28 46 {{# newline }} 47 {{# newline }} 48 49 void Start () { 50 {{# if NeedNav }}
51 nav = GetComponent < NavMeshAgent > () ;
52 {{# newline }}
53 {{# newline }}
54 {{/ if }}
55 {{# if NeedParticles }}
56 particles = GetComponent < ParticleSystem > () ;
57 {{# newline }}
58 {{/ if }}
59
60 {{# if NeedLine }}
61 line = GetComponent < LineRenderer > () ;
62 {{# newline }}
63 line . SetPosition (0 , Vector3 ({{ LineVec3Pos }}) ;
64 {{# newline }}
65 {{/ if }}
66
67 {{# if NeedLight }}
68 light = GetComponent < Light > () ;
69 {{# newline }}
70 {{/ if }}
71
72 {{# if NeedAnimator }}
73 anim = GetComponent < Animator > () ;
74 {{# newline }}
75 {{/ if }}
76
77 {{# if NeedPaintColor }}
78 renderer . material . color = Color .{{ ColorName }};
79 {{# newline }}
80 {{# newline }}
81 {{/ if }}
82
83 {{# if NeedLoadFile }}
84 playerObject = Resources . Load (" {{ ResourcesAddress }} ") as GameObject
;
85 {{# newline }}
86 {{# newline }}
87 {{/ if }}
88 {{# if NeedSound }}
89 sound = GetComponent < AudioSource > () ;
付 録 A 29
91 {{# newline }}
92 {{/ if }}
93
94 {{# if NeedCamera }}
95 camera = Camera . main ;
96 {{# newline }} 97 {{# newline }} 98 {{/ if }} 99 100 101 {{# if NeedInvoke }}
102 Invoke (" {{ InvokeMethod }} " ,{{ InvokeTime }}) ;
103 {{# newline }}
104 {{# newline }}
105 {{/ if }}
106
107 {{# if NeedVelocity0 }}
108 rigitbody . verocity = transform . up . normalized * speed ;
109 {{# newline }}
110 {{# newline }}
111 {{/ if }}
112 {{# if NeedAngVelocity0 }}
113 rigidbody . angularVelocity = Random . insideUnitSphere * tumble ;
114 {{# newline }} 115 {{# newline }} 116 {{/ if }} 117 118 {{# if DestroyThisinStart }} 119 if ({{ DestroyThisWhen }}) 120 Destroy ( this ); 121 {{# newline }} 122 {{/ if }} 123 124 } 125 126 {{# newline }} 127 {{# newline }} 128 / / U p d a t e i s c a l l e d o n c e p e r f r a m e { { # n e w l i n e } } 129 void Update () { 130 {{# newline }} 131 {{# newline }} 132 {{# if NeedNav }}
133 nav . SetDestination ( target . position );
134 {{# newline }}
135 {{# newline }}
付 録 A 30
137
138 float pushX = Input . GetAxisRaw (" Horizontal ");
139 float pushY = Input . GetAxisRaw (" Vertical ");
140
141 {{# if MoveObject }}
142 float Accel = {{ accel }};
143 {{# newline }}
144 rigidbody . AddForce (
145 {{# newline }}
146 ( transform . right * pushX + transform . up * pushY ) * Accel ,
147 {{# newline }} 148 ForceMode . Impulse 149 {{# newline }} 150 ); 151 {{# newline }} 152 {{/ if }} 153 154 {{# newline }} 155 156 {{# if ChangeScene }} 157 if ({{ WhenChangeScene }}) 158 {{# newline }}
159 Application . LoadLevel (" {{ SceneName }} ");
160 {{# newline }} 161 {{/ if }} 162 163 {{# newline }} 164 {{# newline }} 165 {{# newline }} 166 {{# if NeedDestroyU }} 167 if ({{ DestroyWhenU }}) 168 {{# newline }}
169 Destroy ( gameObject ,{{ DestroyTimeU }}) ;
170 {{# newline }} 171 {{/ if }} 172 } 173 {{# newline }} 174 } 175 {{# newline }} コード A.1: 今回用いた Mustache によるテンプレート