イラスト、モデリング、Unity、VR関連

unityとかblenderとかvr関連の作業メモ

UNET 動的な設定の共有

++目的

プレイヤーのHPなどのステータスをユーザーが設定してからネットワーク対戦をするゲームにおいて、その設定を共有する

 

++方法

SyncBarを使う

SyncVar の状態は、OnStartClient() が呼び出される前にクライアント上のゲームオブジェクトに適用される。

設定を持つスクリプトコンポーネントをBattleSettingとする。

BattleSettingはDontDestroyOnloadでシーン変更時に破壊されないようにする。SettingのパラメータにはSyncVarを付与し、クラスにはNetworkBehaiorを継承する。

最初にホストのユーザーがパラメータを決定するので、ホストユーザー接続時にOnServerReadyで設定したパラメータを[Command]でBattleSettingにセットする。

 

あとは、プレイヤーなどにセットしたスクリプトのStart()でBattleSettingからパラメータを取得して設定を行えばOK

 

 

++コード

BattleSetting---

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

//SyncVar の状態は、OnStartClient() が呼び出される前にクライアント上のゲームオブジェクトに適用されます
public class BattleSetting : NetworkBehaviour
{
  [SyncVar]
  public int MaxHP;
  [SyncVar]
  public int MaxMP;
  void Start(){ DontDestroyOnLoad(this); }


  [Command]
  public void CmdSyncBattleSetting(int hp,int mp){
    MaxHP = hp;
    MaxMP = mp;
  }
}

NetworkManager---

  public override void OnServerReady(NetworkConnection conn){
      print("OnServerReady");

      base.OnServerReady(conn);
      ConnectCount += 1;
      Debug.Log(ConnectCount);
      if(ConnectCount == 1){
        m_BattleSetting.CmdSyncBattleSetting(int.Parse(HPText.text),int.Parse(MPText.text));
      }
      if(ConnectCount == 2){
        StartCoroutine("ColServerChangeScene");
      }
  }

PlayerSetup---

    void Start(){
      if(isLocalPlayer){
        var bs = GameObject.Find("BattleSetting").GetComponent();
        var pbi = GetComponent();
        pbi.SetParams(bs.MaxHP,bs.MaxMP);
      }