GP11
期末課題の制作
第11回~第15回は期末課題のゲーム制作期間とする。
以下の3つのテーマから選んで各自で取り組むこと。
Roll a Ball をさらに改造
GP12~GP14で改造用のテクニックをデモして紹介
GP15の下のEXのサブページにはUnityプログラムの様々なテクニックを掲載
このほかUnity解説本やWeb記事や動画を参考にして作業する。
新規にUnityでゲームを制作
Roll a Ballの改造以上の内容を企画して制作すること。
採点基準:Roll a Ballの改造の続きに相当する内容の場合40点満点で採点。ゲームシステムとプログラムコードの量と質。
【重要】本講義で使用しているバージョンのUnityで制作する。採点の際にバージョン変更でのトラブルを避けるため。
異なるバージョンで制作した場合は採点できないことがある。
新規にSnap!でゲームを制作
Snap!によるゲーム制作も受け付ける。
採点基準:Roll a Ballの改造の続きに相当する内容の場合40点満点で採点。ゲームシステムとプログラムコードの量と質。
制作上の注意
過去に自作したゲームは受け付けない。期末課題制作期間の開始後に開発したゲームに限る。
個人開発であること。共同制作によるものは受け付けない。
AIによるコード作成支援の利用は認める。
新イベントシステムと旧イベントシステムついて
【重要】Unity公式記事
Unityの新入力システム・Input Systemを使おう
要確認:
InputSystem(新方式) と Input Manager(旧方式) を 切替 / 両用 する設定
ゲームパッド・キーボード・マウスの処理方法
InputSystem に Actionを登録する方法(Listen ボタン → マウス・ゲーコン・キーボード操作で自動割り当て)
ゲーム機(PC) → タッチスクリーン機種 対応のためのヴァーチャルパッド作成支援
実習室PCのUnityのVersion 2022.3.7f1 LTSは新旧両方のイベントシステムを併用できる設定(Both)になっている。
以下の解説のようにエラーになることはない。
【確認】 Unityメニュー Edit → Project Settings... → Player → Other Settings → Configuration → Active Input Handling → Both
Roll a Ball チュートリアルのプロジェクトは入力をInputSystemパッケージを追加して新方式で処理している。
その為、ネットで多く見つかる入力処理(Inputクラスに依存)のコードを用いても旧方式であるのでエラーで動かない。
旧イベントシステムのInput.GetKeyDownなどのコードは次のように修正する。
ネームスペースを追加する。
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
キーボードの「p」キーを押した際の処理の例
if (((KeyControl)Keyboard.current["p"]).wasPressedThisFrame)
以下の作業を行う実験用のシーンを既存のシーンから適当に選んでコピーして準備する
スクリプトによるループアニメーション
AnimatorとAnimation Clipを使用しないシンプルなアニメーション処理の例。
Pick UpのItemをRotator.csで回転させたように、C#スクリプトをゲームオブジェクトに設定してアニメーションさせることができる。
以下にリサージュ図形の軌道で移動するスクリプトを掲載する。
設定例)
(1/4) シーンに 3D Object から Capsule を追加して名前を Enemy に変える。
(2/4) アニメーション対象のオブジェクト(Enemy)に add Component から RigidBody を追加
Is Kinematic ON
Collision Detection Continuous Dynamic
(3/4) C#スクリプト WaveAnim を以下からコピペして作成する。
(4/4) WaveAnimスクリプトをEnemyにアタッチする。
上掲のコードはpublicメンバー変数にAttributeを設定している。
Attributeの設定でInspectorで操作する際にスライダーを利用したり値の範囲を制限できる。 https://ekulabo.com/attributes-for-inspector
Wave Animスクリプトのpublic フィールドの値をスクリプトを取り付けたオブジェクトのInspectorから調整する。
Ax Ay Az 往復距離(回転半径)
0 移動しない
マイナス値 逆回転(逆振動)
Fx Fy Fz 往復速度(角周波数)
0.5 0.5倍速(スロー)
2 2倍速
マイナス値 逆再生
Px Py Pz 初期位置(位相差)
Px - Pyなどの差によって
0 直線
90 円
180 運動の中心に対して反対の位置
ゲーム実行モードで数値をいろいろ設定して様子を確かめておく。
実行モードで試した数値は実行を停止するとシーン開始時点に戻るのでコピーしておくとよい。
Unity Editorのプリセット機能
プリセット機能を利用してアニメーション用のコンポーネントの値を何パターンか記録してみよう。
コンポーネントの設定値をプリセットに保存するにはメニューのアイコンから【Save current to】ボタンを押すとファイル名を指定後に新規保存できる。
既存のPresetファイルを選んで上書き保存も可能。
既存のPresetファイルをダブルクリックすると設定値を読み込む。
X軸方向に往復(直線)
XZ軸方向(斜め)に往復
XZ平面で回転
Y軸に縦揺+X軸に往復(ぴょんぴょん)
XZ平面でメリーゴーラウンド
Y軸方向に螺旋で上下
応用
WaveAnimをアタッチしたゲームオブジェクトをコピーしてずらして配置する。
Ax,Ay,Az,Fx,Fy,Fzは同じ値(同じ運動)のままでよい。
Px,Py,Pzの値をコピーしたオブジェクトごとにずらすと脈打つようなアニメーションになる。
以下の例ではPxを 0 20 40 60 と変えている。
アニメーションの初期位置の調整:
シーン編集の一時停止ボタンを押して再生する。
1フレーム目でシーンが停止する。シーンを1フレームずつボタンで進めることもできる。
WaveAnim.csのコードはアタッチしたGameObjectのシーン座標を基準(中心)として振幅が最大に振れた位置からアニメーションを開始する。
GameObjectのシーン座標からアニメーションを再生するには位相(Px,Py.Pz)を+90か-90する※。
※数学の三角関数(CosとSin)を復習してみよう。
Inspectorの数式機能で均等配置が楽にできる
(1/2) 均等配置するオブジェクトをShift+クリックして 順番 に選択
(2/2) Inspectorのプロパティの値に式を入力
L(先頭の座標 , 最後尾の座標)
衝突するとリスタートさせられるオブジェクト
Enemy オブジェクトに以下のスクリプト Restarter を作成して取り付ける。
新しくMaterialも作成してEnemyのマテリアルを危険性を感じる色に変更しておくとよい。
このコードではusingでネームスペース SceneManagementを読み込まずに、長い名前で UnityEngine.SeneManagement.SceneManager クラスを利用している。(usingを利用する方法もある)