GP11

期末課題の制作

第11回~第15回は期末課題のゲーム制作期間とする。

以下の3つのテーマから選んで各自で取り組むこと。


GP12~GP14で改造用のテクニックをデモして紹介

GP15の下のEXのサブページにはUnityプログラムの様々なテクニックを掲載

このほかUnity解説本やWeb記事や動画を参考にして作業する。


Roll a Ballの改造以上の内容を企画して制作すること。

採点基準:Roll a Ballの改造の続きに相当する内容の場合40点満点で採点。ゲームシステムとプログラムコードの量と質。

【重要】本講義で使用しているバージョンのUnityで制作する。採点の際にバージョン変更でのトラブルを避けるため。
異なるバージョンで制作した場合は採点できないことがある。


 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のプリセット機能

プリセット機能を利用してアニメーション用のコンポーネントの値を何パターンか記録してみよう。

【Unity】プリセットでコンポーネントの初期設定をカスタマイズする

https://nekojara.city/unity-preset

コンポーネントの設定値をプリセットに保存するにはメニューのアイコンから【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を利用する方法もある