ゲームエンジンからステップアップ!”オブジェクト指向”早わかりガイド

15.1K 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/

profile-image

ゲームづくりに役立つ情報をお届けする「ゲームメーカーズ」の資料公開用アカウント。 WEBメディア「ゲームメーカーズ」では、ゲーム開発TIPSや”作り手目線”のインタビュー、お得なセール情報などを毎日更新! http://gamemakers.jp

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

ゲームエンジンからステップアップ! "オブジェクト指向"早わかりガイド 株式会社アカツキゲームス クライアントエンジニア 田﨑 大也 ゲームメーカーズスクランブル 2023/03/04

2.

田﨑 大也 / Tasaki Daiya 株式会社アカツキゲームス クライアントエンジニア ● 2021年 :株式会社アカツキ入社 ● 現在 :運用中のモバイルゲームを開発 学生時代 ● 東京大学 ~ 大学院 :VR研究 ● DMM VR Lab :VRゲーム開発 2

3.

株式会社アカツキゲームス © Akatsuki Inc. © Akatsuki Games Inc. 3

4.

Introduction 4

7.

オブジェクト指向 7

8.

今日のお話 プログラミングにおける重要な概念である 「オブジェクト指向」を知ろう! 8

9.

Why? ゲームエンジンも、辿っていくと...... - Unity → C# → オブジェクト指向言語 (OOP) - Unreal Engine → C++ → オブジェクト指向言語 (OOP) 9

10.

自分が使っている「道具」について理解する 10

11.

プログラムを書く人へ - ゲームエンジンからゲーム作りを始めると プログラムは「何となく」書けると思います - そこから更に「プログラムを理解できる」ようになると、 もっとゲーム作りがうまくなるはず!!です!! 11

12.

プログラムを書かない人でも... - ゲームはどうやって出来ているのか? - プログラマは何を考えているのか? - プログラムが書けるようになったら...!? 12

13.

オブジェクト指向は、ハッキリ言って難しい - 概念が難しい - プログラミング技術である - 意見もさまざま 13

14.

ゴール:ステップアップのきっかけ - プログラムのことを深く考え、 今日の話をご自身のステップアップの、 きっかけにしてください!! - 興味、自信、理解、発見 …… 受け取り方は自由です!! 14

15.

本日の流れ - オブジェクト指向とは何か? (5min) - 基本要素 (30min) 1. 抽象化 / クラス (5min) 2. カプセル化 (5min) 3. 継承 (10min) 4. ポリモーフィズム (10min) - +α、Q&A 15

16.

基本的には これを読めばOK 16

17.

参考文献 17

18.

オブジェクト指向とは何か? 18

19.

オブジェクト指向は、プログラミングの考え方 今回採用する定義 - ソフトウェア開発を楽にするために発展してきた考え方 19

20.

オブジェクト指向は、プログラミングの考え方 今回採用する定義 - ソフトウェア開発を楽にするために発展してきた考え方 その他の意見 - 現実世界のモデル化方法 - hoge.method() という書き方ができること 20

21.

プログラミング言語の歴史 - 機械語 - アセンブリ言語 - 高級言語 - 構造化言語 - オブジェクト指向言語 21

22.

プログラミング言語の歴史 - 機械語 - アセンブリ言語 - 高級言語 - 構造化言語 - オブジェクト指向言語 22

23.

プログラミング言語の歴史 - 機械語 - アセンブリ言語 - 高級言語 - 構造化言語 MOV AX X MOV DX Y - オブジェクト指向言語 23

24.

プログラミング言語の歴史 - 機械語 - アセンブリ言語 - 高級言語 Z=X+Y - 構造化言語 - オブジェクト指向言語 24

25.

プログラミング言語の歴史 - 機械語 - アセンブリ言語 - 高級言語 - 構造化言語 - オブジェクト指向言語 25

26.

プログラミング言語の歴史 - 機械語 - アセンブリ言語 - 高級言語 - 構造化言語 - オブジェクト指向言語 26

27.

構造化言語の課題 - グローバル変数 - 再利用性 27

28.

なんでグローバル変数がよくないの? - グローバル変数 - 再利用性 - プログラム中、どこからでも参照できる変数 - グローバル変数を変更しようとすると、 それを使っている全てのロジックに影響が及ぶ 28

29.

なんで再利用性が大事なの? - グローバル変数 - 再利用性 - アプリケーションがどんどん大きくなってきた - 再利用できないと、コードがどんどん膨れ上がる 29

30.

オブジェクト指向の基本要素 - 抽象化 (クラス) - カプセル化 - 継承 - ポリモーフィズム 30

31.

オブジェクト指向の基本要素 31

32.

オブジェクト指向の基本要素 その1 Q1. 抽象化(クラス)とは? 抽象化 (クラス) 5 min Q2. クラスはどう使う? 32

33.

ゲームエンジン中のクラス (Unity) MonoBehavior Transform Rigidbody 33

34.

C#スクリプトにも書いてある 34

35.

抽象化 (クラス) - 関連する変数と処理を「まとめた」もの 35

36.

クラスの用語 - クラスが持つ 変数 := メンバ変数 := フィールド := プロパティ - クラスが持つ 処理 := メンバ関数 := メソッド 36

37.

クラスの使い方 1. クラスを元に、実体(インスタンス / オブジェクト)が生成される var enemy = new Enemy(); 2. インスタンスに対して、操作を行う var hp = enemy.GetHitPoint(); 37

38.

比喩:クラスは設計図 インスタンス1 インスタンス2 クラス インスタンス3 38

39.

オブジェクト指向の基本要素 その1 Q1. 抽象化(クラス)とは? 関連する変数と処理を、まとめたもの 抽象化 (クラス) Q2. クラスはどう使う? まとめ 1. クラスを元に、実体が生成される 2. インスタンスに対して、操作を行う 39

40.

オブジェクト指向の基本要素 その2 Q1. カプセル化とは? カプセル化 5 min Q2. private / public って何? Q3. カプセル化する利点は? 40

41.

抽象化 (クラス) [再掲] - 関連する変数と処理が「まとめられた」もの 41

42.

抽象化 (クラス) - 関連する変数と処理が「まとめられた」もの - 変更されるものを「カプセル化」できる 42

43.

カプセル化とは? - クラスの外から、メンバ変数やメソッドを「隠す」こと 43

44.

カプセル化を実現する仕組み - アクセス指定子: private / public 外部から アクセスできない enemy.hitPoint; 外部から アクセスできる enemy.DealDamage() ; 44

45.

publicでよくない? 45

46.

カプセル化する利点 - クラス内部の変更がしやすくなる 例:public メンバの名前を変えたくなった場合 46

47.

カプセル化する利点 - クラス内部の変更がしやすくなる 例:public メンバの名前を変えたくなった場合 書き換えないといけないコードが たくさんになってしまう! 47

48.

おまけ:public より [SerializeField] public int hitPoint; [SerializeField] private int hitPoint; 48

49.

オブジェクト指向の基本要素 その2 Q1. カプセル化とは? クラスの外から、 メンバ変数やメソッドを隠すこと カプセル化 Q2. private / public って何? private : クラス外からアクセス不可 まとめ public : クラス外からアクセス可能 Q3. カプセル化する利点は? クラス内部の変更がしやすくなること 49

50.

なんとここまでで...!! 構造化プログラミングの課題が解決されてきた! - プログラムを少なくできる - グローバル変数がなくせる 50

51.

オブジェクト指向の基本要素 その3 Q1. 継承とは? 継承 10min Q2. スーパークラス / サブクラス? Q3. 継承で何ができる? 51

52.

継承とは? - クラスの共通部分を別のクラスにまとめる仕組み - あるクラスを拡張する仕組み - is - a 関係を提供する仕組み 52

53.

プログラム中の継承 NewBahaviorScipt は、 MonoBehaviour を継承する 53

54.

継承の用語 継承される側 (MonoBehaviour) := スーパークラス := 親クラス 継承する側 (NewBahaviorScipt) := サブクラス := 子クラス 54

55.

継承が表すこと - Aのメンバ変数を、Bも持てる - Aのメソッドを、Bも持てる - Bは、Aクラスでもある 55

56.

継承が表すこと - Aのメンバ変数を、Bも持てる - Aのメソッドを、Bも持てる - Bは、Aクラスでもある 56

57.

継承が表すこと - Aのメンバ変数を、Bも持てる - Aのメソッドを、Bも持てる - Bは、Aクラスでもある 57

58.

継承が表すこと - Aで public := Bも持てる / Bから外部に公開される - Aで protected := Bも持てる / Bから外部には公開されない - Aで private := Bでは持てない / Bから外部に公開される 58

59.

継承が表すこと - Aのメンバ変数を、Bも持てる - Aのメソッドを、Bも持てる - Bは、Aクラスでもある 59

60.

ゲームエンジンの中の継承 - MonoBehaviour (Unity) ってなんだろう? 60

61.

MonoBahaviorの公式リファレンス - https://docs.unity3d.com/ja/2021.1/ScriptReference/MonoBehaviour.html 61

62.

MonoBehaviorを継承しなくていいの...? - MonoBehaviourの機能を使う必要がないなら... YES!! 62

63.

MonoBehaviorを継承しなくていいの...? - MonoBehaviourの機能を使う必要がないなら... YES!! 設計的には... MonoBehaviorに依存しすぎず、Good 63

64.

継承が表すこと - Aのメンバ変数を、Bも持てる - Aのメソッドを、Bも持てる - Bは、Aクラスでもある 64

65.

継承が表すこと - Aのメンバ変数を、Bも持てる - Aのメソッドを、Bも持てる - Bは、Aクラスでもある 次の基本要素:ポリモーフィズムでお話します! 65

66.

オブジェクト指向の基本要素 その3 継承 まとめ Q1. 継承とは? - クラスの共通部分をまとめる仕組み - あるクラスを拡張する仕組み - is - a 関係を提供する仕組み Q2. スーパークラス / サブクラス? - スーパークラス : 継承される側のクラス / 親 - サブクラス : 継承する側のクラス / 子 Q3. 継承で何ができる? - 親のメンバ変数を、子も持てる - 親のメソッドを、子も持てる - 子は、親クラスでもある 66

67.

オブジェクト指向の基本要素 その4 Q1. ポリモーフィズムとは? ポリモーフィズム 10min Q2. オーバーライド? Q3. ポリモーフィズムの利点は? 67

68.

ポリモーフィズムとは? - 実行時のオブジェクトによって、 呼び出されるメソッドが変わる仕組み - 呼び出す側のメソッドを共通化する仕組み 68

69.

ポリモーフィズムとは? - 実行時のオブジェクトによって、 呼び出されるメソッドが変わる仕組み - 呼び出す側のメソッドを共通化する仕組み 69

70.

継承が表すこと [再掲] - Aのメンバ変数を、Bも持てる - Aのメソッドを、Bも持てる - Bは、Aクラスでもある 70

71.

is - a の関係 71

72.

オーバーライド - サブクラスで、スーパークラスと 同じ名前のメソッドの定義を 上書きできる仕組み 72

73.

is-a + overrideで実現されるポリモーフィズム 73

74.

ポリモーフィズムの利点 - 拡張性が維持される! ▼ 拡張性が維持されない書き方 74

75.

ポリモーフィズムの利点 - 拡張性が維持される! ▼ 拡張性が維持されない書き方 Magic 足して 75

76.

ポリモーフィズムの利点 - 拡張性が維持される! ▼ 拡張性が維持されない書き方 Magic 足して 76

77.

ポリモーフィズムの利点 - 拡張性が維持される! ▼ 拡張性が維持されない書き方 YY 足して ZZ 足して Magic 足して XYZ 足して XX 足して 77

78.

ポリモーフィズムの利点 - 拡張性が維持される! ▼ 拡張性が維持されない書き方 呼び出す側 / 使う側を変更すると... 拡張しづらい! 78

79.

ポリモーフィズムの利点 - 拡張性が維持される! ▼ 拡張性が維持される書き方 79

80.

ポリモーフィズムの利点 - 拡張性が維持される! ▼ 拡張性が維持される書き方 Magic 足して 80

81.

ポリモーフィズムの利点 - 拡張性が維持される! ▼ 拡張性が維持される書き方 Magic 足して 81

82.

ポリモーフィズムの利点 - 拡張性が維持される! ▼ 拡張性が維持される書き方 追加されるクラスだけ考えれば... 拡張しやすい! 82

83.

オブジェクト指向の基本要素 その4 Q1. ポリモーフィズムとは? - 実行時のオブジェクトによって、 呼び出されるメソッドが変わる仕組み - ポリモーフィズム 呼び出す側のメソッドを共通化する仕組み Q2. オーバーライド? - サブクラスで、スーパークラスと 同じ名前のメソッドの定義を 上書きできる仕組み まとめ Q3. ポリモーフィズムの利点は? - 拡張性が維持される! - 追加するクラスだけ考えればいい 83

85.

注意 - オブジェクト指向さえ理解すれば、うまくいくというわけではない 85

86.

メッセージ - 今日だけでは理解できなかったと思います - 何度も触れて、考えて、気づきを得て、理解できてきます - サイクルを積み重ねて、成長へつなげてください! 86

87.

+α 87

88.

今日の話から、さらにステップアップ! - 継承より委譲 - コンポーネント指向 - interface / abstract class - 関数型言語 - ソフトウェア原則 - デザインパターン - アジャイル開発 88

89.

本日のまとめ オブジェクト指向は、ソフトウェア開発を楽にするために生まれた プログラミングの考え方 オブジェクト指向の基本要素は 抽象化(クラス) / カプセル化 / 継承 / ポリモーフィズム 構造化プログラミングのグローバル変数と再利用性の問題が解決した さらに、拡張性が維持されるようになった 89