👶

Unity入門

2023/09/16に公開

Unity

🔵Unity Hub
 →構築するプロジェクトを管理し、Unityエディターのバージョンを常に改善するために
  不可欠なツール
 →ハブを使用して新しいプロジェクトを開始し、このパスウェイで完了するタスク用にハブを構成する
 
 『プロジェクト』タブ
  →プロジェクトを作成してインポートし、既存のプロジェクトを管理する

『学習』タブ
  →特定のスキルに関する注目の学習体験やチュートリアルがある

『コミュニティ』タブ
  →より広範なUnityコミュニティと関わり、繋がることができる様々な場所をリストしたクイックリファレンス

『インストール』タブ
  →Unityのバージョン管理

🔵Unityのバージョンを特定する

・Unityのバージョンリリースには2つの異なるタイプがある
 →長期サポート LTSリリース
 →Tech Stream リリース (アルファ版およびベータ版を含む)
 ※原則、Unityプロジェクトには最新のLTSバージョンを使用する必要あり

🔹以下のような状況では、別のバージョンを使用する必要がある場合がある
・Techストリームリリースでのみ利用可能な機能を使用する
・別のバージョンですでに進行中の共同プロジェクトに参加する

🔹リリース番号は、
 ・年とマイナーリリース番号(1、2、または3)で構成される
 ・Techストリームリリースは年に2つ(2021.1および2021.2)
 ・長期サポートリリースは1つ(2021.3 LTS)

※: 2018年と2019年には、3つのTechストリームリリースと1つのLTSリリースがあった
 ・アルファ(a)
 ・ベータ(b)
 ・最終リリースの候補(rc)
 ・最終リリース(f)

🔵モジュール
 →Unity バージョンのインストールに追加できる追加コンポーネント
 →通常、Unityでアプリケーションを構築できるAndroidやiOSなどの
  様々なプラットフォームのサポートが含まれる
 
🔵テンプレート
 →一般的なベストプラクティスに基づいて事前に選択された設定と機能セットを備えた、様々な形式の「スターター」Unityプロジェクト。

※一部のテンプレートには、Unityを初めてインストールしたときに遭遇した可能性のあるMicrogameテンプレートなど、サンプルプロジェクトとチュートリアルも含まれる。

🔵プリミティブ
 →プリミティブは、立方体や球などの基本的な3D形状のゲームオブジェクト
 →シーンに追加して、後でインポートするアセットの単純なオブジェクトやプレースホルダーを作成できる

🔵マテリアル
 →反射とか透明とかにできる色も変えれる
 →加工もできる
 →アニメ調、コミック調のシェーダーもある

🔵パン、ズーム、フライスルー
パン→カメラの視点を左右や上下に動かす操作
ズーム→カメラを前後に移動させてオブジェクトに近づいたり遠ざかったりする操作
フライスルー→実際の飛行のように3D空間を自由に移動する操作

🔵パッケージ

🔵2Dと3Dの違い

・空間の表現:
* 3D: 3Dゲームでは、x, y, zの3つの軸でオブジェクトの位置や動きを表現します。カメラも3D空間内で動かすことができます。
* 2D: 2Dゲームでは、主にxとyの2つの軸でゲームの世界を表現します。カメラも通常は平面上で動かします。

  •   アセットの形式:
    
    • 3D: 3Dモデル、テクスチャ、アニメーションなどの3D専用のアセットを使用します。
    • 2D: スプライトやタイルマップなど、2D専用のアセットを使用します。
  •   物理エンジン:
    
    • 3D: 3D空間での物理シミュレーション(重力、衝突、物体の動きなど)を行います。
    • 2D: 2D専用の物理エンジンを使って、平面上での物理シミュレーションを行います。
  •   カメラの設定:
    
    • 3D: 通常、パースペクティブ(透視投影)カメラを使用します。
    • 2D: オーソグラフィック(平行投影)カメラを使用します。
  •   ライティング:
    
    • 3D: 3D空間内でライトを配置して、シャドウやリフレクションなどの効果を再現します。
    • 2D: 一般的な2Dゲームではライティングはシンプルですが、Unity 2019.2以降では2D用のライティングシステムも強化されています。
  •   ツールと機能:
    
    • Unityには、2Dゲーム制作のための専用のツールと機能(スプライトエディタ、タイルマップエディタなど)が用意されています

🔵物理演算
 →Rigidbodyはゲームオブジェクトに物理演算を適用するコンポーネント
 🔹Collider
 →当たり判定をつけるコンポーネント
 Box Collider 箱状の当たり判定
 Sphere Collider 球状の当たり判定
 
 🅿️親子関係で子を別の物体としたい時は子にもRigidbodyをつければOK
 
 🔹物理的性質変化
  Physic Material
  →物体の物理特性を変更するもの
   Dynamic Friction 動いている状態の摩擦
   Static Friction 動いていない状態の摩擦
   Bounciness 弾性
   Friction Combine 物体間の摩擦処理の仕方
   Bounce Combine 物体間の弾性処理の仕方

🔵エディター「Visual Studio」
→Unityと連携できる

🔵C#について
・オブジェクト指向型のプログラミング言語
→設計図と実態

🔹StartメソッドとUPdateメソッド
  →あらかじめ用意された特別なメソッド
  Start
  →この設計図がゲーム内で実体化+有効の両方を満たすとき
   Unity側から1回だけ呼ばれる
  Update
  →有効な時にゲーム中毎フレームUnity側から呼ばれる
  ※メソッドを描く順番は実行順序に関係ない
  ※複数のスクリプトがある場合、同じタイミングで呼ばれるメソッドはどういう順で呼ばれるかわからない
🔵フレームとは?
 映像
 →パラパラフレーム

🔵フレームレートとは?
 →1秒間に何回画像を出力できるか
 FPS(frame per second)
 《例》60FPS > 1秒間に60回画像を出力
 なぜ60FPSや30FPSなどキリのいい数値になるのか?
 →ディスプレイの画面更新に合わせているから
 →画面更新の計算のタイミングでUpdateメソッドが呼ばれている
 →計算が間に合わない場合フレームレートが落ちる
 《例》60→30→20→15→0

🔹ゲームの移動は瞬間移動

※瞬間移動で気をつけること
 ❶すり抜ける
 →物理演算で事前に計算する設定がある
 ❷移動がガクガクする
 →瞬間移動とフレームレートの変動を考慮に入れないといけない
 
🔵変数
《例》 int a = 1;
変数の中の値は初めは省略できる

🔵基本的な型
Int型 整数
Float型 有効桁数7桁の浮動小数
Double型 有効桁数16桁の浮動小数
Char型 1文字
string型 文字列
Bool型 真か偽か
※Float型とDouble型とでは型の大きさが違う

🔵クラス型変数
→設計図の中に別の設計図の実態を動かす仕組みを作ることができる
《例》作ったスクリプトでオブジェクトを動かす
transform.position += Vector3.right;

Vector3型
X float型
Y float型
Z float型

名前空間 Unity Engineの中に、Transform, Collider, PhysicMaterial, Rigidbodyなどなどがある。

🅿️コンポーネントは全てクラス

類似する型なら変更できる

🔵キャスト
《例》Float a = (float)1 / (float)2; // 0.5
類似する型なら変換できる

🔵サフィックス
《例》float a = 1f / 2f; // 0.5
数値の最後に型の頭文字を書いて肩を表す。

※型指定せずに小数を使うとdouble型となる。
Float型に、double型は入らない
double型にfloat型は入る

🔵char型の注意点
Char型でダブルクォーテーションを使おうとすると、1文字ではないからエラーになる。
 →シングルクォーテーションを使う。

🔵メソッド作成

すごい

プログラミング

🔵Animation
→アニメーションファイルそのもの
 遷移図のオプション
 「Has Exit Time」
 →遷移に、アニメーションが終わったらという条件を追加
 「Transition Duration」
 →アニメーションの移行期間ブレンドしながら移行

🔵Animator
→Animator Controllerから前回作ったアニメーションを制御するもの

🔵Input.GetAxis()
→Unityの入力を受け取る機能、入力の方向軸を受け取る

🔹大きく2種類
 ・入力を直接見る判定
 《例》Spaceキーを押したら処理をする
 《例》左クリックをしたら処理をする
 ・InputManagerを介して入力判定
 《例》設定したボタン、キーを押した
 →一度設定を中継する方法
 →仕様変更やマルチプラットフォームに対応しやすくなる
 →プログラムを一切変更せずキー入力を変更できる

🔵Unityの移動方法
・移動方法は無限にある。

🔹移動は大きく分けると2種類
①Transform操作
 →位置情報を直接制御する方法(ただ移動するだけ)
※Transform操作は基本軽いが物理演算に関係すると逆に重くなる
②物理エンジン操作
 →物理演算に関係するオブジェクトの場合、移動後再計算が走る
 →物理演算で位置を計算
 →周囲を考慮した計算が入る
《例》マリオのようなゲームの場合
・当たり判定を利用したい
 ↑物理エンジン操作が必要
※物理法則は無視することが多い
 →空中でジャンプの軌道が変わる
 →動く床、2段ジャンプ、空ダ等

🔹Rigidbody2D.velocityで物体を操作する場合
→マリオのような2Dゲームに使用
→物理演算に従ったものには使わない方がいい
⭕️物理法則を無視する動き
❌物理法則に従った動きを苦手とする

🔹Kinematic
 →設定したゲームオブジェクトは物理的な影響を受けなくなる
 →周りに物理演算を適用するが、周りからは物理演算の
  影響を受けない
 →つまり
 <例>プレイヤーは床に押されるが、床はプレイヤーに押されない

🔵FixedUpdate
→物理演算の処理の前に毎回呼ばれる
 
 🔹現実時間とゲーム内時間
  現実時間に合わせた場合、一定時間で処理できるとは限らない
  
  物理的なシミュレーションがうまくいないケースが出てくる
  ↓別の時間の概念が必要
  現実時間でバラバラな処理でもゲーム内では
  一定間隔で処理できる

ゲーム内の時間と現実の時間がなるべく近くなるように計算される
 【FixedUpdateの呼ばれ方】
 ※フレームレートが高いと1フレーム内で呼ばれない場合が
  多くなる
 ※フレームレートが低いと1フレーム内で複数回
  呼ばれやすくなる
 ※Fixed Updateに重い処理を書くと重い時、
  重さがさらに加速する
 
 ボタン入力は1フレームで1回判定
  🔹FixedUpdateまとめ
  ・物理演算の前に毎回呼ばれる
  ・ゲーム内時間で一定間隔で呼ばれる
  ・1フレームの間に呼ばれなかったり、複数回呼ばれたりする
・物理演算の前にしたい処理をかこう
  ・可能なら重い処理は他へ逃がそう
  ・瞬間的な処理は相性が悪い

🔵AnimationCurve.Evaluate(時間)
 →アニメーションカーブから指定された時間の値を返す

🔵Attribute
 →クラスやメソッド、変数の前に[属性]を書くと特殊な挙動になる

🔵#region - #endregion
間に書かれたものを折りたたむ機能

🔵OnCollisionEnter2D
→Unity側が呼ぶ特別なメソッド
→物体が衝突した時に呼ばれる


🔵Attribute :HideInspector
→Inspectorにシリアライズ化されたものが表示されなくなる

🔵○○Renderer.isVisible
画面内に表示されているかどうか
※SceneViewも含む

🔵GameObject.Findメソッド
シーン上の全てのゲームオブジェクトを検索して名前が一致したものを取得
《例》GameObject.Find(“名前”);
※アクティブでないと取得できない

🔵Transform.Find
このインスタンスがついているゲームオブジェクトの子から名前を一致したオブジェクトのTransformを返す

《例》
Transform.Find(“名前”);
↑インスタンス(が入っている変数)
※非アクティブでも取得可能

🔵Destroy(オブジェククト, 時間)
→そのオブジェクトを削除する
※時間指定があれば待つ

🔵Cull Transparent Mesh
→UGUIが透明な時、その描画をスキップする

🔵ゲームマネージャーとは?
・ゲームの進行管理
・全体的なパラメータの管理
・全ての場所に存在する
・ただ一つしかない
⛓️storeとnavigation合わせたもの?

Unityの機能ではない
→自分で好きなように作っていく

※ゲームマネージャーは必須ではないが、あると便利
《例》2Dアクションの場合
・ステージの進行状況
・スコア管理
・セーブデータの取り扱い
 🔹GameManagerを全シーンに配置する理由とは?
  →めんどくさいから
   →タイトルシーンから始めると毎回タイトルシーンから
    出ないとGameManagerのインスタンスが表示されない
    →開発が楽になる
🔵static修飾子とは?
→変数やメソッド、クラスにつけると静的なものになる

staticをつけない場合、そのとき必要な分メモリに載せる

🔹Staticのメリットデメリット
メリット:メモリ効率がいい
     →メモリの確保が最初のみ、アクセスが容易
デメリット:生成のたびにメモリに載せる
      メモリのどこにあるかわからない
《例》GetComponentで捕まえる必要がある等
  →今までどこにあるかわからなかったから、捕まえていた

※staticは少しでも触るとメモリに載る
※ゲームマネージャーなど、ほとんどのシーンで使うなら、メモリを占有していても問題ない
♦️丁寧にするなら下のように記載した方がいい
《例》public static GManager Instance { get; private set;}

🔵Awakeメソッド
→Unity側が呼ぶ特別なメソッド
→インスタンス化直後に呼ばれる
→Startによく似たメソッド、Startより先に呼ばれる

🔵DontDestroyOnLoad
→シーンを移動しても指定したオブジェクトは破棄されない
《例》DontDestroyOnLoad(this.gameObject);

🔵シングルトン
→絶対に1つしか存在しないものを定義する手法

🔵プレハブ(Prefab)
→Unityプログラミングにおいて用いられる機能であり、コンポネントやマテリアルを紐づけ(アタッチ)したゲームオブジェクトをアセットとして扱い、記録することでコピーを複製できるようにしたもの、あるいはそれで生成したコピーのことを指す
⛓️Component的なやつかな?

🔵EventSystem
→UnityのUIシステムであるUGUIにおいて、各種のイベントクリック、ドラッグ、キーボード入力などを管理するコンポーネント
→具体的には、ユーザーの入力を適切なUI要素に伝える役割を担っている
🔹主な機能と特徴
①入力の管理
→EventSystemはマウスクリックやタッチイベントなどの入力を検知し、適切なUI要素に伝える役割を持っている
②Reycasting
→UI上の要素をクリックするとき、EventSystemはRayを放射してクリックされたUI要素を検出する
 →これを行うためのコンポーネントとして、Graphics RaycasterやPhysics Raycasterが使用される
③Selectable UI要素のナビゲーション
→キーボードやゲームパッドを使用してUI要素感を移動する機能もEventSystemによって提供される
 →これにはボタンやドロップダウンなどのSelectableコンポーネントが関連する
④InputModule
 →EventSystemにはさまざまな入力モジュールが含まれており、これによって異なる入力タイプを処理する
 →もっとも一般的なのはStandalone Input ModuleでPCやコンソールの入力を処理する
🔹UIのイベントが発火しないなどの問題が発生した際には、まずEventSystemの存在や設定を確認することが重要

🔵UnityAssetStoreとは
→ゲーム作りに使える素材や便利な機能などを購入できるお店

⚠️注意点
①ライセンスに注意しよう
 →独自ライセンスを作ったライセンスには注意
《例》個人はOKだが法人はNG
《例》商用利用NG
UnityAssetStoreのライセンスは、
個人も法人も商用利用も可

2020年の改訂後独自ライセンスがなくなった

サイトライセンス
シートベースライセンス
などある

🔹Unityのライセンス
 ①アセットを取り出せない形での公開、配布、販売
 ②商用・非商用利用可能
 ③アセットの改変
 基本1人1シート

🔹エラーになるケース
・対応するUnityのバージョン確認
・プラグインファイルがあるか確認する
 →バージョンが違いがあるかどうか確認する
 →プラグイン
・Editorファルダが複数あると注意
 →動いても思い場合がある
・初期設定がある
・Read meを見る

・空のゲームディレクトリを使ってみる

・アセットがピンク色になる
 →Unityのバージョンが対象でない
 →Assetの場所が変わっている

🔵Audio
🔹AudioSource.PlayOneShot
→指定した音を1回鳴らす
→すでになっている音に重複する

🔵Vector2.Distance
→2つの地点の距離を返す

🔵Vector2.MoveTowards
→A地点からB地点へのベクトル上の座標を返すメソッド

🔵Rigidbody2D.MovePosition
→物体を指定した位置へ移動する

🔹Canvasの設定をWorld Spaceにすると、
 UGUIをワールド空間に表示する

🔹Canvas Group
アタッチされているUGUIの子をまとめて操作できる

👀GitだとGitCloneだけど、どのように環境構築して確認するのか(そもそもどうやってCloneするのか)
👀

🔹Canvas Renderer > Cull Transparent Mesh
→透明なものを描画しない
 →これにチェックを透明なものでも描画され、重くなる

Discussion