此错误不断在控制台中收到垃圾邮件:
(文件名:C:/Users/Finalbi/Documents/Stocks and Shares/Assets/Scripts/GameManager.cs行:360)
NullReferenceException:未将对象引用设置为对象的实例 在 C:\Users\Finalbi\Documents\Stocks and Shares\Assets\Scripts\GameManager.cs 中的 GameManager.Gameover (PlayerScore[] 分数) [0x0002d]:360 在(包装器托管到本机)System.Reflection.RuntimeMethodInfo.InternalInvoke(System.Reflection.RuntimeMethodInfo,对象,对象[],System.Exception&) 在System.Reflection.RuntimeMethodInfo.Invoke(System.Object obj,System.Reflection.BindingFlags invokeAttr,System.Reflection.Binder活页夹,System.Object []参数,System.Globalization.CultureInfo文化)[0x0006a]中<605bf8b31fcb444b85176da963870aa7>:0 重新抛出为 TargetInitationException:调用目标已引发异常。 在System.Reflection.RuntimeMethodInfo.Invoke(System.Object obj,System.Reflection.BindingFlags invokeAttr,System.Reflection.Binder活页夹,System.Object []参数,System.Globalization.CultureInfo文化)[0x00083]中<605bf8b31fcb444b85176da963870aa7>:0 在 System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] 参数) [0x00000] 中 <605bf8b31fcb444b85176da963870aa7>:0 在 Photon.Pun.PhotonNetwork.ExecuteRpc (ExitGames.Client.Photon.Hashtable rpcData, Photon.Realtime.Player 发送者) [0x005d6] 在 C:\Users\Finalbi\Documents\Stocks and Shares\Assets\Photon\PhotonUnityNetworking\Code\ PhotonNetworkPart.cs:554 在 Photon.Pun.PhotonNetwork.OnEvent (ExitGames.Client.Photon.EventData photonEvent) [0x000ac] 在 C:\Users\Finalbi\Documents\Stocks and Shares\Assets\Photon\PhotonUnityNetworking\Code\PhotonNetworkPart.cs:2202 在 Photon.Realtime.LoadBalancingClient.OnEvent (ExitGames.Client.Photon.EventData photonEvent) [0x0052e] 在 C:\Users\Finalbi\Documents\Stocks and Shares\Assets\Photon\PhotonRealtime\Code\LoadBalancingClient.cs:3362 在 ExitGames.Client.Photon.PeerBase.DeserializeMessageAndCallback (ExitGames.Client.Photon.StreamBuffer 流) [0x002e4] 在 D:\Dev\Work\photon-dotnet-sdk\PhotonDotNet\PeerBase.cs:904 在 ExitGames.Client.Photon.EnetPeer.DispatchIncomingCommands () [0x003d2] 在 D:\Dev\Work\photon-dotnet-sdk\PhotonDotNet\EnetPeer.cs:577 在 ExitGames.Client.Photon.PhotonPeer.DispatchIncomingCommands () [0x00038] 在 D:\Dev\Work\photon-dotnet-sdk\PhotonDotNet\PhotonPeer.cs:1771 在 Photon.Pun.PhotonHandler.Dispatch () [0x00030] 在 C:\Users\Finalbi\Documents\Stocks and Shares\Assets\Photon\PhotonUnityNetworking\Code\PhotonHandler.cs:232 重新抛出 AggregateException:在 DispatchIncomingCommands() 调用的方法中捕获 5 个异常。仅首先重新抛出(见上文)。 (调用目标已引发异常。) 在 Photon.Pun.PhotonHandler.Dispatch () [0x00098] 在 C:\Users\Finalbi\Documents\Stocks and Shares\Assets\Photon\PhotonUnityNetworking\Code\PhotonHandler.cs:250 在 Photon.Pun.PhotonHandler.FixedUpdate () [0x00012] 在 C:\Users\Finalbi\Documents\Stocks and Shares\Assets\Photon\PhotonUnityNetworking\Code\PhotonHandler.cs:152
这是我的游戏管理器脚本:
using ExitGames.Client.Photon;
using Photon.Pun;
using Hashtable = ExitGames.Client.Photon.Hashtable;
using Photon.Realtime;
using System.Collections;
using System.Collections.Generic;
using System.Data.SqlTypes;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using TMPro;
using UnityEngine;
using System.Threading.Tasks;
using System;
using System.Text;
using UnityEngine.SceneManagement;
using System.Linq;
public class GameManager : MonoBehaviourPunCallbacks
{
public GameObject Main;
public GameObject c1;
public GameObject c2;
public GameObject c3;
public GameObject c4;
public GameObject c5;
public GameObject c6;
public TextMeshProUGUI ctext1;
public TextMeshProUGUI ctext2;
public TextMeshProUGUI ctext3;
public TextMeshProUGUI ctext4;
public TextMeshProUGUI ctext5;
public TextMeshProUGUI ctext6;
public TextMeshProUGUI cdtext1;
public TextMeshProUGUI cdtext2;
public TextMeshProUGUI cdtext3;
public TextMeshProUGUI cdtext4;
public TextMeshProUGUI cdtext5;
public TextMeshProUGUI cdtext6;
public TextMeshProUGUI MoneyIndcater;
public TextMeshProUGUI TimeIndcater;
public TextMeshProUGUI StocksIndcater1;
public TextMeshProUGUI StocksIndacter2;
public TextMeshProUGUI StocksIndacter3;
public TextMeshProUGUI StocksIndacter4;
public TextMeshProUGUI StocksIndacter5;
public TextMeshProUGUI StocksIndacter6;
public TextMeshProUGUI PriceIndacter1;
public TextMeshProUGUI PriceIndacter2;
public TextMeshProUGUI PriceIndacter3;
public TextMeshProUGUI PriceIndacter4;
public TextMeshProUGUI PriceIndacter5;
public TextMeshProUGUI PriceIndacter6;
public GameObject BankruptIndacter1;
public GameObject BankruptIndacter2;
public GameObject BankruptIndacter3;
public GameObject BankruptIndacter4;
public GameObject BankruptIndacter5;
public GameObject BankruptIndacter6;
public Company company1;
public Company company2;
public Company company3;
public Company company4;
public Company company5;
public Company company6;
public int maxDays = 10;
public int days = 1;
public Dictionary<int, int> Stocks;
public List<Company> CompanysInUse;
public bool lastDay = false;
public bool gameOver = false;
public bool sentScore = false;
public bool greenLight = false;
private TaskCompletionSource<bool> greenLightTaskCompletionSource;
public int forwardVotes = 0;
public List<Player> playersVoted;
public TextMeshProUGUI voteText;
public List<PlayerScore> playersScores;
PhotonView view;
public int money;
public GameObject leaderboard;
public TextMeshProUGUI leaderboardtext;
public GameObject fowardTimeButton;
// Start is called before the first frame update
void Start()
{
sentScore = false;
gameOver = false;
lastDay = false;
view = PhotonView.Get(this);
playersScores = new List<PlayerScore>();
playersVoted = new List<Player>();
money = 10;
days = 1;
forwardVotes = 0;
greenLightTaskCompletionSource = new TaskCompletionSource<bool>();
Stocks = new Dictionary<int, int>();
Stocks[1] = 0;
Stocks[2] = 0;
Stocks[3] = 0;
Stocks[4] = 0;
Stocks[5] = 0;
Stocks[6] = 0;
voteText.text = forwardVotes + "/" + PhotonNetwork.CurrentRoom.PlayerCount;
CompanysInUse = new List<Company>();
Companies companies1 = new Companies();
if (PhotonNetwork.IsMasterClient)
{
for (int i = 0; i < 6; i++)
{
int random = UnityEngine.Random.Range(1, companies1.companies.Count);
Company company = companies1.companies[random];
company.price = UnityEngine.Random.Range(1, 10);
CompanysInUse.Add(company);
}
company1 = CompanysInUse[0];
company2 = CompanysInUse[1];
company3 = CompanysInUse[2];
company4 = CompanysInUse[3];
company5 = CompanysInUse[4];
company6 = CompanysInUse[5];
view.RPC("SetCompanysClient", RpcTarget.All, company1, company2, company3, company4, company5, company6);
}
}
private void Awake()
{
PhotonPeer.RegisterType(typeof(Company), (byte)'A', Company.Serialize, Company.Deserialize);
PhotonPeer.RegisterType(typeof(PlayerScore), (byte)'B', PlayerScore.Serialize, PlayerScore.Deserialize);
}
// Update is called once per frame
void Update()
{
MoneyIndcater.text = "Money: " + money;
TimeIndcater.text = "Days: " + days;
StocksIndcater1.text = "Stocks: " + Stocks[1];
StocksIndacter2.text = "Stocks: " + Stocks[2];
StocksIndacter3.text = "Stocks: " + Stocks[6];
StocksIndacter4.text = "Stocks: " + Stocks[4];
StocksIndacter5.text = "Stocks: " + Stocks[5];
StocksIndacter6.text = "Stocks: " + Stocks[6];
PriceIndacter1.text = "Price: " + company1.price;
PriceIndacter2.text = "Price: " + company2.price;
PriceIndacter3.text = "Price: " + company3.price;
PriceIndacter4.text = "Price: " + company4.price;
PriceIndacter5.text = "Price: " + company5.price;
PriceIndacter6.text = "Price: " + company6.price;
BankruptIndacter1.SetActive(company1.bankrupt);
BankruptIndacter2.SetActive(company2.bankrupt);
BankruptIndacter3.SetActive(company3.bankrupt);
BankruptIndacter4.SetActive(company4.bankrupt);
BankruptIndacter5.SetActive(company5.bankrupt);
BankruptIndacter6.SetActive(company6.bankrupt);
voteText.text = forwardVotes + "/" + PhotonNetwork.CurrentRoom.PlayerCount;
if (forwardVotes >= PhotonNetwork.CurrentRoom.PlayerCount && PhotonNetwork.IsMasterClient)
{
view.RPC("FowardTime", RpcTarget.All);
}
if (gameOver && !sentScore)
{
sentScore = true;
view.RPC("SendScore", RpcTarget.MasterClient, PhotonNetwork.LocalPlayer, money);
}
if (playersScores.Count >= PhotonNetwork.CurrentRoom.PlayerCount && PhotonNetwork.IsMasterClient && gameOver)
{
playersScores.Sort(new PlayerScoreComparer());
view.RPC("Gameover", RpcTarget.All, playersScores.ToArray() as object);
}
}
public void onPressBuy(int CompanyNumber)
{
int UCompanyNumber = CompanyNumber + 1;
Company companyBuyingFrom = null;
switch (UCompanyNumber)
{
case 1: companyBuyingFrom = company1; break;
case 2: companyBuyingFrom = company2; break;
case 3: companyBuyingFrom = company3; break;
case 4: companyBuyingFrom = company4; break;
case 5: companyBuyingFrom = company5; break;
case 6: companyBuyingFrom = company6; break;
}
if (companyBuyingFrom.price <= money && !companyBuyingFrom.bankrupt && !lastDay)
{
switch (UCompanyNumber)
{
case 1: money = money - company1.price; break;
case 2: money = money - company2.price; break;
case 3: money = money - company3.price; break;
case 4: money = money - company4.price; break;
case 5: money = money - company5.price; break;
case 6: money = money - company6.price; break;
}
Stocks[CompanyNumber + 1]++;
}
}
public void onPressSell(int CompanyNumber)
{
int UCompanyNumber = CompanyNumber + 1;
if (Stocks[CompanyNumber + 1] >= 1)
{
Stocks[CompanyNumber + 1]--;
switch (UCompanyNumber)
{
case 1: money = money + company1.price; break;
case 2: money = money + company2.price; break;
case 3: money = money + company3.price; break;
case 4: money = money + company4.price; break;
case 5: money = money + company5.price; break;
case 6: money = money + company6.price; break;
}
}
}
public void OnPressForwardTime()
{
view.RPC("VoteForwardTime", RpcTarget.MasterClient, PhotonNetwork.LocalPlayer);
}
[PunRPC]
public void FowardTime()
{
forwardVotes = 0;
playersVoted.Clear();
if (PhotonNetwork.IsMasterClient)
{
if (days == 1)
{
foreach (Company company in CompanysInUse)
{
int increaseAmount = UnityEngine.Random.Range(0, 5);
company.price += increaseAmount;
}
}
else
{
foreach (Company company in CompanysInUse)
{
if (!company.bankrupt)
{
int increaseAmount = UnityEngine.Random.Range(-10, 10);
company.price += increaseAmount;
company.bankrupt = company.price <= 0;
if (company.bankrupt)
{
company.price = 0;
}
}
}
}
company1 = CompanysInUse[0];
company2 = CompanysInUse[1];
company3 = CompanysInUse[2];
company4 = CompanysInUse[3];
company5 = CompanysInUse[4];
company6 = CompanysInUse[5];
view.RPC("SetCompanysClient", RpcTarget.All, company1, company2, company3, company4, company5, company6);
}
days++;
if (days == maxDays)
{
lastDay = true;
}
if (days > maxDays)
{
gameOver = true;
}
}
[PunRPC]
public void SetCompanysClient(Company company1, Company company2, Company company3, Company company4, Company company5, Company company6)
{
this.company1 = company1;
this.company2 = company2;
this.company3 = company3;
this.company4 = company4;
this.company5 = company5;
this.company6 = company6;
ctext1.text = company1.name;
ctext2.text = company2.name;
ctext3.text = company3.name;
ctext4.text = company4.name;
ctext5.text = company5.name;
ctext6.text = company6.name;
cdtext1.text = company1.description;
cdtext2.text = company2.description;
cdtext3.text = company3.description;
cdtext4.text = company4.description;
cdtext5.text = company5.description;
cdtext6.text = company6.description;
}
[PunRPC]
public void VoteForwardTime(Player player)
{
if (playersVoted.Contains(player))
{
forwardVotes--;
playersVoted.Remove(player);
return;
}
forwardVotes++;
playersVoted.Add(player);
view.RPC("sentVotes", RpcTarget.All, forwardVotes);
}
[PunRPC]
public void SendScore(Player player, int score)
{
PlayerScore playerscore = new PlayerScore(score, player);
playersScores.Add(playerscore);
}
[PunRPC]
public void Gameover(PlayerScore[] scores)
{
playersScores = scores.ToList();
StringBuilder leaderboardStringBuilder = new StringBuilder();
int postion = 1;
foreach (PlayerScore score in playersScores)
{
leaderboardStringBuilder.Append(postion + ": " + score.player.NickName + ": " + score.score + "\n");
postion++;
}
leaderboardtext.text = leaderboardStringBuilder.ToString();
MoneyIndcater.gameObject.SetActive(false);
TimeIndcater.gameObject.SetActive(false);
voteText.gameObject.SetActive(false);
fowardTimeButton.SetActive(false);
Main.SetActive(false);
c1.SetActive(false);
c2.SetActive(false);
c3.SetActive(false);
c4.SetActive(false);
c5.SetActive(false);
c6.SetActive(false);
leaderboard.SetActive(true);
}
[PunRPC]
public void sentVotes(int fowardVotes)
{
forwardVotes = fowardVotes;
}
public void OnClickBack()
{
PhotonNetwork.LeaveRoom();
SceneManager.LoadScene("Lobby");
}
public void Back()
{
c1.SetActive(false);
c2.SetActive(false);
c3.SetActive(false);
c4.SetActive(false);
c5.SetActive(false);
c6.SetActive(false);
Main.SetActive(true);
}
public void swapToC1()
{
Main.SetActive(false);
c1.SetActive(true);
}
public void swapToC2()
{
Main.SetActive(false);
c2.SetActive(true);
}
public void swapToC3()
{
Main.SetActive(false);
c3.SetActive(true);
}
public void swapToC4()
{
Main.SetActive(false);
c4.SetActive(true);
}
public void swapToC5()
{
Main.SetActive(false);
c5.SetActive(true);
}
public void swapToC6()
{
Main.SetActive(false);
c6.SetActive(true);
}
}
第360行是:
leaderboardStringBuilder.Append(postion + ": " + score.player.NickName + ": " + score.score + "\n");
在游戏结束rpc中我无法理解这个错误以及为什么它会由这一行引起,当游戏结束并调用游戏结束rpc时会触发此错误
除了试图破译这里的错误是playerScore类之外,我还没有尝试过任何其他方法:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Realtime;
using UnityEngine.SocialPlatforms.Impl;
using Photon.Pun;
using System.Security.Cryptography;
public class PlayerScore : IPunObservable
{
public int score;
public Player player;
public PlayerScore(int score, Player player)
{
this.score = score;
this.player = player;
}
public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
if (stream.IsWriting)
{
stream.SendNext(player.ActorNumber);
stream.SendNext(score);
}
else if (stream.IsReading)
{
player = PhotonNetwork.CurrentRoom.GetPlayer((int)stream.ReceiveNext());
score = (int)stream.ReceiveNext();
}
}
public static byte[] Serialize(object customType)
{
PlayerScore playerScore = (PlayerScore)customType;
return new byte[] { (byte)playerScore.player.ActorNumber, (byte)playerScore.score };
}
public static object Deserialize(byte[] data)
{
return new PlayerScore(data[0], PhotonNetwork.CurrentRoom.GetPlayer(data[1]));
}
}
public class PlayerScoreComparer : IComparer<PlayerScore>
{
public int Compare(PlayerScore x, PlayerScore y)
{
return x.score.CompareTo(y.score);
}
}
我发现你需要用字符串替换玩家来保存昵称谢谢大家的帮助