Mais conteúdo relacionado Semelhante a Unityで Photonを使ってリアルタイム・マルチプレイヤーゲームを作っちゃおう【応用編】 (20) Mais de GMO GlobalSign Holdings K.K. (19) Unityで Photonを使ってリアルタイム・マルチプレイヤーゲームを作っちゃおう【応用編】2. 本日のお題
• Unityの準備
• Assetのインポート
• Photon Cloudとの接続
設定
• カメラとネットワークの
設定
• 床とライトの設定
• 弾丸の実装
• モンスターの設定
• 壁の設定
• 衝突判定の実装
• まとめ
2
11. Assetのインポート
インポート
• Importing package画面
で、全てのアイテムに
チェックが付いている事
を確認
• 画面右下の[Import] を
クリックします
11
12. Assetのインポート
Aseetの内容: リファレンス
• リファレンス(英文)を同梱
しています
• Assets >
Photon Unity Networking >
PhotonNetwork-
Documentation.pdf
• 日本語訳文はユーザー助
け合い所で公開しています
• photoncloud.jpのサイトでも
公開しました
12
15. Photon Realtimeとの接続設定
接続フロー
• 最初はマスターサーバーへ
接続
– いわゆるロビーサーバー
• 機能
– ロビー機能
– ルーム作成
– マッチメイキング
– 収容ゲームサーバー決定
• (ロードバランサー)
15
Photon
Realtime
Master Server
Client
Photon
Realtime
Game Server
Photon
Realtime
Game Server
Photon
Realtime
Game Server
16. Photon Realtimeとの接続設定
接続フロー
• ロビーサーバーから割当ら
れたゲームサーバーへ接
続
• 機能
– ルーム管理
– オブジェクト同期
– イベント同期
– メッセージ送受信
16
Photon
Realtime
Master Server
Client
Photon
Realtime
Game Server
Photon
Realtime
Game Server
Photon
Realtime
Game Server
17. Photon Realtimeとの接続設定
PUN Wizardを開く
• ‘Photon Unity
Networking’のウィンド
ウを開く
(PUN Wizard)
• Assetのインポート時に
開いたものがそのまま
であれば、それでOKで
す
17
19. Photon Realtimeとの接続設定
PUNの初期設定
• ブラウザで開いたペー
ジにあるApp ID
9e85…
を’Your AppId’のところ
に張付け
• Cloud Regionに’Japan’
を選択
• Saveボタンを押して、確
認ダイアログが出たら
OK。PUN Wizardを閉じ
てください
19
22. カメラとネットワークの設定
カメラの設定
• ‘Hierarchy’内の
‘Main Camera’
を選択
• ‘Inspector’内の
’Transform’
の値を変更
– Position X:0 Y:10 Z:-10
Rotation: X:20 Y:0 Z:0
Scale: X:1 Y:1 Z:1
22
25. カメラとネットワークの設定
ネットワーク機能(ルーム入室)実装
• ランダムマッチメイキング
のスクリプトを組込みま
す
• ‘Inspector’の下部の[Add
Component]ボタンをク
リックし、検索用の入力
窓に
‘Random’
と入力し、検索候補から
‘Random Matchmaker’を
選択して先ほど作った
‘Scripts’にアタッチ
25
27. カメラとネットワークの設定
シーンの保存
• シーンに名前をつけて
保存
File > Save Scene as…
• さきほどの
‘PhotonWorkShop’
フォルダの中に
’GameMain’
の名前で保存
27
28. カメラとネットワークの設定
テストラン
• ここまでのシーンをPlayし
てみましょう
• すると、キモい何かが
Instantiateされて、一瞬で
落下して行きます
• 床を作っていないのでこ
れで正常な動作です
• 確認できたらPlayボタンを
再度クリックしてPlayを解
除しましょう
28
30. 床とライトの設定
床の作成
• ‘Plane’を使って床を作
成
GameObject
> Create Other
> Plane
• ’Hierarchy’の中に
‘Plane’が追加されます
30
31. 床とライトの設定
床の設定
• ‘Inspector’内の
’Transform’
の値を変更
– Position X:0 Y:0 Z:0
Rotation: X:0 Y:0 Z:0
Scale: X:10 Y:1 Z:10
31
32. 床とライトの設定
テクスチャの貼り込み
• ‘Project’の検索窓に
‘Pavement_01’
と入力
• 検索結果に表示された
‘Pavement_01’
のうち左または上のも
のを先ほどの‘Plane’に
ドラッグ&ドロップでア
タッチ
32
33. 床とライトの設定
ライトの作成
• Directional Lightを使用
GameObject
> Create Other
> Directional Light
• ‘Hierarchy’の中に
‘Directional light’
が追加されます
33
34. 床とライトの設定
ライトの設定
• ‘Inspector’内の
’Transform’
の値を変更
– Position X:0 Y:10 Z:0
Rotation: X:50 Y:-30 Z:0
Scale: X:1 Y:1 Z:1
34
36. 弾丸の実装
弾丸モデルの作成
• Sphereを使用
GameObject
> Create Other
> Sphere
• ‘Hierarchy’の中に
‘Sphere’が追加されま
す
• ‘Sphere’の名前を
‘Bullet’
に変更
36
37. 弾丸の実装
弾丸モデルの設定
• ‘Inspector’内の
’Transform’
の値を変更
– Position X:0 Y:0 Z:0
Rotation: X:0 Y:0 Z:0
Scale: X:0.2 Y:0.2 Z:0.2
37
38. 弾丸の実装
Prefab化
• ‘Hierarchy’内の
‘Bullet’
を’Project’内の下記フォ
ルダにドラッグ&ドロップ
してPrefab化
Demos
> MarcoPolo-Tutorial
> Monstergame
> Resources
• ‘Hierarchy’内の
‘Bullet’
の文字が青くなればOK
38
40. 弾丸の実装
Rigidbody追加
• ‘Bullet’ prefabを選択
Demos
> MarcoPolo-Tutorial
> Monstergame
> Resources
• ‘Inspector’下部の
[Add Component]
ボタンをクリック、検索入
力窓に
‘Rigidbody’
と入力、検索候補から
‘Rigidbody’を選択
40
41. 弾丸の実装
Prefabの設定
• ‘Bullet’ prefabの
‘Sphere Collider’
– ‘Is Trigger’ チェック入れる
• ‘Rigidbody’
– ‘Use Gravity’ チェック外す
– ‘Is Kinematic’ チェック入れる
41
42. 弾丸の実装
Photon Viewスクリプト追加
• ‘Inspector’下部の
[Add Component]
ボタンをクリック、検索
入力窓に
‘PhotonView’
と入力、検索候補から
‘Photon View’を選択
• ‘Photon View’を追加す
ることにより、Photonの
同期対象となる
42
43. 弾丸の実装
同期スクリプトのコピー
• ‘Project’の検索入力窓に
‘Networkc’
と入力、検索結果に現れた
‘NetworkCharacter’
を選択
• 選択したまま
Edit メニュー
> Duplicate
で’NetworkCharacter’
を複製、
‘BulletNetwork’
に変更
• 名前を変えた途端に
’BulletNetwork’は消えるが、
検索を解除すれば表示される
43
45. 弾丸の実装
同期スクリプト: クラス名変更
• BulletNetwork.csを編集していることを確認
• 3行目のクラス名を
BulletNetwork
に変更
45
Before
3:public class NetworkCharacter : Photon.MonoBehaviour
After
3:public class BulletNetwork : Photon.MonoBehaviour
46. 弾丸の実装
同期スクリプト: 物理挙動制御
• 6-7行目の間に
‘Sample Code A-2’
の6行をコピー&ペーストで追加-> Awake()メソッド追加
46
Before
6:private Quaternion correctPlayerRot = Quaternion.identity; // We lerp towards this
7:// Update is called once per frame
8:void Update()
After
6:private Quaternion correctPlayerRot = Quaternion.identity; // We lerp towards this
+ 7:void Awake()
+ 8:{
+ 9: if (photonView.isMine) {
+10: rigidbody.isKinematic = false;
+11: }
+12:}
13:// Update is called once per frame
14:void Update()
47. 弾丸の実装
同期スクリプト: 不要コード削除1
• OnPhotonSerializeView()メソッド内の31-32行目を削除
(Sample Code A-3)
47
Before
27: // We own this player: send the others our data
28: stream.SendNext(transform.position);
29: stream.SendNext(transform.rotation);
30:
-31: myThirdPersonController myC = GetComponent<myThirdPersonController>();
-32: stream.SendNext((int)myC._characterState);
33:}
After
27: // We own this player: send the others our data
28: stream.SendNext(transform.position);
29: stream.SendNext(transform.rotation);
30:
33:}
48. 弾丸の実装
同期スクリプト: 不要コード削除2
• OnPhotonSerializeView()メソッド内の38-39行目を削除
(Sample Code A-4)
• ここまでできたらスクリプトを保存してエディタからUnityへ
48
Before
34: // Network player, receive data
35: this.correctPlayerPos = (Vector3)stream.ReceiveNext();
36: this.correctPlayerRot = (Quaternion)stream.ReceiveNext();
37:
-38: myThirdPersonController myC = GetComponent<myThirdPersonController>();
-39: myC._characterState = (CharacterState)stream.ReceiveNext();
40:}
After
34: // Network player, receive data
35: this.correctPlayerPos = (Vector3)stream.ReceiveNext();
36: this.correctPlayerRot = (Quaternion)stream.ReceiveNext();
37:
38:}
49. 弾丸の実装
同期スクリプトの追加
• ‘Inspector’下部の
[Add Component]
ボタンをクリック、検索
入力窓に
‘Bullet’
と入力、検索候補から
‘Bullet Network’を選択
• 先ほど作成した同期用
スクリプトが追加される
49
50. 弾丸の実装
同期スクリプトの設定
• ‘BulletNetwork’スクリプ
トを’Photon View’の
Observe
にドラッグ&ドロップ
• BulletNetworkがPhoton
Viewから同期スクリプト
として呼ばれるようにな
る
50
53. モンスターの設定
弾丸発射スクリプトの編集
• 今作った
‘MonsterFire’
スクリプトをエディタで開く
• 4行目のクラス名が
MonsterFire
になっていない場合は修正する
53
After
4:public class MonsterFire : MonoBehaviour
54. モンスターの設定
弾丸発射スクリプト: 発射制御
• 13-14行目の間に
‘Sample Code B’
の5行をコピー&ペーストで追加-> Update()メソッド内追加
• 編集が終わったら、保存してエディタからUnityへ
54
Before
13:void update() {
14:}
After
13:void update() {
+14: if (Input.GetKeyDown (KeyCode.H))
+15: {
+16: GameObject bullet = PhotonNetwork.Instantiate("Bullet", transform.position +
new Vector3(0.0f, 1.0f, 0.0f) + (transform.forward * 0.5f), transform.rotation, 0);
+17: bullet.rigidbody.velocity = transform.forward * 15.0f;
+18: }
19:}
55. モンスターの設定
不要スクリプトの削除
• ‘Project’の検索入力窓
に
‘monster’
と入力、検索結果から
‘monsterprefab’
を選択
• ‘Inspector’内の
‘Click Detector’を削除
55
56. モンスターの設定
三人称カメラスクリプトの追加
• ‘Inspector’下部の
[Add Component]
ボタンをクリック、検索
入力窓に
‘third’
と入力、検索候補から
‘Third Person Camera’を
選択
• 三人称カメラのスクリプ
トが追加される
56
57. モンスターの設定
弾丸発射スクリプトの追加
• ‘Inspector’下部の
[Add Component]
ボタンをクリック、検索
入力窓に
‘mons’
と入力、検索候補から
‘Monster Fire’を選択
• 先ほど作成した弾丸発
射スクリプトが追加され
る
57
58. モンスターの設定
スクリプトの設定
• 先ほど追加した
‘Third Person Camera’
‘Monster Fire’
の2つのスクリプトの
チェックを外す
• Photonで制御を行うた
めのもの
58
59. モンスターの設定
同期スクリプトの編集
• モンスターの同期スクリ
プトである
‘NetworkCharacter’
を編集
• ‘Project’の検索入力窓に
‘networkc’
と入力、検査結果に現れ
た
‘NetworkCharacter’
を選択
• ‘NetworkCharacter’をエ
ディタで開く
59
60. モンスターの設定
同期スクリプト: スクリプト制御
• 6-7行目の間に
‘Sample Code C-1’
の7行をコピー&ペーストで追加-> Awake()メソッド追加
60
Before
6:private Quaternion correctPlayerRot = Quaternion.identity; // We lerp towards this
7:// Update is called once per frame
8:void Update()
After
6:private Quaternion correctPlayerRot = Quaternion.identity; // We lerp towards this
+ 7:void Awake()
+ 8:{
+ 9: if (photonView.isMine) {
+10: GetComponent<ThirdPersonCamera>().enabled = true;
+11: GetComponent<MonsterFire>().enabled = true;
+12: }
+13:}
14:// Update is called once per frame
61. モンスターの設定
同期スクリプト: 削除処理
• 44-45行目の間に
‘Sample Code C-2’
の5行をコピー&ペーストで追加-> Destroy()メソッド追加
61
Before
43: }
44: }
45:}
After
43: }
44: }
+45: [RPC]
+46: void destroy()
+47: {
+48: PhotonNetwork.Destroy(gameObject);
+49: }
50:}
63. モンスターの設定
テストラン
• ここでシーンをPlayして
みる
• モンスターが石畳の上
に現れる
• カールキーでモンス
ターが動く
• [H]キーで弾丸発射
• テスト終わったら、Play
解除するのをお忘れな
く!
63
65. 壁の設定
壁の作成
• Cubeを使って壁を作成
GameObject
> Create Other
> Cube
• ‘Cube’の名前を
‘Wall1’
に変更
65
66. 壁の設定
奥の壁の設定
• ‘Inspector’内の’Tag’を
‘Finish’
に変更
• ‘Inspector’内の
’Transform’
の値を変更
– Position X:0 Y:5 Z:50
Rotation: X:0 Y:0 Z:0
Scale: X:100 Y:10 Z:1
66
68. 壁の設定
手前の壁の設定
• ‘Inspector’内の
’Transform’
の値を変更
– Position X:0 Y:5 Z:-50
Rotation: X:0 Y:0 Z:0
Scale: X:100 Y:10 Z:1
– Wall1からの変更は
Position Zを-50に
68
70. 壁の設定
右の壁の設定
• ‘Inspector’内の
’Transform’
の値を変更
– Position X:50 Y:5 Z:0
Rotation: X:0 Y:0 Z:0
Scale: X:1 Y:10 Z:100
70
72. 壁の設定
左の壁の設定
• ‘Inspector’内の
’Transform’
の値を変更
– Position X:-50 Y:5 Z:0
Rotation: X:0 Y:0 Z:0
Scale: X:1 Y:10 Z:100
– Wall2からの変更は
Position Xを-50に
72
76. 衝突判定の実装
衝突判定スクリプトの編集
• 今作った
‘Bullet’
スクリプトをエディタで開く
• 4行目のクラス名が
Bullet
になっていない場合は修正する
76
After
4:public class Bullet : MonoBehaviour
77. 衝突判定の実装
不要部分の削除
• 6-14行目を削除-> Bulletクラスを空に
77
Before
5:public class Bullet : MonoBehaviour {
- 6: // Use this for initialization
- 7: void Start () {
- 8:
- 9: }
-10:
-11: // Update is called once per frame
-12: void Update () {
-13:
-14: }
15:}
78. 衝突判定の実装
衝突判定メソッドの追加
• 残った5-6行目の間に、
Sample Code D
の18行を追加-> OnTriggerEnter()メソッドの追加
• 編集が終わったら、保存してエディタからUnityへ
78
After
+ 5:public class Bullet : MonoBehaviour {
+ 6: void OnTriggerEnter(Collider other)
+ 7: {
+ 8: PhotonView myView = gameObject.GetComponent<PhotonView>();
+ 9: if (other.gameObject.tag == "Player") {
…
+21: if (myView.isMine) {
+22: PhotonNetwork.Destroy(gameObject);
+23: }
+24: }
25:}
79. 衝突判定の実装
弾丸へ衝突判定スクリプトの追加
• ‘Bullet’ prefabを選択
• ‘Inspector’下部の
[Add Component]
ボタンをクリック、検索
入力窓に
‘bu’
と入力、検索候補から
‘Bullet’を選択
• 衝突判定のスクリプト
が追加される
79
81. 衝突判定の実装
テストラン
• ここでシーンをPlayして
みる
• モンスターが石畳の上
に現れる
• カールキーでモンス
ターが動く
• [H]キーで弾丸発射
• テスト終わったら、Play
解除するのをお忘れな
く!
81
84. 今後の予定
• 今回は【応用編】
• ロビー&ルームまわりの詳細をお話した【ロ
ビー&ルーム活用編】を予定
• また、プレイヤーまわり、オブジェクト同期ま
わりなど、分野別に活用編を実施予定
• その他、ご要望ありましたら、ぜひぜひお知ら
せください!
84
85. Photon Cloud ウェブサイト
• PhotonCloudサービス紹
介サイト
• http://photoncloud.jp/
• 弊社GMOクラウドが運営
する、PhotonCloudを日本
国内向けにご紹介するた
めのサイト
• 日本でのご利用事例の
ご紹介やイベントカレン
ダー、イベントレポートを
ご案内中
85
86. Photon Cloud ウェブサイト
• PhotonCloud facebook
ページ
• http://facebook.com/p
hotoncloudjp
• PhotonCloudの日本版
facebookページ
• イベント、セミナー、
ワークショップの告知や
ダイジェストレポートを
配信しています
86
87. Photon Cloud ウェブサイト
• PhotonCloudユーザー
助け合い所
• https://www.facebook.c
om/groups/photonclou
djp/
• Unityさんのアドバイス
でスタートした、
PhotonCloudのユー
ザー同士での情報交換
や助け合いを目的とし
たfacebookグループ
87
88. Photon Cloud ウェブサイト
• Twitterアカウント
@PhotonCloudJP
• イベントなどのお知らせ
やサービスの最新情報
などをつぶやいていま
す!
88
Notas do Editor ご挨拶、自己紹介、サポートメンバー紹介
Photon Cloudをご存知ですか?と聞いてみる 大阪版
本日のお題ですが、まずは実際に試していただけるように、Unity上でサンプルのプロジェクトを作っていきます。
福岡版
本日のお題ですが、まずはUnity上にサンプルのプロジェクトを作っていきます。
以下共通
そして最初に、一番簡単な接続方法、ランダムマッチメーカーというものの動きを説明します。
その後、既にあるルームの表示や入室の方法についてお話しします。
そして、プレイヤーを検索したり、そのプレイヤーのいるルームへの入室についてお話して、
自分でルームを作成する方法について説明します。
最後に、ゲームが始まった後にプレイヤー間でシーンを同期する方法についてお話しして終わりとなる予定です。 まず準備ということで、サンプルプロジェクトを作っていきます。
大阪版
みなさん、PCとWi-Fi接続の準備は整っていますかー?
大まかな流れを先にお話しすると、Unityで新しいプロジェクトを作成して、
そこにPhotonのアセットをインポートします。
その後、Photon Cloudに接続するための設定を行います。こちらのPUNの初期設定というやつですね。
そして、サンプルのクラスとシーンをダウンロード・インポートして完了となります。
大阪版
Photon Cloudの接続情報やサンプルのダウンロードリンクがありますので、
こちらのURLをWebブラウザで開いておいてください。
また、Asset Storeを使いますので、使ったことがない方はUnityアカウントを確認しておいてください。
福岡版
最初に開いているかと思いますが、開いていない方はこちらのURLを開いておいてください。 みなさん先ほどのページが開けましたら、Unityを起動してください。
起動しましたら、新しいプロジェクトを作成してください。
既存のプロジェクトに混ぜてしまうととっても悲しいことになりかねないので、
必ず新しいプロジェクトを作成してくださいねー。
プロジェクトの名前は置き場所は、特に指定ありませんので、
お好きな名前・場所で結構です。 プロジェクトの作成が完了しましたら、Asset Storeを開いてください。
Windowメニューの中のAsset Storeという項目が真ん中下のほうにあるので、
そちらをクリックしてください。 Asset Storeが開いたら、Photon Unity Networkingと検索してください。
検索はPhotonくらいでも大丈夫かなーと思いますが。
検索すると、こちらの青緑色のPhoton Unity Networkingという無料のものが
出てきますので、そちらをクリックしてください。 クリックすると、こちらのような画面が出てくるかと思います。
そうしましたら、Downloadボタンの右の下矢印をクリックすると、メニューが出てきます。
その中のDownload and Importをクリックして、ダウンロードとインポートをしてください。
ダウンロードが終わるとインポートするファイルを選択するダイアログが出てくるかと思いますが、
すべて選択された状態でImportのボタンをクリックしてインポートを完了してください。 PUNのインポートが終わるとそのままPUN Ziwardというウインドウが表示されるかと思います。
そのままそのウィンドウを開いたままにしておいてほしいのですが、閉じてしまった方は、
メニューのWindowsの中のPhoton Unity Networkingをクリックして再度開いてください。 PUN Wizardが開いたら、2番目にあるSetupというボタンを押してください。するとこちらのような画面が出てきます。
再度またSetupのボタンがある場合はそちらをクリックすると、こちらが出てくるかと思います。
こちらの画面が出ましたら、最初にブラウザで開いていただいたページの頭にApp IDと書かれた、
598dで始まるUUID形式の文字列がありますので、コピーしてPUN WizardのYour AppIdのところに貼付けてください。
次にCloud Regionですが、Japanの項目がありますが今回はあえてAsiaを選択します。
最後に、Saveボタンを押します。すると確認のダイアログが出てくるのでOKを押してください。
そこまでできたらこのPUN Wizardの画面は閉じてしまって大丈夫です。