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

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

UNET Command,TargetRPCを利用した移動処理のサンプル

Commandの制約:

・コマンドは 自分自身の プレイヤーオブジェクトからのみ送信できます

・メソッド名の先頭にCmdを付ける必要がある

NetwokingDemo.unitypackage - Google ドライブ

 

 

f:id:arumogina:20190408044043p:plain

f:id:arumogina:20190408044055p:plain

 

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

public class Move1 : NetworkBehaviour
{
  [SerializeField] float spd = 1f;
  //3フレームレートに一回送信
  [SerializeField] int SendRate = 3;
  int SendRateCnt = 1;
  Vector3 RPosition;
  Vector3 PrevPosition;
  float TimeCount = 0f;
  float PrevTimeCount = 0.1f;//数値は適当

  [ClientCallback]
  void Update (){
    if (isLocalPlayer){
      if (Input.GetKey(KeyCode.LeftArrow)){
        transform.Translate(new Vector3(-spd*Time.deltaTime,0,0));
      }
      if (Input.GetKey(KeyCode.RightArrow)){
        transform.Translate(new Vector3(spd*Time.deltaTime,0,0));
      }
      if(SendRateCnt % SendRate == 0){
        CmdSendTransform(transform.position);
        SendRateCnt = 1;
      }else{
        SendRateCnt += 1;
      }
    }else{
      TimeCount += Time.deltaTime;
      //TimeCount : PrevTimeCount = X : 1 => X = TimeCount/PrevTimeCount
      var p = Vector3.Lerp(PrevPosition,RPosition,TimeCount/PrevTimeCount);
      transform.SetPositionAndRotation(p,Quaternion.identity);
    }
  }

  [Command]
  void CmdSendTransform(Vector3 position){
    foreach(var con in NetworkServer.connections){
      if(con == null || !con.isReady || con == connectionToClient) continue;
      TargetSendTransform(con,position);
    }
  }

  [TargetRpc]
  void TargetSendTransform(NetworkConnection t,Vector3 position){
    PrevPosition = transform.position;
    RPosition = position;
    PrevTimeCount = TimeCount;
    TimeCount = 0f;
  }


}