平成26年度卒業論文 ウィザードを用いて プログラ...
TRANSCRIPT
平成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章では,実験の結果と考察について述べる.
• 第 6章では,結論と今後の課題について述べる.
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 Scratch1
マサチューセッツ工科大(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 Viscuit3
Viscuitは日本の NPO法人デジタルポケット 4 が開発した VPLで,小児や高齢者に対して「コンピュー
タというものはこういうものなのだ」ということを直観的に知ってもらうためとして作られた 5.
2.2 統合開発環境におけるプログラミング開始時のウィザード
次に統合開発環境におけるプログラミング開始時のウィザードについて説明する. 統合開発環境は簡単に
開発を始められるようにウィザードが用意されおり,これにより最低限のソースコードが用意された状態で
開発できる. 以下各統合開発環境における例を挙げる.
2.2.1 Eclipse6
Java等の開発によく用いられる 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 Studio7
Microsoft 社の Visual Studioでも GUIウィザードを用いて初期のソースコードの生成をする. 図 2.4 は
Microsoft Fundamental Classes(以下MFC)を用いるアプリケーションの作成の為に用意されたウィザード
である. MFCは win32用 C++のクラス群であるから,比較的記述しなければならない内容も多く,そのため
出力するファイルも複数の場合が多い.
図 2.4: Microsoft Visual Studioにおけるコード生成ウィザード
7http://www.visualstudio.com/
第 2章 関連システム,関連研究 11
2.3 その他関連項目
一般にプログラムのソースコードを出力するプログラムのことをメタプログラムと言うが, これは Lisp
の時代から行われてきたものである. Ruby on Rails8 などもテンプレート生成するプログラミング言語で,
MVCモデルと非常に相性がよいフレームワークとしてよく使われている.
また, GUIからソースを出力するものとして, Jingguo Geらの研究 [2]があり,これは GUIを使ってロボッ
トを動かすためのアルゴリズムとなるような RAPID言語のプログラムファイルを外部に出力するようなア
プリケーションに関する研究である.
図 2.5: Geらによる RAPIDソース出力ツールの UI[2]
8http://rubyonrails.org/
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.2: 2ページ目のスクリーンショット
第 3章 提案システム 14
図 3.3: 3ページ目
図 3.4: 保存画面
第 3章 提案システム 15
3.2.5 最終ページ
最終ページには終了ボタンが用意されており,アプリケーションを終了することができる.
図 3.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 {
第 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ページ目以降
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, Andres Monroy-Hernandez, 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
SHARE design automation workshop, pp. 6–329. ACM, 1964.
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}}
45 {{#newline}}
付録 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 > ();
90 {{#newline}}
付録 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}}
136 {{/if}}
付録 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によるテンプレート