Unity/photon/pun1/変数同期/アバター風
提供: 初心者エンジニアの簡易メモ
変数同期のみでアバター風を作成する
- unity/photon/pun1/変数同期/シンプル [ショートカット] の手順の続き
- Memberの下にCanvasを追加
- MemberのCanvasの下にTextを追加
- Memberの下のCanvasのRenderModeをWorldSpaceへ(これでMemberにText座標がくっつくようになる)
- MemberにBoxColliderが追加する
- ヒエラルキートップにCanvas/InputTextとCanvas/Buttonを追加
- MemberのObserverdOptionにMemberScriptとPhotonTransformViewを追加
- MemberをPrefabに追加
- 以下スクリプトでPrefabのMemberを呼び出す
変数同期でx,y,str(名前)を同期した
- PhotonManager.cs
GameObject member = PhotonNetwork.Instantiate ("Member", Vector3.zero, Quaternion.Euler(Vector3.zero),0); member.name = "Member"+cube.GetComponent<PhotonView>().ownerId;
- MemberScript.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System; public class MemberScript : Photon.MonoBehaviour { public string str = "guest"; public float x = 0f; public float y = 0f; // Use this for initialization void Start () { } // Update is called once per frame void Update () { } void Awake() { this.name = "Member"+GetComponent<PhotonView>().ownerId; if (GetComponent<PhotonView>().isMine) { GetComponent<Renderer>().material.color = Color.red; } GameObject obj = GameObject.Find ("/Canvas/Button"); if (GetComponent<PhotonView>().isMine) { obj.GetComponent<Button>().onClick.AddListener (OnClick); } SetNameText (); } void OnMouseDrag() { Debug.Log ("member ownerId=" + GetComponent<PhotonView>().ownerId); Debug.Log ("member isMine=" + GetComponent<PhotonView>().isMine); if (GetComponent<PhotonView>().isMine) { GetComponent<Renderer>().material.color = Color.red; Vector3 objectPointInScreen = Camera.main.WorldToScreenPoint (this.transform.position); Vector3 mousePointInScreen = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, objectPointInScreen.z); Vector3 mousePointInWorld = Camera.main.ScreenToWorldPoint (mousePointInScreen); mousePointInWorld.z = this.transform.position.z; this.transform.position = mousePointInWorld; } } void OnClick() { if (GetComponent<PhotonView>().isMine) { GameObject objstr = GameObject.Find ("/Canvas/InputField/Text"); str = objstr.transform.GetComponent<Text>().text; } SetNameText (); } void SetNameText() { Debug.Log("name="+this.name); GameObject objstr = GameObject.Find(this.name + "/Canvas/Text"); try { objstr.transform.GetComponent<Text>().text = str; } catch (NullReferenceException ex) { } } void OnPhotonSerializeView( PhotonStream stream, PhotonMessageInfo info ) { if (stream.isWriting) { Debug.Log ("member isWriting="+str); //データの送信 stream.SendNext(str); stream.SendNext(this.transform.position.x); stream.SendNext(this.transform.position.y); } else { Debug.Log ("member isread="+str); //データの受信 this.str = (string)stream.ReceiveNext(); this.x = (float)stream.ReceiveNext(); this.y = (float)stream.ReceiveNext(); this.transform.position = new Vector3 (x, y, transform.position.z); SetNameText (); } } }
PhotonNetwork.Instantiateで作ったGameObjectのInstanceは、オブジェクト名の文字列だけ、photonを経由して、相手から送られてくるっぽい。