42TokyoにあるUnityの課題をやってみた
はじめに
課題のクリアはしておらず、あくまでやってみたです。
課題の概要
・オブジェクトを操作して、その影を求める形に合わせる。
(目標とするようなゲーㇺはこれです。バイオハザードの謎解きとかのイメージが分かりやすいかと思います。)
・3種類の難易度のステージが存在し、
水平の回転が可能
水平・垂直の回転が可能
複数オブジェクトが存在する
というように難易度が上がること
・セーブデータを保存すること
・ステージはある程度順番に沿ってクリアできなければならない
・アセットストアは使用禁止
大まかにはこれぐらいです。もっと細かくは色々ありますが、
ステージ選択のシーン
シーンはこんな感じです
球はステージを表しています。
難易度は色で決めており、(易)緑・黄色・赤(難)の順です。
クリア済みかは色の明るさで決めています。
シリンダーはそのステージへの挑戦できるかを表しています
(現在は全て解放済み。できな場合は色が薄くなる)
現在は中央の黄色のステージを選択状態です。
ステージ選択は球のクリックで行い、マウスクリックした際にレイキャスティングして、どのオブジェクトをクリックしたかを検知するようにしています。Physics.Raycastを使用するだけで取ってこれます。
選択対象が変わった場合はそのステージがカメラ中央にスムーズに来るようにしています。移動にはleap関数を使用しています。
セーブデータの保存にはPlayerPrefsを使用しています。
JSON形式でデータを保存するようにしました。
ステージの相関関係はScriptableObjectを使用しています。
このステージの解放条件はどのルートの解放かとか
パズルシーン
こんな感じです。
一応正解は「正」って漢字が出てくるようになっています。
ここでの機能としては
ドラッグ 水平の回転
Ctrl+ドラッグ 垂直の回転
Alt+ドラッグ 正面を軸とした回転
Shift+ドラッグ 移動
パズルのオブジェクトをクリック 操作対象を変更
があります。水平・垂直の回転はワールド空間での方向で考えて回転するようにしているため、正面を軸とした回転も加えています。(正面を軸としたズレが発生し、ユーザーでの修正はストレスに感じるため)
回転にはQuaternion.AngleAxisを使用しました。
正解となるオブジェクトの向きはScriptableObjectで保存するようにしました。
判定にはQuaternion.Angleを使用して、一定の値以下になれば正解としています。
また、複数オブジェクトの際はScriptableObjectに2つのオブジェクトの位置関係も保存しており、そこから一定の値以内に入っているかを判定するようにしました。
正解となった場合はよりきれいに影の形が分る角度までQuaternion.Lerpを使って回転するようにしています。
クリア後はメニュー画面に戻れるようにしています。
余談
一応新しくステージが入った場合でも追加しやすいようにエディター拡張もいれてみたりしました。
新しいステージがどのステージと繋ぐかを指定すると、シリンダーの自動生成を行い、ScriptableObjectも生成、DBに組み込むようにしたりしました。
終わりに
かなり質素な見た目にはなりましたが、求められている部分はできているかなと思います。もっとやるならステージ選択画面の床にスプライトを張ったり、ステージ解放時の演出(今回はデフォルトのパーティクルで済ませました)も色々と改善できるとは思います。
でもその辺りはアセットストアで済ませるようなものかもしれませんね。
Unityの課題はもう一つあるのですが、なかなか時間がかかりそうなので、ある程度できたら記事を書こうと思います。