GP02
C107情報実習室のUnity環境について
解説動画
https://youtu.be/rnUFm27ZCCY 前半15分は2020年の環境の説明です。
15分以降の内容は今年度も参考になると思います。
本講義「ゲームプログラミング」で使用するVersion Unity2022.3.7.f1 LTS
実習室のUnityの利用ライセンス
Education ライセンス 商用利用不可 C107情報実習室のPCだけに登録済み
Personal ライセンス
講義はEducationライセンスで行います。
UnityHubからUnityを起動してください。
UnitHubのサインインは不要。Unity IDに未登録でEduライセンスで起動可能。
Personalライセンスで取得したAsset Storeの Assetを利用するには UnityのPackage ManagerにPersonalライセンスでサインインして利用可能。
プロジェクトとファイルの保存に注意:
保存先の候補
推奨 ローカルドライブ D: に学籍番号付きのフォルダを作成して保存 デメリット 座席は固定。バックアップをコピーする必要有り(PC不具合でデータ消滅)
推奨 USBメモリに保存。デメリット USBメモリの破損と紛失。
非推奨 ユーザーホームディレクトリ(ドライブ H:、マイドキュメント)に保存。デメリット 受講生が一斉に保存する際にネットワークの負荷でデータ消失の可能性有り。
未検証 デスクトップに保存。以前にUnityでデスクトップに保存した際にプロジェクトが破損する不具合が起きていた。本年度は保存可能。Windowsのユーザプロファイル(ユーザ設定やデータ)が破損することがある。プロファイルの破損で消失の可能性有り
非推奨 ユーザ領域フォルダ C:\User\学籍番号 に保存。2023年度に保存失敗を観測
自習を推奨
自分のノートPCや自宅にPCがある受講生はこの授業で扱うUnityと同じバージョンのUnityをダウンロードして自習できるようにしてください。
以下の資料に従ってUnityの基本操作を練習する。
余裕が有れば適当に各自で練習内容をアレンジしてよい。授業で扱っていない機能を使用してもOK。
この作業は第2回と第3回に渡って行う。第3回で出来たところまでを提出する。
第2回課題
作業1/14
プロジェクト名 GP02
をUnity Hubから作成する。
Unityの基本操作
ウインドウ
公式資料を元に主なウインドウの機能を実演で説明する。
新バージョン(解説文:ほぼ英語) https://docs.unity3d.com/ja/2022.3/Manual/UsingTheEditor.html
(E)オーバーレイ のツールメニューが新規に追加されている
旧バージョン(解説文:日本語) https://docs.unity3d.com/ja/2021.1/Manual/UsingTheEditor.html
おすすめ記事
【UnityC#講座】Sceneビューのショートカットやお役立ち機能
シーン編集のショートカットが詳しく載っている。旧バージョンのUI
初心者が覚えておくべき11のUnityエディタ機能【Unityの使い方】
各ウインドウの機能が網羅的に載っている。
Unity で使える便利なショートカットキーまとめ【作業効率化】
シーンビューでオブジェクトをスナップ配置する方法
Unityのレイアウトをデフォルトにする
作業2/14
説明はデフォルトレイアウトで行うので同じ状態にしておくとよい(必要があれば)
シーンビューのオーバレイツールをデフォルトにする
ゲームオブジェクト
ゲームオブジェクトとコンポーネントについて
https://docs.unity3d.com/ja/2022.3/Manual/GameObjects.html
プリミティブゲームオブジェクトについて
https://docs.unity3d.com/ja/2021.2/Manual/PrimitiveObjects.html
作業3/14
GameObject -> 3D Object -> Cube でCubeをシーンに配置
Cubeを左クリックで選択して
インスペクターからTransformコンポーネント
プロパティ Posion の X の値 Y の値 Z の値を 全て1 に変更する
Sphere をシーンに配置
シーンギズモ(右上のアイコン)のXアーム Yアーム Zアームをクリックして配置関係を確認
alt + 左クリック + ドラッグ でCubeとSphereを斜め方向から見る位置に視点を回転移動
Qキー(View tool) → マウス左クリックでシーンビューを右方向にドラッグして視点をスライド移動
Cylinderをシーンに配置(シーンビューの中心点に配置される)
Cylinderを選択して、Transformコンポーネントをメニューから Reset する(Sphereと重なる)
HierarchyのSphereをダブルクリック(中央にズームして表示される)
マウスホイールを回転してズームアウト
作業4/14
オブジェクトの移動・回転・スケール https://docs.unity3d.com/ja/2022.3/Manual/PositioningGameObjects.html
適当に移動・回転・拡大縮小を試す
ショートカットキー W E R
コンポーネントのプロパティの編集 https://docs.unity3d.com/ja/2022.3/Manual/EditingValueProperties.html
Directional LightゲームオブジェクトのLightコンポーネントのColorプロパティをインスペクターから変更
シーンビューの操作
公式資料を元に実演で説明する。 https://docs.unity3d.com/ja/2021.2/Manual/SceneViewNavigation.html
作業5/14
編集モード
2D と 3D の切り替え
シーンギズモ(右上のアイコン)
gizmoを右クリック → Free や Top など視点メニューに切り替え
編集視点の切り替え
gizmoのアーム x y zをクリック
パースの切り替え(遠近法のOnとOff切り替え)
gizmoアイコンの中央部分クリック または
Persp / Iso アイコンをクリック
マウス操作
左クリック オブジェクト選択
Shift + 左クリック オブジェクト追加選択
Ctrl + 左クリック オブジェクト追加選択
左クリック→ドラッグ オブジェクト範囲選択
マウスホイール シーンのズーム
マウスホイール + Altキー マウスカーソルの位置にシーンをズーム
右クリック + ドラッグ 編集視点を中心としたシーンの回転
右クリック + WASDQE 視点方向にFPSの様にASDWで前後左右移動+QEで上下移動
alt キー + 左クリック + ドラッグ ピボットでシーンを回転(編集画面中央が回転の中心になる)
alt キー + 中央クリック + ドラッグ シーンをスライドして移動(altキーの効果なし)
+ shift キー 移動量増加(高速化)
alt キー + 右クリック + ドラッグ ズーム(マウスホイールと同機能)
+ shift キー ズーム量増加(高速化)
ショートカットキー
Q W E R T Y オブジェクト操作モードの切り替え
F 選択オブジェクト中心のシーンビューセンタリング
※Hierarchyでゲームオブジェクトをダブルクリックと同様
Shift + F focus lock オブジェクトの移動にシーンビューが追随
Control + A 全オブジェクトの選択
Control + I オブジェクトの選択を反転
応用 Control + A → F で全オブジェクトをシーンビューに表示
ゲームオブジェクトの移動ツール(ショートカットキー W)で使用する特殊な配置方法
https://docs.unity3d.com/ja/2022.3/Manual/GridSnapping.html
ユニットスナップ: 一定量スキップしながらの移動
Ctrl + ドラッグ
サーフェーススナップ: オブジェクトどうしが重ならずに接触するように移動可能
Shift + Control でハンドルに表示された四角枠をドラッグして移動(または回転)
頂点スナップ: オブジェクトの頂点を基準に移動(頂点を合わせる様な移動が可能)
オブジェクトの頂点をマウスでポイントし V を押しながらハンドルに表示された四角枠をドラッグ
V + Shiftで頂点スナップモードにする
ハンドルに表示された四角枠をドラッグして移動(オブジェクトの頂点が配置の基準になる)
V + Shiftで頂点スナップモードを解除
スクリーンスペースモード: シーンビューの奥行方向を無視して配置(シーンの3D空間ではなく画面(スクリーン)に配置した状態で移動)
Shift + ハンドル(または中心)をドラッグ
剛体シミュレーションの設定
Unityはゲームオブジェクトの物理的な挙動(落下・衝突・跳ね返り・摩擦)を制御する物理エンジンを内蔵する。
ゲームオブジェクトを物理シミュレーションの対象に設定する手順を示す。
作業6/14
gameObject (Cubeなど)を Sceneに追加
Scene編集ウインドウから gameObjectを選択 → Inspector から
add Component
Physics → Rigidbody
Rigidbodyをコンポーネントに持つgameObjectは物理シミュレーションの対象となり重力の影響でゲーム中に落下や衝突するようになる。
床を追加
Plane を上で追加したgameObjectの下に配置する。
Planeは片面ポリゴンで厚さは0で裏側からはレンダリグされない。
照明の向きを変更
Sceneに最初から配置されているDirectional Light の方向を Inspector から修正する
Y軸やX軸の数値を調整(入力するか または ラベルをドラッグ(Shift + 変化量増加)
シーンを再生して動作を確認
落下物が床に衝突して止まったら成功
Visual Studio 2022をUnityに設定する
メニュー Edit → Preferences → External Tools
を開いて
External Script Editor に Visual Studio 2022
を設定する
※ 第1回に設定済み。この設定が元に戻っていることがある。設定方法を覚えておいてください。
床に衝突して消滅するオブジェクト
作業7/14
C#のコードをプロジェクトに追加
方法1
hierarchyで Plane を選択
add Componet から new Script で
スクリプト名 GP02
を追加
方法2
ProjectのAssetsを選択
+ボタン -> C# Scriptを追加 / 右クリック-> Create -> C# Script
スクリプト名 GP02
シーンビューのPlaneにDnDで追加
ProjectのGP02.csスクリプトをダブルクリックしてVisual Studioから編集する。
基本的なコードが記述されている。これにVisual Studio から以下のコードを追加する。
メソッド解説
目的「床Planeに衝突した落下物CubeがPlayerタグを持っていたら消去」
OnCollisionEnter はダイナミックな(動く)gameObjectに衝突が発生した際に呼び出されるメソッド(オブジェクト指向プログラミングの用語。C言語の関数に相当)
このメソッドは引数 collision に衝突した相手のオブジェクトがセットされた状態で実行される。
CompareTag は衝突したオブジェクトに設定されているタグ(Tag)と引数のタグが一致するか判定するメソッド(戻り値は True か False のBool型)。
if文でCompareTagの判定結果によって特定のオブジェクトを破壊(再生シーンから削除)する。
Destroy()メソッドはゲームオブジェクトをユニティのステージから消す(メモリから消す)メソッド。
シーンの再生中はDestroyしたオブジェクトはシーンのHierarchyからも消える。
再生を停止するとDestoryされたオブジェクトはシーンに復活する。
検索キーワード: unity オブジェクト 衝突 削除
参考ページ: https://tech.motoki-watanabe.net/entry/2019/01/25/150108
進捗管理 第2回
2023年度の水1クラスはここまで進んだ。移動ツールのオブジェクトのスナップは省略した。
水1クラスは Cube(1)にPlayerタグを設定してしまったので、戻してから以下のステップを再開する。
Unityの小技も紹介
2023年度の月5クラスもここまで進んだ。作業8/14のPlayerタグ設定まで説明済み。足並みをそろえるためにCube(1)からPlayerタグを削除してから8/14に進むことにする。
作業8/14
シーンに落下物を追加
(1/3) 落下物(CubeやSphereなど適当に選んだ3Dオブジェクト)をシーンに加える
3D Object から Sphere をヒエラルキーに追加
位置とサイズを調整
(2/3) 剛体に設定
addComponentから Physics → Rigidbody
(3/3) オブジェクトにPlayer タグを設定する
SphereのInspectorからTagを Untagged から Player に変更(メニューで選択する)
動作確認
再生ボタンでシーンを再生する。
ゲームビューでPlayerタグを設定したSphereが床と衝突したタイミングで消えたら成功。
HierarchyからもSphereが消えることを確認する。
シーンの再生を停止するとSphereはHierarchyに復活して場所も元に戻る。
作業9/14
プロジェクトのビルド
プロジェクトをビルドするとゲームデバイス(スマフォやWindowsなど実機)で実行可能なファイルが生成される。
ビルドの前に編集中のシーンをFileメニューから名前を付けて保存(Save as)する
または、Projectウインドウの Assets > Scenes の中のSampleSceneの名前をクリックして変更
シーン名 GP02
Fileメニュー → Build Settings から
add Open Scenes ボタンを押して編集中のシーンをビルド設定に加える。
https://docs.unity3d.com/ja/2020.3/Manual/BuildSettings.html
Build Settingsパネルの build ボタン を押す。
ビルドする場所を選択
ビルドファイルの保存場所について※1
ユーザーホームディレクトリや受講生が作成したこの授業用のフォルダの中に、このプロジェクトのフォルダ「GP02」がある。
その中に新規フォルダ を作成して名前を付け替える
フォルダ名 build
buildフォルダを選択して フォルダを選択 ボタンを押す。
※1 プロジェクトのフォルダGP02をビルドするフォルダに設定すると2021年度に不具合が起きたための対処
作業10/14
ビルドしたゲームの実行
ビルドが正常に終了したことをUnityエディタのステータスバーで確認する。
エラーが表示されていたらUnityプロジェクトやビルド設定を調べて修正する。
ビルドが正常に完了すると実行ファイル GP02.exe がファイルエクスプローラーに表示される。
GP02.exe をダブルクリックして実行する。このファイルはUnityエディタを閉じても独立して実行することができる。ビルドしたゲームを他のPCにコピーする際は buildフォルダ全体をコピーする必要がある。GP02.exeだけではゲームは起動できない。
今回のプロジェクトではシーンの終了条件をプログラムしていないのでゲームを終了させることができない。
Alt+F4キーを押して強制終了する。
教育機関ライセンス Unity Educationの挙動に対応
ビルドした実行ファイルを起動するとSplash Screenと呼ばれるスクリーンにUnityのロゴが表示される。
1秒ほど経過してSplash Screenが消えた後でゲームの画面が表示される。その時点でゲームのシーンも1秒ほど経過しているため、ゲーム開始直後から動いているオブジェクトの位置がUnityエディタのシーンビューで実行を確認した時よりも時間が進んだ状態で画面に表示される。2022.3.7f1 LTS ではこのバグは修正済みだった。
時間が進まないように
Splash Screenの表示をオフにする。
※PersonalライセンスではSplash Screenをオフにできません※※。教育機関ライセンスではオフに出来ます。替わりに実行画面にFor education use only とウォーターマークが入ります。
※※2023.9.23 UnityからPersonalライセンスでもSplash Screenを消せるようにするとアナウンスあり
作業11/14
スプラッシュスクリーンを消す設定
Build Settingsから Player Settings ボタンを押して以下の画像のように Playerの
Splash Image の Show Splash Screen を off
Resolution and Presentation の Fullscreen Mode を Windowed に変更
Window Modeでゲームを実行するように修正する。
応用1 キーボードで床を傾ける
作業12/14
ネットで「Unity キーボード入力 オブジェクトの回転」で検索して見つけたコードをGP02.csに組み込む。
例)【Unity】キーボードのキー操作でCubeオブジェクトを移動、回転、大きさを変更するやり方【使い方】https://lanstar-blog.hatenablog.com/entry/444834702.html
キー入力と回転に関するコードを抽出して以下に記載した。
動作確認1
シーンを再生する。
床に落ちたSphereやCubeは動きが止まった後では床を傾けても落下しない。
SphereやCubeが床に衝突する以前に床が傾いていた場合は落下する。
※物理シミュレーションの衝突判定のタイミングについて後ほど解説する。
床は片面ポリゴンなので裏側からは見えない。
動作確認2
シーンを再生したままシーンビューを表示して、床に落ちたオブジェクトをマウスで少し移動させる。
→床を転がり落ちる。→衝突判定と物理シミュレーションは動作している。
なぜそうなるのか?
→スクリプトによる床の移動・回転は物理シミュレーションに組み込まれないため。物理エンジンは床が動いていないものとしてシミュレートしてしまう。
作業13/14
床の物理設定を修正
シーン GP02 → Plane → Inspector
add Component から Physics → Rigidbody
を追加する
InspectorからRigidbodyコンポーネントの
Is Kinematic を On
に設定する
UnityではRigidbodyを持たないゲームオブジェクトは動かないゲームオブジェクトとして扱われる。
そのためスクリプトで床を回転させても床の状態の変化は物理エンジンに伝わらず水平の初期位置のままとして処理される。
床にRigidbodyを追加すると物理エンジンからは動くオブジェクト( dynamicオブジェクト)として処理される。スクリプトによる 移動・回転も物理演算に組み込まれる
確認
Is Kinematic がon
→ 床(plane)はRigidbodyなのに落下しない
→床(plane)は他のオブジェクトとの衝突で動かない
→Use GravityのOn/Offは影響しない(落下しない)
実験
前述の様にスクリプトでオブジェクトの座標を直接移動したり回転させる場合はRigidbody+Is Kinematic Onの設定でOK。
以下で特殊な設定について動作を確認しておく
床が物理判定の対象にり衝突処理も機能する。他のオブジェクトがめり込んだ配置になっていると再生時に床が吹き飛ぶことがある
床の位置を調整して他のオブジェクトにめり込まないようにする
床の衝突判定方法を変更する
Plane のInspectorから
Mesh Collider の
Convex を On
に設定する。(Convex:凸形状)
https://docs.unity3d.com/ja/2018.4/Manual/class-MeshCollider.html
Is Kinematic がoff で Use GravityがOn
→ 床は落下する。床は他のオブジェクトとの衝突で動く
Is Kinematic がoff で Use GravityがOff
→ 床は落下しない。床は他のオブジェクトとの衝突で動く
床の衝突範囲の調整
Mesh Collider の Convex をOnにすると PlaneのScaleに対応したMesh Colliderが自動生成され、シーンビューで緑の枠で表示される。
Scale Y が 1 になっているので衝突範囲に狂いが生じている。
Scale Y を 0.01
に修正する。
応用2 C#でUnityのオブジェクトの色を変更
作業14/14
参照ページ: https://teratail.com/questions/24071
このサイトのコードを参考にして作業を続ける。
マテリアルの準備
https://docs.unity3d.com/ja/2022.3/Manual/Materials.html
マテリアルを新規作成するにはUnityのメニューまたは プロジェクトビュー のコンテキストメニューから Assets->Create->Material
Albedo の色設定アイコンから適当に異なる色を設定する。
同様の操作を繰り返してマテリアルを3個作成する。
名前も適当に付けておく。
color1
color2
color3
など。
床のオブジェクトに組み込んだ衝突判定スクリプト GP02.cs スクリプトにコードの例を参考にしてメンバー変数を2つ追加する。
Material配列型 mats 要素数は10
int型 count 初期値は 0
メンバー変数: スクリプトがアタッチされたゲームオブジェクト毎に独立した個別の変数。
アクセス修飾子: public と private を指定できる。public を指定したメンバー変数はUnityエディタに接続されInspectorのスクリプトコンポーネントのスロットから編集できるようになる。
詳細についてはこちらを参考に。https://papersloth.hatenablog.com/entry/2020/05/25/135813
マテリアルをC#スクリプト GP02 に渡す
プロジェクトウィンドウの各マテリアルを 床のGP02 スクリプトのInspector に表示されたmats 欄にドラッグ&ドロップ(〇アイコンから選択でもOK)して設定する。
↑「アタッチ」と言います。Unityでオブジェクトに他のオブジェクトやスクリプト、素材などを紐づけすることです。
参照:Unityのパブリックなフィールドとシリアライズなフィールドについて https://ekulabo.com/public-or-serializefield
コード例
キーボード入力のフォーカスが Gameビューに当たっていないと反応しない
Gameビューをマウスでクリックしてからプレイボタンを押して動作を確認する必要がある
(余談)
※ GetComponent<Renderer>().material = mats[count];
の代わりに、Start()メソッドで
mat = GetComponent<Renderer>().material;
Update()で
mat = mats[count];
としても一見うまく動くように見えるが期待通りの動作(色の変更)は起きない。
原因:
Renderer クラスの material プロパティから値を取得する際に、Materialオブジェクトがコピーされて元のMaterial(Rendererで使用される)とは別のMaterialとして mat 変数に保存されるためである。
RendererにはコピーしたMaterialは渡されていない。
Unity API Reference
https://docs.unity3d.com/2023.3/Documentation/ScriptReference/Renderer.html
チャレンジ
Rigidbodyにしたオブジェクトを選択して、Ctrl+Dで同じ位置に多数複製。再生すると爆発した様に散らばる。
落下物の増加。gameObjectは3DでCollisionを持つタイプにする。Playerタグを付けるものとつけないもの、マテリアルを設定して色を変えたものなどいくつか用意する。
床の回転のコードを Z と C キー で Z軸 で回転 (反時計回り と 時計回り)するように修正する。
キーボードで操作するプレイヤーオブジェクトをシーンに加える(ヒント)。第4回からのRollaBallチュートリアルでも扱う。
衝突発生で効果音を出す(GP01のコード参照。ヒント)
応用1で追加したコードは無制限に床を回転させてしまう。床が回転可能な角度を範囲制限をする(一定以上動かさない)コードを追加する。
プレイヤーを追跡するオブジェクトをシーンに配置する(ヒント)
ネットで検索してUnityのシーン設定やC#スクリプトを組み込んで動かしてみて下さい。
進捗管理 第3回: 2023年度の水1クラスと月5クラスはここまで進んだ。
ビルドでWindowモードで実行は説明だけでスキップした。
kinematicの実験はスキップした。
応用1と応用2まで実演した。ついてこれない受講生は応用1までは進むように案内した。
チャレンジの実演
Z C で床を左右に回転
キーボードで操作するプレイヤーの追加
できたところまででExportして終了
保存を忘れる受講生が発生。案内が必要。
課題提出
スクリーンショット(1/2)
取り組んだ内容が分かるように適当に編集画面や実行画面をスクショする。
複数のスクショを1枚の画像にまとめてもよい。
ファイルをWebclassの第2回課題 問1に提出する。
ステップ再生を利用するとゲームのシーンをフレーム単位で進めることができる。
下の例では、床はもっと傾けて(キーボード操作の効果)、ボールはDestroyされているところまで進めてスクショすると作業内容がより伝わる。
Packageファイル(2/2)
シーンの再生をストップ
シーンやプロジェクトを保存
メニュー Assets から Export Package...
パッケージの保存先は自分で選ぶ(デスクトップでもOK)
ExportするAssetを確認して不足があれば追加する。
シーンやマテリアル、スクリプトなどすべて含めておくこと。
パッケージ名 GP02 を入力して Export ボタンを押す
※拡張子は unitypackage の状態で保存してください。
※※ 間違えて.slnファイルを保存しないでください。
保存した GP02.unitypackage ファイルをWebclassの第2回課題 問2に提出する。
チャレンジに挙げた工夫などを評価する。
Exportしている様子
GP02.cs と GP02.unityのファイルが含まれていることを確認する。
ファイルが足らない場合はProjectsのAssetsフォルダを選択してからExport作業を再度行う。