だいたいの人がPhotonの怪獣サンプルゲームをいじってみて・・・
「3Dモデル変えれば対戦ゲームが簡単に作れるじゃん!」って思ってるはず。
モデル差し替えの手順としては、以下のページが分かりやすいです
Photon Cloud × Unity GameJam 事前勉強会資料
ただし、ここでつまづく点がいくつかある
・怪獣はAnimationなのに対し、UnityちゃんはAnimatorで制御されてる!
・怪獣はAnimationなのに対し、UnityちゃんはAnimatorで制御されてる!
※ Animationは旧アニメーション方式(スクリプトで全て制御する方法)
Animatorは新アニメーション方式(Mecanimという遷移図を使う方法)
・怪獣によくわからないスクリプトがたくさんついてる
Unityちゃんを動かそうと色々やったけど、動くがモーションがT字ポーズのままという。
(周りの人も同じ問題でつまづいてた...)
ゲームジャム1日目の17時でこの状態で絶望してました...
なのでもうPhotonサンプルを改造するのをヤメました。
以下、Animatorで動かす手順です。
【UnityちゃんをPhotonで動かす手順】
AppIdをセットし、Japanを押してSave押下【UnityちゃんをPhotonで動かす手順】
(1)Asset Storeから以下を全部Import
・Unityちゃん
・Photon Unity Networking Free」
・Unityちゃん
・Photon Unity Networking Free」
(3)Photonの設定をします
[Window]-[Photon Unity Networking]-[PUN Wizard]
でSetupボタン押下
でSetupボタン押下
(4)UnityChanの「Locomotion」シーンをクリック
(5)空のGameObjectとNetworkManager.csというスクリプトを作ります。
スクリプトは空のGameObjectにセットする
(6)NetworkManager.csの中身を書きます
using UnityEngine; using System.Collections; public class NetworkManager : Photon.MonoBehaviour { void Awake () { // Server接続 PhotonNetwork.ConnectUsingSettings("v0.1"); } // Lobby参加OK時 void OnJoinedLobby() { // ランダムにRoom参加 PhotonNetwork.JoinRandomRoom(); } // Room参加NG時 void OnPhotonRandomJoinFailed() { Debug.Log("Room参加失敗!"); // 名前なしRoom作成 PhotonNetwork.CreateRoom(null); } // Room参加OK時 void OnJoinedRoom() { Debug.Log("Room参加成功!"); } // GUI表示 void OnGUI() { // Photon接続状態 GUILayout.Label(PhotonNetwork.connectionStateDetailed.ToString()); } }
(7)一度、実行しRoomにログインできた事を確認する
(8)Hierarchyからunitychanを選択し、Photon Viewを追加
(9)Assets配下にResourcesフォルダを作り、unitychanをPrefab化します。
名前もunitychanPrefabにリネームし、Hierarchyのunitychanは削除
(11)NetworkManager.csのOnJoinedRoom()に以下の行を追加します
// Room参加OK時 void OnJoinedRoom() { Debug.Log("Room参加成功!"); //プレイヤーをインスタンス化 Vector3 spawnPosition = new Vector3 (Random.Range (-2, 2), 5, 0); //生成位置 var go = PhotonNetwork.Instantiate ("unitychanPrefab", spawnPosition, Quaternion.identity, 0); }
(12)これで実行するとUnityちゃんが上から降ってきます
(13)[File]-[Build Settings]でAdd Currentボタン押下する。
他のチェックを外し、WebPlayerでBuildする
(14)これで2つブラウザを開くとUnityちゃんが出ますが、2人の動きが同期する
(15)UnityChanControlScriptWithRgidBody.csを開き、以下のコードを追加
// 14行目をPhotonを追加 public class UnityChanControlScriptWithRgidBody : Photon.MonoBehaviour // 69行目のFixedUpdateの中身をインデントを下げ、photonView.isMineを追加 void FixedUpdate () { //自プレイヤーであるか評価 if (photonView.isMine) { // [FixedUpdateソース中身] } }
(16)Synchronizer.csというスクリプトを作り、unitychanPrefabへ追加後
Photon ViewのObserveにドラッグ&ドロップします
(17)Synchronizerの中身は以下のように修正する
using UnityEngine; using System.Collections; //Animationの設定を行うスクリプト public class Synchronizer : Photon.MonoBehaviour { protected Animator anim; void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) { // データを送る if (stream.isWriting) { //データの送信 stream.SendNext(transform.position); stream.SendNext(transform.rotation); stream.SendNext(rigidbody.velocity); // アニメーションの連携 anim = GetComponent< Animator >(); stream.SendNext(anim.GetFloat("Speed")); stream.SendNext(anim.GetFloat("Direction")); stream.SendNext(anim.GetBool("Jump")); stream.SendNext(anim.GetBool("Rest")); stream.SendNext(anim.GetFloat("JumpHeight")); stream.SendNext(anim.GetFloat("GravityControl")); } else { //データの受信 transform.position = (Vector3)stream.ReceiveNext(); transform.rotation = (Quaternion)stream.ReceiveNext(); rigidbody.velocity = (Vector3)stream.ReceiveNext(); anim = GetComponent< Animator >(); anim.SetFloat("Speed",(float)stream.ReceiveNext()); anim.SetFloat("Direction",(float)stream.ReceiveNext()); anim.SetBool("Jump",(bool)stream.ReceiveNext()); anim.SetBool("Rest",(bool)stream.ReceiveNext()); anim.SetFloat("JumpHeight",(float)stream.ReceiveNext()); anim.SetFloat("GravityControl",(float)stream.ReceiveNext()); } } }
(18)あとジャンプでNullエラーがでるので、以下の行をコメント
[UnityChanControlScriptWithRgidBody.cs]の126行目
// 現在のベースレイヤーがjumpStateの時 else if (currentBaseState.nameHash == jumpState) { // cameraObject.SendMessage ("setCameraPositionJumpView"); // ジャンプ中のカメラに変更 // ↑ この行をコメント
(19)これでWebPlayerで書き出せば、アニメーションも連携されます。
多少動きがカクカクしてるので、スムーズにする方法知ってたら教えて下さーい
ちなみに不要なGUIボタンを消すのは、以下2つ行います。
・Unityちゃんに紐づいてるFace Updateのチェックを外す
・Unityちゃんに紐づいてるFace Updateのチェックを外す
・UnityChanControlScriptWithRgidBody.csのOnGUI部分をコメント
途中でサンプルを諦めたので、ゲームジャム内に完成までいけて本当によかった
途中でサンプルを諦めたので、ゲームジャム内に完成までいけて本当によかった
[ 参考URL ]
【Unity,Photon】PhotonCloudでオンラインゲームつくっちゃおー
photonの基本的な流れ【Unity】【photon】