AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

20選択の英単語穴埋め

ブログ更新が一ヶ月ぶりです。
ここのところ忙しかったもので、しばらく間が空いてしまいました。
終末は東京に行く用事がありますが、来週あたりからまた更新できそうです。

というわけで、
クイズアプリを以前作っていましたが、学習系アプリに興味があるので、
英語の学習アプリを作ってみたいと思います(英語に限らず、汎用的に)

英文の一箇所空いていて穴埋めみたいな問題はよくありますが、
実際は選択問題ではなく、直接書くほうが実践的です。
ですが、アプリだとそういうわけにもいかないので(ソフトキーボードで打てばできるけど)
選択肢でやるとしても、3択とか5択では、簡単すぎます。
人間が予め、間違いやすそうな選択肢を用意すればそれでもいいのですが、
センター試験の文法問題とか)
コンピュータに誤答の選択肢を用意させようとするなら、ランダムにとってくるので、
選択肢を増やせば難易度上がるだろうという仮定の元に、
20選択肢ぐらいでやってみたいと思います。
ここで問題なのは、画面に表示しきれない場合はスクロールできないといけない。
f:id:yasu9780:20150805183055p:plain


というわけで、AutoLayout系UIでやってみました。
具体的には、
Canvasの子にScrollViewというemptyなGameObjectを作って、
②MaskとScrollRectとImageをComponentとして追加します。
③そしてさらに子どもにContentというemptyなGameObjectを作って、
④VerticalLayoutGroupとContentSizeFilterというComponentを追加します。

で、具体的に追加登録するnodeは、
⑤emptyなGameObjectを作って、Nodeと名付け、
⑥ImageとLayoutElementをComponentとして追加します。選択肢なのでさらに子にbuttonを追加します。
 このLayoutElementがみそです。ImageとしてのNodeの縦幅をMinHeightに登録して置くと、
 nodeを追加登録した時に、それだけづれて登録されます。
 それゆえにAutoLayoutです。
 Maskがあるので、スクロールさせて中を覗き見るようなイメージになります

20個のnodeはループを回して追加します。
実際の選択肢は、英文から適当にとってきて入れておきます。

for(int i=0; i<20; i++)
{
	var item = GameObject.Instantiate(prefab) as RectTransform;
	item.SetParent(transform, false);
	var bt = item.GetComponentInChildren<Button>();
	var tx = bt.GetComponentInChildren<Text>();
	tx.text = (i+1).ToString()+". 選択肢";
}

同じ英単語の選択肢ができるといけないので、Hashtableでチェックしましょう。

本当は、英単語の品詞を調べて、同じ品詞の誤答を用意するなどすれば、いい感じの選択肢作れるんだろうけど、
英単語の品詞解析をUnityから動かすのもたいへんなのでスルー


参考
UnityのuGUIでスクロールビューを作る - テラシュールブログ