获取其他玩家实例化的游戏对象 Unity Photon
Get other Players instantiated gameobjects Unity Photon
我正在尝试访问连接到同一房间的所有其他玩家的位置。我首先考虑获取已经实例化的游戏对象,但它们都具有相同的名称,所以这行不通。我不想使用 Terrain Generator,但是当每个玩家都生成 Terrain 时,它们会相互混淆。所以我想也许只有第一个玩家必须为自己和所有其他玩家生成地形,但我现在不知道如何获得其他玩家的位置。因此我无法检查谁是第一个玩家。所以我的第二个问题是:是否有其他方法可以让一个人为所有人生成地形?
当我使用名称访问我的播放器时,我只得到了我已经玩过的播放器,我尝试了一些我发送播放器坐标的东西,但是只有当 photonView.isMine 不是 True 时才给出坐标.
到目前为止,这是我的代码,此脚本位于玩家预制件上,玩家加入时会实例化。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Cinemachine;
public class NetworkPlayer : Photon.MonoBehaviour
{
private bool generatingTerrain;
private Vector3 correctPlayerPos;
private Quaternion correctPlayerRot;
private GameObject LevelGenerator;
private GameObject Player;
private float pos;
Rigidbody2D rb;
void Start()
{
LevelGenerator = GameObject.Find("LevelGenerator");
generatingTerrain = LevelGenerator.transform.Find("Level Generator");
Debug.Log(generatingTerrain);
if (photonView.isMine)
{
rb = GetComponent<Rigidbody2D>();
rb.simulated = true;
GetComponent<PlayerController>().enabled = true;
}
}
void Update()
{
//Debug.Log(generatingTerrain);
if (!photonView.isMine)
{
transform.position = Vector3.Lerp(transform.position, this.correctPlayerPos, Time.deltaTime * 5);
transform.rotation = Quaternion.Lerp(transform.rotation, this.correctPlayerRot, Time.deltaTime * 5);
Destroy(rb);
Debug.Log("Transform Position on !isMine: " + transform.position.x.ToString());
pos = transform.position.x;
}
Player = GameObject.Find("Player_1(Clone)");
if (photonView.isMine)
{
Debug.Log("photonView.isMine: " + transform.position.x.ToString());
Debug.Log("pos " + pos.ToString());
}
}
void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
if (stream.isWriting)
{
// We own this player: send the others our data
stream.SendNext(transform.position);
stream.SendNext(transform.rotation);
}
else
{
// Network player, receive data
this.correctPlayerPos = (Vector3)stream.ReceiveNext();
this.correctPlayerRot = (Quaternion)stream.ReceiveNext();
}
}
}
也许我只是没看到什么,这是我第一次使用 unity 和 photon,所以我对这个话题真的很陌生。
如果您需要什么,请写信给我,如果这里缺少什么,我很抱歉
希望尽快得到帮助:)
至于获得其他玩家的位置,你通过查看 photonView 是否不是我的来正确地做到这一点。
我不完全确定您要对地形做什么。现在您正在尝试为游戏中的所有玩家生成地形,这将使游戏中的每个玩家对象生成地形,这可能会导致混乱。
如果你想要程序生成的地形,我建议你用种子来做,然后在所有玩家之间共享种子。只有在 photonView.isMine 时才应该生成地形。
如果你想改变地形,例如销毁或移动块,然后您需要通过网络同步它,最有可能与事件或 RPC 调用同步。
我找到了解决我的确切问题的方法:
GameObject[] players = GameObject.FindGameObjectsWithTag("Player");
foreach (GameObject p in players)
{
Debug.Log(p.transform.position);
}
这会列出每个获得 Player Tag 的游戏对象并将它们放入数组中,然后您可以访问它们中的每一个以检查它是否不是您自己的位置,您可以这样做:
if (p.position != gameobject.transform.position) {
//Do here what you want to do with every Player who isnt you
}
我找到了解决方案here
我正在尝试访问连接到同一房间的所有其他玩家的位置。我首先考虑获取已经实例化的游戏对象,但它们都具有相同的名称,所以这行不通。我不想使用 Terrain Generator,但是当每个玩家都生成 Terrain 时,它们会相互混淆。所以我想也许只有第一个玩家必须为自己和所有其他玩家生成地形,但我现在不知道如何获得其他玩家的位置。因此我无法检查谁是第一个玩家。所以我的第二个问题是:是否有其他方法可以让一个人为所有人生成地形?
当我使用名称访问我的播放器时,我只得到了我已经玩过的播放器,我尝试了一些我发送播放器坐标的东西,但是只有当 photonView.isMine 不是 True 时才给出坐标.
到目前为止,这是我的代码,此脚本位于玩家预制件上,玩家加入时会实例化。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Cinemachine;
public class NetworkPlayer : Photon.MonoBehaviour
{
private bool generatingTerrain;
private Vector3 correctPlayerPos;
private Quaternion correctPlayerRot;
private GameObject LevelGenerator;
private GameObject Player;
private float pos;
Rigidbody2D rb;
void Start()
{
LevelGenerator = GameObject.Find("LevelGenerator");
generatingTerrain = LevelGenerator.transform.Find("Level Generator");
Debug.Log(generatingTerrain);
if (photonView.isMine)
{
rb = GetComponent<Rigidbody2D>();
rb.simulated = true;
GetComponent<PlayerController>().enabled = true;
}
}
void Update()
{
//Debug.Log(generatingTerrain);
if (!photonView.isMine)
{
transform.position = Vector3.Lerp(transform.position, this.correctPlayerPos, Time.deltaTime * 5);
transform.rotation = Quaternion.Lerp(transform.rotation, this.correctPlayerRot, Time.deltaTime * 5);
Destroy(rb);
Debug.Log("Transform Position on !isMine: " + transform.position.x.ToString());
pos = transform.position.x;
}
Player = GameObject.Find("Player_1(Clone)");
if (photonView.isMine)
{
Debug.Log("photonView.isMine: " + transform.position.x.ToString());
Debug.Log("pos " + pos.ToString());
}
}
void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
if (stream.isWriting)
{
// We own this player: send the others our data
stream.SendNext(transform.position);
stream.SendNext(transform.rotation);
}
else
{
// Network player, receive data
this.correctPlayerPos = (Vector3)stream.ReceiveNext();
this.correctPlayerRot = (Quaternion)stream.ReceiveNext();
}
}
}
也许我只是没看到什么,这是我第一次使用 unity 和 photon,所以我对这个话题真的很陌生。
如果您需要什么,请写信给我,如果这里缺少什么,我很抱歉 希望尽快得到帮助:)
至于获得其他玩家的位置,你通过查看 photonView 是否不是我的来正确地做到这一点。
我不完全确定您要对地形做什么。现在您正在尝试为游戏中的所有玩家生成地形,这将使游戏中的每个玩家对象生成地形,这可能会导致混乱。
如果你想要程序生成的地形,我建议你用种子来做,然后在所有玩家之间共享种子。只有在 photonView.isMine 时才应该生成地形。 如果你想改变地形,例如销毁或移动块,然后您需要通过网络同步它,最有可能与事件或 RPC 调用同步。
我找到了解决我的确切问题的方法:
GameObject[] players = GameObject.FindGameObjectsWithTag("Player");
foreach (GameObject p in players)
{
Debug.Log(p.transform.position);
}
这会列出每个获得 Player Tag 的游戏对象并将它们放入数组中,然后您可以访问它们中的每一个以检查它是否不是您自己的位置,您可以这样做:
if (p.position != gameobject.transform.position) {
//Do here what you want to do with every Player who isnt you
}
我找到了解决方案here