i-school - 復習課題 チャプター3 その1
 Unityの教科書のチャプター3終了後の復習課題です。
ルーレットのプロジェクトを開いて、復習を行ってみてください。

 課題としましては、スクリプトの構文の作り方(if文による制御条件の考え方)が主軸です。

 課題の内容を確認して、処理を実装してください。実装した際の処理は、課題内で用意した動画の状態になるようにお願いします。
なお回答例は閉じてありますので、ご自分の実装を行った上で確認してください。

 課題にはヒントを提示してありますが、分からない場合にはネット検索をして、調べてみてください。

 また処理には適宜Debug.Log()メソッドを入れて、どこまで正常に処理が動いているかを確認していくように心がけてください。

 エンジニアにとっては、プログラムを読み書きする力と同じ位、ネット検索して問題点の特定・解消を行う情報を見つける、調べる力が必要不可欠になります。



1.一時的に減速処理を実行しないようにする


 今後の処理の実装の確認を行いやすくするため、一時的に、回転速度を減速する処理を止めて置くようにします。
ゲームを実行した際に、回転速度が減速しないようにしてください。

 ヒントは、処理のコメントアウトです。

実装動画(回転速度が減速しない)
https://gyazo.com/3d060dc13c0fb5f393a6f9a179953c97


回答例

RouletteController.cs

<= クリックすると回答例が開きます。



2.マウスの左クリックをしたら、今と逆回転するようにする


 現在ルーレットゲームではマウスの左クリックをすると時計の反対回転をするように動作します。
こちらを逆回転(時計回り)になるように、処理を修正してください。

 ヒントは rotSpeed に代入する値です。

実装動画
https://gyazo.com/37eca6f84ebb1b1277a15afcf9ac3928


回答例

RouletteController.cs

<= クリックすると回答例が開きます。



3.回転速度の速度の設定値を変数化する


 現在は定数としてコード内に記述している rotSpeed 変数へ代入する値は、回転速度を設定する速度の値になっています。
この値を定数ではなく変数にして値を代入するようにしてください。
(コードの下記の部分の 10.0f の部分を変数に置き換えるための、処理を追加・修正してください。)

 this.rotSpeed = 10.0f;


 ヒントは次の通りです。

 ・新しく変数を宣言して用意する
 ・用意した変数を代入する
 ・代入処理は、左辺の変数 = 右辺の変数 の型が同じでないと成立しない


回答例

RouletteController.cs

<= クリックすると回答例が開きます。



4.速度設定用の変数をインスペクターから変更できるようにする


 【3】で用意した速度設定用の変数によって、rotSpeed の値には変数の値が代入される処理になりました。
次は、この速度設定用の変数をインスペクターから変更できるようにしてください。
 
 この手順を実装することによって、コードの修正を行わなくても、インスペクターから値を変更することで、回転速度を変更出来るようになります。

 ヒントは、変数の修飾子、あるいは変数に付与する属性情報です。

実装したインスペクターの画像
https://gyazo.com/5ec7bb8ea9218937ea8f143fa211bf81

実装動画
https://gyazo.com/7afe955aad2c1a8ec1d1d1d87652940c


回答例

RouletteController.cs

<= クリックすると回答例が開きます。



5.ルーレットの回転中にマウスの右ボタンを押すとルーレットがストップするようにする


 新しい処理としまして「ルーレットの回転中にマウスの右ボタンを押すとルーレットがストップする」という機能を追加します。

 ヒントとしては、制御文(〜したら、〜する)を用意することになります。

 「マウスの右ボタンを押すと」 とはつまり、

   => 制御文の(〜したら)の部分です。現在のマウスの左ボタンと同じような処理で制御できます

 「ルーレットがストップする」 とはつまり、

   => 制御文の(〜する)の部分です。つまり、処理の内容に当たります。
     ルーレットを回転させているのはTranlateメソッドですが、このメソッドは、回転速度を元に処理を実行しているにすぎません。
     ということは、「ルーレットがストップする」とは、回転速度が 0 の状態ではないでしょうか。

 
 上記のように、処理を設計して実装するとは「日本語をプログラム語に変換する」ことと同義です
どのように構文を考えていければ処理として成立するのか、その部分を考えていきます。


実装動画
https://gyazo.com/9648bfd65383e6bd5b8c908ad127f29f


回答例

RouletteController.cs

<= クリックすると回答例が開きます。



6.回転する方向をボタンによって変化させる


 新しい処理を1つ追加します。キーボードの R ボタンを押したら、回転方向が現在の回転方向を反対方向になるようにします。
つまり、逆回転時に R ボタンを押すと正回転(時計周り)になり、正回転時に R ボタンを押すと逆回転になる、という機能です。

 ヒントは、回転している向きの状態を管理する、ことです。
 
 現在は回転している向きの情報は、スクリプトでは管理していません。まずは、この回転している向きの情報を管理できるように、変数を用意します。
Aという状態なら逆回転、Bという状態なら正回転、というように、役割を与えて考えてみましょう。このような2つの状態の判定に使える型があります。


 情報を管理できるようになったら、次は、その情報と R ボタンの入力とを紐づける必要があります。
R ボタンが押されたら、という処理は制御文で処理が可能です。その処理の内容に、先ほど用意した回転の向きを管理する変数に対して代入します。

 最後に、この回転の向きの情報に合わせて、回転速度を設定する変数の値も変化させる必要があります。
 
 逆回転のときの速度の値と正回転の時の速度の値が同じでは、どちらも同じ回転になってしまいますので、これも制御文を使って管理します。

 
実装動画
https://gyazo.com/f52c326f9a08cc25693f99a095d82b70

インスペクターの動画(逆回転と正回転での数字の違い)
https://gyazo.com/39e40c3d397a7650c621c99bf6bb5946


回答例

RouletteController.cs

<= クリックすると回答例が開きます。




 以上でこの課題は終了です。おつかれさまでした。もしもわからない部分がありましたら、もう一度、挑戦してみてください。


発展課題 【6】の処理を簡潔に書く方法


 参考までに【6】の処理を簡潔に書く方法を提示致します。こちらでは、if文に対して三項演算子という処理と、bool型の反転処理に対して否定演算子による反転処理を利用しています。

回答例

RouletteController.cs

<= クリックすると回答例が開きます。