Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Problem ze skryptem unity3d


Rekomendowane odpowiedzi

Opublikowano

Witam mam problem ze skryptem, w unity wyskakuje mi taki błąd:



Assets/skrypty/Core.cs(179,29): error CS0120: An object reference is required to access non-static member `UnityEngine.NetworkView.RPC(string, UnityEngine.RPCMode, params object[])'
 

 

 

 

 

cały kod na 179 linijce:
 

	void OnConnectedToServer()
	{

	 	NetworkView.RPC("MessageV", RPCMode.All, sm.playerDataBase.Nick, " dolaczyl do serwera!");

		Network.Instantiate(gracz, 
		                    new Vector3(0,0,0), 
		                    new Quaternion(0,0,0,0)
		                    ,0);

		ClearMenu();
	}

Wie ktoś może co źle zapisałem ?

 

 

 

cały kod:

 


using UnityEngine;
using System.Collections;

public class Core : MonoBehaviour {


	public string Ip = "127.0.0.1";

	public int Port = 25565;

	public bool Menu = false;

	public bool Connect = false;

	public bool CreateSerwer = false;
	
	public GUISkin skin;

	public string Message;

	public float TimeDisplayMessage = 5f;

	float timer;

	public SManager sm;

	public GameObject gracz;
	

	void Awake()
	{
		sm = GameObject.FindGameObjectWithTag("Manager").GetComponent<SManager>();
	}

	void OnGUI()
	{
		GUI.skin = skin;

		if(Menu)
			GUI.Window(0, 
			           new Rect(Screen.width / 2 - 150, Screen.height / 2, 300,300),
			           GlowneMenu , 
			           "Menu");

		if(CreateSerwer)
			GUI.Window(0, 
			           new Rect(Screen.width / 2 - 150, Screen.height / 2, 300,300),
			           GlowneMenuCreateSerwer , 
			           "Menu");

		if(Connect)
			GUI.Window(0, 
			           new Rect(Screen.width / 2 - 150, Screen.height / 2, 300,300),
			           GlowneMenuConnect , 
			           "Menu");


		if(Message != "")
		{
			GUI.Window(1, 
			           new Rect(Screen.width / 2 - 150, 75, 300,150),
			          Msg , 
			           "Serwer Msg");

			timer += Time.deltaTime;
			if(timer > (TimeDisplayMessage * 2))
			{
				timer = 0;
				Message = "";
			}
		}

	}

	void GlowneMenu(int id)
	{
		if(GUILayout.Button("Dolacz do serwera"))
		{
			ClearMenu();

			Connect = true;
		}
		if(GUILayout.Button("Stworz Serwer"))
		{
			ClearMenu();

			CreateSerwer = true;
		}
		if(GUILayout.Button("Wylacz"))
		{
			Application.Quit();
		}
	}

	void GlowneMenuConnect(int id)
	{
		GUILayout.Label("IP: ");
		
		GUILayout.Space(10);
		
		Ip = GUILayout.TextField(Ip);
		
		GUILayout.Space(10);
		
		GUILayout.Label("Port: ");
		
		GUILayout.Space(10);
		
		Port = int.Parse(GUILayout.TextField(Port.ToString()));

		GUILayout.Space(10);
		
		GUILayout.Label("Nick: ");
		
		GUILayout.Space(10);
		
		sm.playerDataBase.Nick = GUILayout.TextField(sm.playerDataBase.Nick);
		
		GUILayout.Space(10);
		
		if(GUILayout.Button("Dolacz"))
		{
			Dolacz(Ip, Port);

			PlayerPrefs.SetString("Nick", 
			                      sm.playerDataBase.Nick);
		}
		if(GUILayout.Button("Cofnij"))
		{
			ClearMenu();
			
			Menu = true;
		}
	}


	void GlowneMenuCreateSerwer(int id)
	{
		GUILayout.Label("Port: ");
		
		GUILayout.Space(10);
		
		Port = int.Parse(GUILayout.TextField(Port.ToString()));
		
		GUILayout.Space(150);

		sm.playerDataBase.Nick = "serwer";

		if(GUILayout.Button("Stworz Serwer"))
		{
			StworzSerwer(Port);
		}
		if(GUILayout.Button("Cofnij"))
		{
			ClearMenu();

			Menu = true;
		}
	}


	public void ClearMenu()
	{
		Menu = false;

		Connect = false;

		CreateSerwer = false;
	}

	void Msg(int id)
	{
		GUILayout.Label(Message);
	}

	void OnConnectedToServer()
	{

	 	NetworkView.RPC("MessageV", RPCMode.All, sm.playerDataBase.Nick, " dolaczyl do serwera!");

		Network.Instantiate(gracz, 
		                    new Vector3(0,0,0), 
		                    new Quaternion(0,0,0,0)
		                    ,0);

		ClearMenu();
	}


	void Dolacz(string ip, int port)
	{
		Network.Connect(ip, port);
	}

	void OnPlayerDisconnected(NetworkPlayer player) {

		Network.RemoveRPCs(player);

		Network.DestroyPlayerObjects(player);

	}

	void OnDisconnectedFromServer(NetworkDisconnection info) {
		if (Network.isServer)
		{
			Message = "Pomyslnie wylaczono serwer!";

			ClearMenu();
			
			Menu = true;
		}
		else
		{
			if (info == NetworkDisconnection.LostConnection)
			{
				Message = "Stracono polaczenie z serwerem!";

				ClearMenu();
				
				Menu = true;
			}
			else
			{
				Message = "Pomsylnie Rozplaczono z serwerem!";

				ClearMenu();
				
				Menu = true;
			}	
		}
	}

	void StworzSerwer(int port)
	{
		Network.InitializeServer(8, port, !Network.HavePublicAddress());
	}

	void OnServerInitialized() {
		Message = "Serwer zostal pomyslnie zaladowany.";
	}
		

	[RPC]
	void MessageV(string msg)
	{
		Message = msg;
	}

}

 

 

784091427630431250239.png
:D

Opublikowano

Metoda RPC klasy NetworkView nie jest metodą statyczną(jak np. większość metod klasy Input czy innych) - potrzebujesz jakiegoś obiektu klasy NetworkView i to na tym obiekcie musisz wywołać RPC.

A zresztą każdy obiekt z dołączonym NetworkView'em daje w skryptach dostęp do obiektu klasy NetworkView o nazwie networkView, więc jeśli chcesz użyć tego z obecnego GameObject'a to wywołaj RPC na networkView a nie na NetworkView.

Opublikowano

Zabawne jest to że to działało na wcześniejszej wersji unity3D. 

@Fireho jak ty to widzisz? szczerze pisałem to na poradnikach kiedyś i próbowałem przenieś stary projekt na nowe unity i mam ten błąd. 

784091427630431250239.png
:D

Opublikowano

Zabawne jest to że to działało na wcześniejszej wersji unity3D. 

@Fireho jak ty to widzisz? szczerze pisałem to na poradnikach kiedyś i próbowałem przenieś stary projekt na nowe unity i mam ten błąd. 

Czytam treść błędu... W dość luźnym tłumaczeniu:

 Potrzebny jest obiekt aby wywołać niestatyczną metodę "UnityEngine.NetworkView.RPC(string, UnityEngine.RPCMode, params object[])"

albo dosłownie:

Potrzebne jest odwołanie do obiektu aby uzyskać dostęp do niestatycznej składowej "UnityEngine.NetworkView.RPC(string, UnityEngine.RPCMode, params object[])"

 

public SManager sm;

zmien na:

public static SManager sm;

Nie żeby coś, ale ten post wygląda jakbyś wybrał losową linijkę i wstawił losowe słowo kluczowe.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...