ブログ更新が一ヶ月ぶりです。
ここのところ忙しかったもので、しばらく間が空いてしまいました。
終末は東京に行く用事がありますが、来週あたりからまた更新できそうです。
というわけで、
クイズアプリを以前作っていましたが、学習系アプリに興味があるので、
英語の学習アプリを作ってみたいと思います(英語に限らず、汎用的に)
英文の一箇所空いていて穴埋めみたいな問題はよくありますが、
実際は選択問題ではなく、直接書くほうが実践的です。
ですが、アプリだとそういうわけにもいかないので(ソフトキーボードで打てばできるけど)
選択肢でやるとしても、3択とか5択では、簡単すぎます。
人間が予め、間違いやすそうな選択肢を用意すればそれでもいいのですが、
(センター試験の文法問題とか)
コンピュータに誤答の選択肢を用意させようとするなら、ランダムにとってくるので、
選択肢を増やせば難易度上がるだろうという仮定の元に、
20選択肢ぐらいでやってみたいと思います。
ここで問題なのは、画面に表示しきれない場合はスクロールできないといけない。
というわけで、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から動かすのもたいへんなのでスルー