「Unity/photon/pun2/位置同期」の版間の差分

提供: 初心者エンジニアの簡易メモ
ナビゲーションに移動 検索に移動
 
(同じ利用者による、間の13版が非表示)
1行目: 1行目:
==アバター風にしてみる==
==アバター風にしてみる==
#Cube作成。ここでは"AvatarCube"という名前に変更した。
#Cube作成。ここでは"Avatar"という名前に変更した。
#AvatarCubeにBoxColliderが追加されていることを確認
#AvatarにBoxColliderが追加されていることを確認
#AvatarCubeのAddComponentにPhotonAvaterとPhotonViewとPhotonTransformViewを追加
#AvatarのAddComponentにPhotonAvatarとPhotonViewとPhotonTransformViewを追加
#PhotonTransformViewに、PositionとRotationが、追加されてることを確認。
#PhotonTransformViewに、PositionとRotationが、追加されてることを確認。
#Assets下に、Resourcesディレクトリを追加して、AvatarCubeをResourcesに追加
#Assets下に、Resourcesディレクトリを追加して、AvatarをResourcesに追加
#以下スクリプトでPrefabのAvaterをロードする。
#以下スクリプトでPrefabのAvatarをロードする。


*PhotonManager.cs
*PhotonManager.cs
  GameObject avater = PhotonNetwork.Instantiate("AvatarCube",  Vector3.zero, Quaternion.Euler(Vector3.zero),0);
  GameObject avatar = PhotonNetwork.Instantiate("Avatar",  Vector3.zero, Quaternion.Euler(Vector3.zero),0);


*PhotonAvater.sc
これを使うと、相手が接続時に、インスタンスがロード&表示される。
 
*PhotonAvatar.sc
<pre>
<pre>
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine;
using UnityEngine.UI;
using Photon.Pun;
using System;
 
public class PhotonAvater : MonoBehaviourPunCallbacks {
public class PhotonAvatar : MonoBehaviourPunCallbacks, IPunInstantiateMagicCallback
public string str = "guest1";
{
void Awake()
void Awake()
{
{
this.name = "Avater" + GetComponent<PhotonView>().InstantiationId;
this.name = "Avatar" + GetComponent<PhotonView>().InstantiationId;
if (GetComponent<PhotonView>().IsMine)
if (GetComponent<PhotonView>().IsMine)
{
{
GetComponent<Renderer>().material.color = Color.red;
GetComponent<Renderer>().material.color = Color.red;
} else {
// もし操作するクラスをaddしてた場合は、自分以外のときは無効とする
GetComponent<CharacterControl>().enabled = false;
}
}
}
    }
// 自分からの情報と他人からの情報(位置と回転)同期
    void IPunInstantiateMagicCallback.OnPhotonInstantiate(PhotonMessageInfo info)
void OnPhotonInstantiate(PhotonMessageInfo info)
    {
{
        if (info.Sender.IsLocal)
info.Sender.TagObject = this.gameObject;
        {
}
            Debug.Log("自身が生成");
        }
        else
        {
            Debug.Log("他人が生成");
        }
        info.Sender.TagObject = this.gameObject;
    }
}
}
</pre>
</pre>


公式:https://doc.photonengine.com/ja-jp/pun/v2/gameplay/instantiation
公式:https://doc.photonengine.com/ja-jp/pun/v2/gameplay/instantiation
==既に接続してるプレイヤーのPhotonNetwork.Instantiateが表示されない時==
シーンをまたぐ場合は、部屋に入ったときは、以下のようにして、相手プレイヤーの受信を控える
PhotonNetwork.IsMessageQueueRunning = false;
シーン移動後に、以下のように再開する
PhotonNetwork.IsMessageQueueRunning = true;
==位置同期しながらRPCのやり取りをする==
以下を空いたスペースに追加する。
[PunRPC]は、PhotonViewを実装してるところでのみ使えるっぽい。
<pre>
public class PhotonAvatar : MonoBehaviourPunCallbacks, IPunInstantiateMagicCallback
{
public string userName = "guest";
void Awake()
{
                // ・・省略・・
if (GetComponent<PhotonView>().IsMine)
{
PhotonNetwork.LocalPlayer.NickName = "Guest" + GetComponent<PhotonView>().InstantiationId;
GetComponent<PhotonView>().RPC("SetUserName", RpcTarget.AllBuffered, PhotonNetwork.LocalPlayer.NickName);
                }
        }
    }
    // ・・省略・・
    [PunRPC]
    void SetUserName(string value)
    {
        transform.Find("UserNameText").GetComponent<TextMesh>().text = value;
    }
}
</pre>

2022年12月13日 (火) 04:33時点における最新版

アバター風にしてみる

  1. Cube作成。ここでは"Avatar"という名前に変更した。
  2. AvatarにBoxColliderが追加されていることを確認
  3. AvatarのAddComponentにPhotonAvatarとPhotonViewとPhotonTransformViewを追加
  4. PhotonTransformViewに、PositionとRotationが、追加されてることを確認。
  5. Assets下に、Resourcesディレクトリを追加して、AvatarをResourcesに追加
  6. 以下スクリプトでPrefabのAvatarをロードする。
  • PhotonManager.cs
GameObject avatar = PhotonNetwork.Instantiate("Avatar",  Vector3.zero, Quaternion.Euler(Vector3.zero),0);

これを使うと、相手が接続時に、インスタンスがロード&表示される。

  • PhotonAvatar.sc
using UnityEngine;
using Photon.Pun;

public class PhotonAvatar : MonoBehaviourPunCallbacks, IPunInstantiateMagicCallback
{
	void Awake()
	{
		this.name = "Avatar" + GetComponent<PhotonView>().InstantiationId;
		if (GetComponent<PhotonView>().IsMine)
		{
			GetComponent<Renderer>().material.color = Color.red;
		} else {
			// もし操作するクラスをaddしてた場合は、自分以外のときは無効とする
			GetComponent<CharacterControl>().enabled = false;
		}
    }
    void IPunInstantiateMagicCallback.OnPhotonInstantiate(PhotonMessageInfo info)
    {
        if (info.Sender.IsLocal)
        {
            Debug.Log("自身が生成");
        }
        else
        {
            Debug.Log("他人が生成");
        }
        info.Sender.TagObject = this.gameObject;
    }
}

公式:https://doc.photonengine.com/ja-jp/pun/v2/gameplay/instantiation

既に接続してるプレイヤーのPhotonNetwork.Instantiateが表示されない時

シーンをまたぐ場合は、部屋に入ったときは、以下のようにして、相手プレイヤーの受信を控える

PhotonNetwork.IsMessageQueueRunning = false;

シーン移動後に、以下のように再開する

PhotonNetwork.IsMessageQueueRunning = true;

位置同期しながらRPCのやり取りをする

以下を空いたスペースに追加する。 [PunRPC]は、PhotonViewを実装してるところでのみ使えるっぽい。

public class PhotonAvatar : MonoBehaviourPunCallbacks, IPunInstantiateMagicCallback
{
	public string userName = "guest";
	void Awake()
	{
                // ・・省略・・
		if (GetComponent<PhotonView>().IsMine)
		{
			PhotonNetwork.LocalPlayer.NickName = "Guest" + GetComponent<PhotonView>().InstantiationId;
			GetComponent<PhotonView>().RPC("SetUserName", RpcTarget.AllBuffered, PhotonNetwork.LocalPlayer.NickName);
                }
        }
    }
    // ・・省略・・
    [PunRPC]
    void SetUserName(string value)
    {
        transform.Find("UserNameText").GetComponent<TextMesh>().text = value;
    }

}