我们正在使用Photon引擎制作随机匹配制作游戏.我们希望在一定时间内匹配具有不同用户的玩家.如果PlayerA与PlayerB一起玩,他们将无法再玩30分钟.做这种系统的最佳方法是什么?
我们尝试了一些算法,但它并不适合.
public override void OnJoinedRoom()
{
if(PhotonNetwork.isMasterClient)
StartCoroutine("StartWaiting");
theSameGame = false;
var photonPlayer = PhotonNetwork.Instantiate("PhotonPlayerKO", Vector3.zero, Quaternion.identity, 0) as GameObject;
photonPlayer.name = "Local Player";
if(PhotonNetwork.playerList.Count() > 1 && !PhotonNetwork.isMasterClient)
photonViewOfManager.RPC("MyNameIs", PhotonTargets.Others, PlayerInfos.thePlayersName);
//Sending player name to other player to check whether this name is playable or not ?
if(!PhotonNetwork.isMasterClient)
StartCoroutine("CheckError");
}
Run Code Online (Sandbox Code Playgroud)
它有效,但有一些缺点,如耗时vs ..任何想法更好的解决方案?
Photon Server和Photon Cloud产品有什么区别?
我需要列出我的大厅场景中的 romos。目前,这是我使用过的代码,但我不知道为什么它不起作用。这是正确的方法吗?
public override void OnRoomListUpdate(List<RoomInfo> roomList)
{
print(roomList.Count + " Rooms");
base.OnRoomListUpdate(roomList);
foreach (var Item in roomList)
{
RoomName = Item.Name;
PlayerAmount = Item.PlayerCount;
MaxPlayers = Item.MaxPlayers;
PhotonNetwork.Instantiate("RoomPrefab", transform.position, transform.rotation);
RoomPrefab.transform.Find("RoomName").GetComponent<Text>().text = RoomName;
RoomPrefab.transform.Find("PlayerInt").GetComponent<Text>().text = PlayerAmount.ToString();
if(MaxPlayers == 4)
{
GameObject.Find("IPlayerA").GetComponent<Image>().sprite = Four;
}
else if (MaxPlayers == 2)
{
GameObject.Find("IPlayerA").GetComponent<Image>().sprite = Two;
}
else if (MaxPlayers == 3)
{
GameObject.Find("IPlayerA").GetComponent<Image>().sprite = Three;
}
RoomPrefab.transform.SetParent(ScrollView.transform, false);
}
}
Run Code Online (Sandbox Code Playgroud)
我需要指定我正在使用 Photon 的 PUN2,因此 GetRoomList 将不起作用。
我听说Unity3D具有内置多人游戏功能,它可以在没有服务器的情况下提供服务.但是我找不到任何关于它的信息,我发现的所有turtorial都只是与Photon(PUD)或Google Services合作.我知道Photon很好,所以我开始研究它并计划使用它.
但是我仍然想写一些非常简单的应用程序,不使用服务器,比如One VS One Rock Paper Scissors游戏.使用Photon必须在性能上更好,但在某些情况下,如上所述,它似乎太多了.此外,免费用户的PUD CCU只有二十,所以这意味着只有十个小组可以同时玩,Rock Paper Scissors游戏.
我看到有人说没有服务器就有可能,但其他一些人说不可能.
什么是对的?
我在做2D游戏,问题是当第一个玩家创建并出现在房间里时,他的相机正常工作,但是当一个新玩家进入房间时,第一个玩家通过第二个玩家的相机看到一切。此外,如果第三名玩家连接,第一名和第二名玩家可以通过第三名玩家的相机看到一切,依此类推。
在 GameManager 类中实例化的玩家预制件,该类仅在游戏场景中
public class GameManager : MonoBehaviourPunCallbacks
{
public GameObject playerPrefab;
public Transform spawnPoint;
public void Start()
{
GameObject player = PhotonNetwork.Instantiate(this.playerPrefab.name, spawnPoint.position, Quaternion.identity);
player.GetComponent<FireFighterHeroController>().enabled = true;
player.GetComponent<CameraControler>().enabled = true;
player.GetComponent<CameraControler>().SetTarget(player.transform);
}
#region PUN Callbacks
public override void OnLeftRoom()
{
SceneManager.LoadScene(1);
}
#endregion
#region Custom Methods
public void OnClickLeaveRoom_Btn()
{
PhotonNetwork.LeaveRoom();
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
简单的相机控制器
public class CameraControler : MonoBehaviour
{
private Transform target;
public GameObject camera;
public Vector3 offset;
public void SetTarget(Transform target)
{
this.target = target; …
Run Code Online (Sandbox Code Playgroud) 我正在尝试删除一个实例化的光子网络对象,一旦它被碰撞,但是即使我将它设置为对象并且错误返回正确的对象它由于某种原因无法删除它,我可以不明白为什么在这里。这里有错误:
Failed to 'network-remove' GameObject because it is missing a valid
InstantiationId on view: View (0)1 on SUV (scene). Not Destroying GameObject
or PhotonViews! UnityEngine.Debug:LogError(Object)
NetworkingPeer:RemoveInstantiatedGO(GameObject, Boolean) (at Assets/Photon
Unity Networking/Plugins/PhotonNetwork/NetworkingPeer.cs:2499) PhotonNetwork:Destroy(GameObject)
(at Assets/Photon Unity Networking/Plugins/PhotonNetwork/PhotonNetwork.cs:2259)
BulletScript:OnCollisionEnter(Collision) (at Assets/Prefab/Resources/Scripts
/BulletScript.cs:29)
public Transform explosionPrefab;
private Transform explosion;
public GameObject bullet;
void OnCollisionEnter(Collision col) {
if(col.gameObject.name == "Player"){
PhotonNetwork.Destroy (col.gameObject);
Instantiate(explosionPrefab, col.transform.position, col.transform.rotation);
}
if (col.gameObject.name == "SUV") {
PhotonNetwork.Destroy (col.gameObject);
Instantiate(explosionPrefab, col.transform.position, col.transform.rotation);
}
PhotonNetwork.Destroy (bullet);
Instantiate(explosionPrefab, bullet.transform.position, bullet.transform.rotation);
}
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种简单的方法来从闪亮的应用程序创建独立的应用程序。我第一次看到凯蒂的“闪亮遇见电子”演讲(参见谷歌)。浏览他们的网站后,我认为 Photon 是他们最新的方法!
我尝试以最简单的方式测试 Photon 但没有成功。
To test Photon, I did the following:
1. install node.js (works, tested 'npm' in CMD line, recognised)
2. install git (works, tested 'git' in CMD line, recognised)
3. install Photon using your instructions
4. Open new basic shinyApplications: RStudio > File > New file > Shiny Web App... >>
--> Name 'PhotonTestApp'
--> multiple fFIle (ui.R/server.R)
--> C:/ShinyApps
Tested to see the app works, the basic Geyser data app.
5. setwd("C:\ShinyApps\PhotonTestApp\")
6. …
Run Code Online (Sandbox Code Playgroud) 我已经开发了具有光子网络(PUN)的多人unity3d射击游戏。它运行良好,可以在Windows(exe)上运行,但是在浏览器(web gl)中不起作用。
没有光子的测试项目在浏览器中可以正常工作。我认为问题与光子有关。js控制台中有几个例外。
构建托管于
谷歌驱动器。 您能解释这个问题的原因吗?
Unity3d 5.3.1。Photon Unity Networking v1.65。使用chrome,firefox和Internet Explorer对构建进行了测试。Windows 7 x64。
我正在使用 Photon 服务器运行多人游戏,每 100 多场比赛,服务器停止响应输入——查看日志文件,我收到以下异常:
2013 年 7 月 30 日 12:31:24,918 [11] 错误 Lite.Room [(null)] - System.IndexOutOfRangeException:索引超出数组范围。在 C:\Program Files (x86)\Photon\Photon src-server\STSServer\STSLib\Engine.cs:line 130 中的 STSLib.Engine.handleInput(Hashtable input, Int32 playerId)
查看我的代码,我的引擎类的第 130 行是一个 foreach 循环:
foreach (Player p in players)
{
Queue playerQueue = new Queue();
returnTable.Add(p.playerId, playerQueue);
}
Run Code Online (Sandbox Code Playgroud)
其中 player 是我用来代表(你猜对了!)游戏玩家的类,而玩家是一个 Players 数组。returntable,是我发送给客户端的其他数据的哈希表队列的哈希表,我只是用一个空队列实例化每个键。
在这种情况下,在游戏中断之前,foreach 循环被调用并多次工作——也就是说,在游戏过程中开始抛出这个异常。
谁能解释 foreach 循环如何抛出索引越界异常?
尝试使用 PUN2 创建就绪检查,以便所有玩家同时加载到游戏场景中,但我不明白如何检查其他玩家的自定义属性并记录当前有多少玩家准备好以及是否全部准备好准备好然后开始游戏。我认为我应该为每个玩家设置一个自定义属性,但我不确定它是否有效。
public class HeroSelectController : MonoBehaviour
{
[HideInInspector]
public string selectedHero;
private PhotonView PV;
private bool PlayerReady = false;
private ExitGames.Client.Photon.Hashtable _playerCustomProperties = new ExitGames.Client.Photon.Hashtable();
private void Update()
{
Debug.Log("Player Ready = " + _playerCustomProperties["PlayerReady"]);
}
private void HeroSelect()
{
PlayerReady = true;
selectedHero = "PlayerTest";
PhotonNetwork.SetPlayerCustomProperties(_playerCustomProperties);
_playerCustomProperties["PlayerReady"] = PlayerReady;
}
public void OnClickHeroButton()
{
HeroSelect();
if (PhotonNetwork.IsMasterClient)
{
foreach (var photonPlayer in PhotonNetwork.PlayerList)
{
photonPlayer.CustomProperties["PlayerReady"] = true;
PhotonNetwork.LoadLevel(3);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
目前发生的情况是,主客户端可以开始游戏,而不管其他人的状态如何。感觉我可能想得太多了,并且有一个非常相似的解决方案,因为我希望这样的功能很常见,因为我希望在许多在线游戏中使用类似的功能,所以如果我要完全错误请给我指出一个更合适的方向
photon ×10
c# ×7
multiplayer ×2
block ×1
cloud ×1
matchmaking ×1
r ×1
rpc ×1
shiny ×1
unity-webgl ×1