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ライセンスでサインインして利用可能。


プロジェクトとファイルの保存に注意

保存先の候補

自習を推奨

自分のノート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初心者が知っておくと少しだけ幸せになれる、シーンにオブジェクトを配置する時に使える18のTips+10

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を右クリック →  FreeTop など視点メニューに切り替え

編集視点の切り替え

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回

202年度の水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  Screenoff

Resolution and PresentationFullscreen ModeWindowed に変更

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 GravityOn
 → 床は落下する。床は他のオブジェクトとの衝突で動く



Is  Kinematic  がoff  で  Use GravityOff
 → 床は落下しない。床は他のオブジェクトとの衝突で動く

床の衝突範囲の調整

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

など。


メンバー変数: スクリプトがアタッチされたゲームオブジェクト毎に独立した個別の変数。

アクセス修飾子: publicprivate を指定できる。public を指定したメンバー変数はUnityエディタに接続されInspectorのスクリプトコンポーネントのスロットから編集できるようになる。

詳細についてはこちらを参考に。https://papersloth.hatenablog.com/entry/2020/05/25/135813


プロジェクトウィンドウの各マテリアルを 床の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

解説記事 https://ufcpp.net/study/csharp/oo_property.html

チャレンジ

ネットで検索してUnityのシーン設定やC#スクリプトを組み込んで動かしてみて下さい。

進捗管理 第3回: 202年度の水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作業を再度行う。