Photon CloudでUnityちゃんを動かそう | とあるプログラマーのブログ

とあるプログラマーのブログ

Unityやblender、Live2Dについて書いていきます!

ゲームジャムでPhoton Cloudを触って、つまづいた点のメモです

だいたいの人がPhotonの怪獣サンプルゲームをいじってみて・・・
「3Dモデル変えれば対戦ゲームが簡単に作れるじゃん!」って思ってるはず。

モデル差し替えの手順としては、以下のページが分かりやすいです

Photon Cloud × Unity GameJam 事前勉強会資料

ただし、ここでつまづく点がいくつかある
 ・怪獣はAnimationなのに対し、UnityちゃんはAnimatorで制御されてる!
 ※ Animationは旧アニメーション方式(スクリプトで全て制御する方法)
   Animatorは新アニメーション方式(Mecanimという遷移図を使う方法)
 ・怪獣によくわからないスクリプトがたくさんついてる

Unityちゃんを動かそうと色々やったけど、動くがモーションがT字ポーズのままという。
(周りの人も同じ問題でつまづいてた...)
ゲームジャム1日目の17時でこの状態で絶望してました...

なのでもうPhotonサンプルを改造するのをヤメました。
以下、Animatorで動かす手順です。



【UnityちゃんをPhotonで動かす手順】

(1)Asset Storeから以下を全部Import
 ・Unityちゃん
 ・Photon Unity Networking Free」
 


(2)エラーが出るので、スクリプト名をリネームする
 

 UnityChan/Scripts/ThirdPersonCamera.csをリネーム
 

 


(3)Photonの設定をします
 [Window]-[Photon Unity Networking]-[PUN Wizard]
 でSetupボタン押下
 

 

 AppIdをセットし、Japanを押してSave押下
 

(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は削除
 


(10)Main CameraのThird Person Camera2のチェックを外します
 


(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のチェックを外す
 ・UnityChanControlScriptWithRgidBody.csのOnGUI部分をコメント


途中でサンプルを諦めたので、ゲームジャム内に完成までいけて本当によかった

[ 参考URL ]

Unity 4.3 x Photon Cloud 2Dオンラインアプリチュートリアル(前編)

【Unity,Photon】PhotonCloudでオンラインゲームつくっちゃおー

photonの基本的な流れ【Unity】【photon】