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

Unity3d odwołanie do skryptu


Rekomendowane odpowiedzi

Opublikowano

Robiłem sobie menu do gry i chciałem zrobić opcje w oddzielnym skrypcie żeby to jakoś było poukładane. Skrypt menu wygląda tak: 


 

using UnityEngine;
using System.Collections;




public class Mainmenu : MonoBehaviour
{


public Texture2D LogoGame;
[HideInInspector]
public int PageState = 0;
public string SceneStart = "sandbox";
[HideInInspector]
public GameManager gameManage;
[HideInInspector]
public OptionsMenu optionsMenu;
[HideInInspector]
public CharacterCreator characterCreate;
public GUISkin skin;
private float delta;
private int pageTemp;




void Start ()
{
delta = 1; 




optionsMenu = (OptionsMenu)GameObject.FindObjectOfType (typeof(OptionsMenu));


}




void OnGUI ()
{
Screen.lockCursor = false;


if (skin)
GUI.skin = skin;


GUI.skin.button.fontSize = 17;
GUI.skin.label.alignment = TextAnchor.MiddleCenter;






switch (PageState) {


case 0:
if (GUI.Button (new Rect (Screen.width / 2 - 130, Screen.height / 2 - 40 + (-100 * delta), 260, 50), "Single")) {
if (gameManage) {
gameManage.OfflineMode = true;
characterCreate.OpenCharacter ();
}


PageState = 8;
}
if (GUI.Button (new Rect (Screen.width / 2 - 130, Screen.height / 2 + 20 + (-100 * delta), 260, 50), "Multi")) {
if (gameManage)
gameManage.OfflineMode = false;


PageState = 2;
}
if (GUI.Button (new Rect (Screen.width / 2 - 130, Screen.height / 2 + 80 + (-100 * delta), 260, 50), "Opcje")) {
if (optionsMenu)
optionsMenu.OnGui ();




}
if (GUI.Button (new Rect (Screen.width / 2 - 130, Screen.height / 2 + 140 + (-100 * delta), 260, 50), "Wyjscie")) {
Application.Quit ();
}


GUI.DrawTexture (new Rect (Screen.width / 2 - (LogoGame.width * 0.5f) / 2, Screen.height / 2 - 200 + (-300 * delta), LogoGame.width * 0.5f, LogoGame.height * 0.5f), LogoGame); 


break;






}


GUI.skin.label.fontSize = 14;
GUI.skin.label.alignment = TextAnchor.MiddleCenter;
GUI.skin.label.normal.textColor = Color.white;
GUI.Label (new Rect (0, Screen.height - 50, Screen.width, 30), "BoxGame | DarHor Beta Project");


}




}

 

 

 

 

Oczywiście pousuwałem to co jest niepotrzebne

Problem polega na tym że nic się nie dzieje po kliknięciu przycisku "opcje"

A gdy usunę "if (optionsMenu)" wtedy mi wywala błąd

 

NullReferenceException: Object reference not set to an instance of an object
Mainmenu.OnGUI () (at Assets/Scripts/Game/Mainmenu.cs:102)

I jeszcze kod pliku OptionsMenu.cs

 

using UnityEngine;
using System.Collections;

public class OptionsMenu : MonoBehaviour {

	private float delta;
	public GUISkin skin;
	private int pageTemp;
	public int PageState = 0;


	// Use this for initialization
	void Start () {

	}
	


	public void OnGui()
	{
		Screen.lockCursor = false;
		
		if (skin)
			GUI.skin = skin;
		
		GUI.skin.button.fontSize = 17;
		GUI.skin.label.alignment = TextAnchor.MiddleCenter;

		if (GUI.Button (new Rect (Screen.width / 2 - 130, Screen.height / 2 - 40 + (-100 * delta), 260, 50), "Grafika")) {
			Application.Quit ();
		}
		if (GUI.Button (new Rect (Screen.width / 2 - 130, Screen.height / 2 + 20 + (-100 * delta), 260, 50), "Audio")) {
			Application.Quit ();
		}
		if (GUI.Button (new Rect (Screen.width / 2 - 130, Screen.height / 2 + 80 + (-100 * delta), 260, 50), "Grafika")) {
			Application.Quit ();
		}




		GUI.skin.label.fontSize = 14;
		GUI.skin.label.alignment = TextAnchor.MiddleCenter;
		GUI.skin.label.normal.textColor = Color.white;


	}
}

 

 

 

Wie ktoś dlaczego tak wywala mi ten błąd? 

Opublikowano

Aż wróciłem i sprawdziłem date postu :O Serio ktoś jeszcze używa starego UI? Nie wiem czy wiesz ale wyszło nowe NGUI i działa dużo szybciej i jest dużo bardziej wygodne. Co do błędu. Definitywnie nie może odnaleźć obiektu typu OptionsMenu, przez co gdy zostawiasz to if(optionsMenu) nic się nie dzieje bo optionsMenu nie ma przypisane wartości, a jak usuwasz tą linijke czyli zabezpieczenie przed wywoływaniem nie przypisanego do niczego obiektu to Unit wyrzuca błąd NullReferenceException. Szczerze nie widze błędu. Możesz spróbować zrobić tak i zobaczyć co z tego wyjdzie:

if (optionsMenu){
optionsMenu.OnGui ();}
else{
optionsMenu = (OptionsMenu)GameObject.FindObjectOfType (typeof(OptionsMenu));

//LUB

GameObject temp = GameObject.Find("nazwa obiektu z podpietym skryptem OptionsMenu);

optionsMenu =  temp.GetComponent<OptionsMenu>();

optionsMenu.OnGui ();
}

Musiałbym zobaczyć cały projekt Unity, podpięte skrypty i kolejność ułożenia obiektów, nawet na screenie by wystarczyło to może bym coś więcej powiedział. Taka mała rada, może i w grach na pc to mało kogo obchodzi ale ładowanie tego typu rzeczy do Start() nie jest dobry pomysłem jeżeli jest ich dużo. Znacznie zwiększa to czas ładowania aplikacji.

http://www.tworzymygry.pl - Kursy tworzenia gier w Unity3D.

Opublikowano

Aż wróciłem i sprawdziłem date postu :O Serio ktoś jeszcze używa starego UI? Nie wiem czy wiesz ale wyszło nowe NGUI i działa dużo szybciej i jest dużo bardziej wygodne. Co do błędu. Definitywnie nie może odnaleźć obiektu typu OptionsMenu, przez co gdy zostawiasz to if(optionsMenu) nic się nie dzieje bo optionsMenu nie ma przypisane wartości, a jak usuwasz tą linijke czyli zabezpieczenie przed wywoływaniem nie przypisanego do niczego obiektu to Unit wyrzuca błąd NullReferenceException. Szczerze nie widze błędu. Możesz spróbować zrobić tak i zobaczyć co z tego wyjdzie:

if (optionsMenu){
optionsMenu.OnGui ();}
else{
optionsMenu = (OptionsMenu)GameObject.FindObjectOfType (typeof(OptionsMenu));

//LUB

GameObject temp = GameObject.Find("nazwa obiektu z podpietym skryptem OptionsMenu);

optionsMenu =  temp.GetComponent<OptionsMenu>();

optionsMenu.OnGui ();
}

Musiałbym zobaczyć cały projekt Unity, podpięte skrypty i kolejność ułożenia obiektów, nawet na screenie by wystarczyło to może bym coś więcej powiedział. Taka mała rada, może i w grach na pc to mało kogo obchodzi ale ładowanie tego typu rzeczy do Start() nie jest dobry pomysłem jeżeli jest ich dużo. Znacznie zwiększa to czas ładowania aplikacji.

Powiem Ci że to nic nie dało. Ale dzięki za chęć udzielenia pomocy  :D  Najlepsze jest to że takie odwołanie do innych skryptów działa, tylko z tym jednym mam problem 

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...