22.4K Views
March 17, 23
スライド概要
本スライドは2023年3月4日(土)に開催したゲーム開発者向けのリアルイベント『ゲームメーカーズ スクランブル』で行われた講演のスライドとなります。
タイトル:
ゲームエンジンからステップアップ!”オブジェクト指向”早わかりガイド
内容:
ゲームエンジンを使っていると、何となく書けるプログラム。その「何となく」を「理解できる」状態にすると、ゲーム作りはもっと良くなります!
そこで今回は、現代プログラミングの基本的な考え方、「オブジェクト指向」を解説します。今皆さんが書いているプログラムが「どんな要素からできているのか」「なぜそう書くのか」…基本的なことがわかる時間になればと思います!!
登壇者:
株式会社アカツキゲームス
クライアントエンジニア
田﨑 大也 氏
講演動画も公開中!
https://youtu.be/DmUpScqijp4
【アーカイブ記事】https://gamemakers.jp/article/2023_03_20_34370/
【イベントページ】https://gamemakers.jp/scramble2023/
【イベントレポート記事】https://gamemakers.jp/article/2023_03_08_33390/
ゲームづくりに役立つ情報をお届けする「ゲームメーカーズ」の資料公開用アカウント。 WEBメディア「ゲームメーカーズ」では、ゲーム開発TIPSや”作り手目線”のインタビュー、お得なセール情報などを毎日更新! http://gamemakers.jp
ゲームエンジンからステップアップ! "オブジェクト指向"早わかりガイド 株式会社アカツキゲームス クライアントエンジニア 田﨑 大也 ゲームメーカーズスクランブル 2023/03/04
田﨑 大也 / Tasaki Daiya 株式会社アカツキゲームス クライアントエンジニア ● 2021年 :株式会社アカツキ入社 ● 現在 :運用中のモバイルゲームを開発 学生時代 ● 東京大学 ~ 大学院 :VR研究 ● DMM VR Lab :VRゲーム開発 2
株式会社アカツキゲームス © Akatsuki Inc. © Akatsuki Games Inc. 3
Introduction 4
5
6
オブジェクト指向 7
今日のお話 プログラミングにおける重要な概念である 「オブジェクト指向」を知ろう! 8
Why? ゲームエンジンも、辿っていくと...... - Unity → C# → オブジェクト指向言語 (OOP) - Unreal Engine → C++ → オブジェクト指向言語 (OOP) 9
自分が使っている「道具」について理解する 10
プログラムを書く人へ - ゲームエンジンからゲーム作りを始めると プログラムは「何となく」書けると思います - そこから更に「プログラムを理解できる」ようになると、 もっとゲーム作りがうまくなるはず!!です!! 11
プログラムを書かない人でも... - ゲームはどうやって出来ているのか? - プログラマは何を考えているのか? - プログラムが書けるようになったら...!? 12
オブジェクト指向は、ハッキリ言って難しい - 概念が難しい - プログラミング技術である - 意見もさまざま 13
ゴール:ステップアップのきっかけ - プログラムのことを深く考え、 今日の話をご自身のステップアップの、 きっかけにしてください!! - 興味、自信、理解、発見 …… 受け取り方は自由です!! 14
本日の流れ - オブジェクト指向とは何か? (5min) - 基本要素 (30min) 1. 抽象化 / クラス (5min) 2. カプセル化 (5min) 3. 継承 (10min) 4. ポリモーフィズム (10min) - +α、Q&A 15
基本的には これを読めばOK 16
参考文献 17
オブジェクト指向とは何か? 18
オブジェクト指向は、プログラミングの考え方 今回採用する定義 - ソフトウェア開発を楽にするために発展してきた考え方 19
オブジェクト指向は、プログラミングの考え方 今回採用する定義 - ソフトウェア開発を楽にするために発展してきた考え方 その他の意見 - 現実世界のモデル化方法 - hoge.method() という書き方ができること 20
プログラミング言語の歴史 - 機械語 - アセンブリ言語 - 高級言語 - 構造化言語 - オブジェクト指向言語 21
プログラミング言語の歴史 - 機械語 - アセンブリ言語 - 高級言語 - 構造化言語 - オブジェクト指向言語 22
プログラミング言語の歴史 - 機械語 - アセンブリ言語 - 高級言語 - 構造化言語 MOV AX X MOV DX Y - オブジェクト指向言語 23
プログラミング言語の歴史 - 機械語 - アセンブリ言語 - 高級言語 Z=X+Y - 構造化言語 - オブジェクト指向言語 24
プログラミング言語の歴史 - 機械語 - アセンブリ言語 - 高級言語 - 構造化言語 - オブジェクト指向言語 25
プログラミング言語の歴史 - 機械語 - アセンブリ言語 - 高級言語 - 構造化言語 - オブジェクト指向言語 26
構造化言語の課題 - グローバル変数 - 再利用性 27
なんでグローバル変数がよくないの? - グローバル変数 - 再利用性 - プログラム中、どこからでも参照できる変数 - グローバル変数を変更しようとすると、 それを使っている全てのロジックに影響が及ぶ 28
なんで再利用性が大事なの? - グローバル変数 - 再利用性 - アプリケーションがどんどん大きくなってきた - 再利用できないと、コードがどんどん膨れ上がる 29
オブジェクト指向の基本要素 - 抽象化 (クラス) - カプセル化 - 継承 - ポリモーフィズム 30
オブジェクト指向の基本要素 31
オブジェクト指向の基本要素 その1 Q1. 抽象化(クラス)とは? 抽象化 (クラス) 5 min Q2. クラスはどう使う? 32
ゲームエンジン中のクラス (Unity) MonoBehavior Transform Rigidbody 33
C#スクリプトにも書いてある 34
抽象化 (クラス) - 関連する変数と処理を「まとめた」もの 35
クラスの用語 - クラスが持つ 変数 := メンバ変数 := フィールド := プロパティ - クラスが持つ 処理 := メンバ関数 := メソッド 36
クラスの使い方 1. クラスを元に、実体(インスタンス / オブジェクト)が生成される var enemy = new Enemy(); 2. インスタンスに対して、操作を行う var hp = enemy.GetHitPoint(); 37
比喩:クラスは設計図 インスタンス1 インスタンス2 クラス インスタンス3 38
オブジェクト指向の基本要素 その1 Q1. 抽象化(クラス)とは? 関連する変数と処理を、まとめたもの 抽象化 (クラス) Q2. クラスはどう使う? まとめ 1. クラスを元に、実体が生成される 2. インスタンスに対して、操作を行う 39
オブジェクト指向の基本要素 その2 Q1. カプセル化とは? カプセル化 5 min Q2. private / public って何? Q3. カプセル化する利点は? 40
抽象化 (クラス) [再掲] - 関連する変数と処理が「まとめられた」もの 41
抽象化 (クラス) - 関連する変数と処理が「まとめられた」もの - 変更されるものを「カプセル化」できる 42
カプセル化とは? - クラスの外から、メンバ変数やメソッドを「隠す」こと 43
カプセル化を実現する仕組み - アクセス指定子: private / public 外部から アクセスできない enemy.hitPoint; 外部から アクセスできる enemy.DealDamage() ; 44
publicでよくない? 45
カプセル化する利点 - クラス内部の変更がしやすくなる 例:public メンバの名前を変えたくなった場合 46
カプセル化する利点 - クラス内部の変更がしやすくなる 例:public メンバの名前を変えたくなった場合 書き換えないといけないコードが たくさんになってしまう! 47
おまけ:public より [SerializeField] public int hitPoint; [SerializeField] private int hitPoint; 48
オブジェクト指向の基本要素 その2 Q1. カプセル化とは? クラスの外から、 メンバ変数やメソッドを隠すこと カプセル化 Q2. private / public って何? private : クラス外からアクセス不可 まとめ public : クラス外からアクセス可能 Q3. カプセル化する利点は? クラス内部の変更がしやすくなること 49
なんとここまでで...!! 構造化プログラミングの課題が解決されてきた! - プログラムを少なくできる - グローバル変数がなくせる 50
オブジェクト指向の基本要素 その3 Q1. 継承とは? 継承 10min Q2. スーパークラス / サブクラス? Q3. 継承で何ができる? 51
継承とは? - クラスの共通部分を別のクラスにまとめる仕組み - あるクラスを拡張する仕組み - is - a 関係を提供する仕組み 52
プログラム中の継承 NewBahaviorScipt は、 MonoBehaviour を継承する 53
継承の用語 継承される側 (MonoBehaviour) := スーパークラス := 親クラス 継承する側 (NewBahaviorScipt) := サブクラス := 子クラス 54
継承が表すこと - Aのメンバ変数を、Bも持てる - Aのメソッドを、Bも持てる - Bは、Aクラスでもある 55
継承が表すこと - Aのメンバ変数を、Bも持てる - Aのメソッドを、Bも持てる - Bは、Aクラスでもある 56
継承が表すこと - Aのメンバ変数を、Bも持てる - Aのメソッドを、Bも持てる - Bは、Aクラスでもある 57
継承が表すこと - Aで public := Bも持てる / Bから外部に公開される - Aで protected := Bも持てる / Bから外部には公開されない - Aで private := Bでは持てない / Bから外部に公開される 58
継承が表すこと - Aのメンバ変数を、Bも持てる - Aのメソッドを、Bも持てる - Bは、Aクラスでもある 59
ゲームエンジンの中の継承 - MonoBehaviour (Unity) ってなんだろう? 60
MonoBahaviorの公式リファレンス - https://docs.unity3d.com/ja/2021.1/ScriptReference/MonoBehaviour.html 61
MonoBehaviorを継承しなくていいの...? - MonoBehaviourの機能を使う必要がないなら... YES!! 62
MonoBehaviorを継承しなくていいの...? - MonoBehaviourの機能を使う必要がないなら... YES!! 設計的には... MonoBehaviorに依存しすぎず、Good 63
継承が表すこと - Aのメンバ変数を、Bも持てる - Aのメソッドを、Bも持てる - Bは、Aクラスでもある 64
継承が表すこと - Aのメンバ変数を、Bも持てる - Aのメソッドを、Bも持てる - Bは、Aクラスでもある 次の基本要素:ポリモーフィズムでお話します! 65
オブジェクト指向の基本要素 その3 継承 まとめ Q1. 継承とは? - クラスの共通部分をまとめる仕組み - あるクラスを拡張する仕組み - is - a 関係を提供する仕組み Q2. スーパークラス / サブクラス? - スーパークラス : 継承される側のクラス / 親 - サブクラス : 継承する側のクラス / 子 Q3. 継承で何ができる? - 親のメンバ変数を、子も持てる - 親のメソッドを、子も持てる - 子は、親クラスでもある 66
オブジェクト指向の基本要素 その4 Q1. ポリモーフィズムとは? ポリモーフィズム 10min Q2. オーバーライド? Q3. ポリモーフィズムの利点は? 67
ポリモーフィズムとは? - 実行時のオブジェクトによって、 呼び出されるメソッドが変わる仕組み - 呼び出す側のメソッドを共通化する仕組み 68
ポリモーフィズムとは? - 実行時のオブジェクトによって、 呼び出されるメソッドが変わる仕組み - 呼び出す側のメソッドを共通化する仕組み 69
継承が表すこと [再掲] - Aのメンバ変数を、Bも持てる - Aのメソッドを、Bも持てる - Bは、Aクラスでもある 70
is - a の関係 71
オーバーライド - サブクラスで、スーパークラスと 同じ名前のメソッドの定義を 上書きできる仕組み 72
is-a + overrideで実現されるポリモーフィズム 73
ポリモーフィズムの利点 - 拡張性が維持される! ▼ 拡張性が維持されない書き方 74
ポリモーフィズムの利点 - 拡張性が維持される! ▼ 拡張性が維持されない書き方 Magic 足して 75
ポリモーフィズムの利点 - 拡張性が維持される! ▼ 拡張性が維持されない書き方 Magic 足して 76
ポリモーフィズムの利点 - 拡張性が維持される! ▼ 拡張性が維持されない書き方 YY 足して ZZ 足して Magic 足して XYZ 足して XX 足して 77
ポリモーフィズムの利点 - 拡張性が維持される! ▼ 拡張性が維持されない書き方 呼び出す側 / 使う側を変更すると... 拡張しづらい! 78
ポリモーフィズムの利点 - 拡張性が維持される! ▼ 拡張性が維持される書き方 79
ポリモーフィズムの利点 - 拡張性が維持される! ▼ 拡張性が維持される書き方 Magic 足して 80
ポリモーフィズムの利点 - 拡張性が維持される! ▼ 拡張性が維持される書き方 Magic 足して 81
ポリモーフィズムの利点 - 拡張性が維持される! ▼ 拡張性が維持される書き方 追加されるクラスだけ考えれば... 拡張しやすい! 82
オブジェクト指向の基本要素 その4 Q1. ポリモーフィズムとは? - 実行時のオブジェクトによって、 呼び出されるメソッドが変わる仕組み - ポリモーフィズム 呼び出す側のメソッドを共通化する仕組み Q2. オーバーライド? - サブクラスで、スーパークラスと 同じ名前のメソッドの定義を 上書きできる仕組み まとめ Q3. ポリモーフィズムの利点は? - 拡張性が維持される! - 追加するクラスだけ考えればいい 83
84
注意 - オブジェクト指向さえ理解すれば、うまくいくというわけではない 85
メッセージ - 今日だけでは理解できなかったと思います - 何度も触れて、考えて、気づきを得て、理解できてきます - サイクルを積み重ねて、成長へつなげてください! 86
+α 87
今日の話から、さらにステップアップ! - 継承より委譲 - コンポーネント指向 - interface / abstract class - 関数型言語 - ソフトウェア原則 - デザインパターン - アジャイル開発 88
本日のまとめ オブジェクト指向は、ソフトウェア開発を楽にするために生まれた プログラミングの考え方 オブジェクト指向の基本要素は 抽象化(クラス) / カプセル化 / 継承 / ポリモーフィズム 構造化プログラミングのグローバル変数と再利用性の問題が解決した さらに、拡張性が維持されるようになった 89