• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Unity 5 - problem z referencja?

Object Storage Arubacloud
+1 głos
385 wizyt
pytanie zadane 24 czerwca 2015 w C# przez BlupiSpidi Użytkownik (960 p.)

Witam

Tworze w Unity pierwsza grę, w dużej mierze opartą na poradnikach z ich strony.Tworząc system ataku na gracza natrafiłem na probłem, z którym sam sobie nie potrafię poradzić.

Otóż, gdy przeciwnik próbuje zaatakować gracza występuję błąd opisany nastepującymi słowami: Object reference not set to an instance of an object GhostAI.Attack()

Kod wygląda następująco:

using UnityEngine;
using System.Collections;

public class PlayerHealth : MonoBehaviour {

	public int baseHealth;
	public int currentHealth;
	public bool damaged;

	void Awake () {
		currentHealth = baseHealth;
	}
	
	void Update () {
	}

	void Death() {
		Debug.Log("Player is dead.");
	}

	public void TakingDamage(int damage) {
		currentHealth -= damage;
		if (currentHealth <=0)
			Death();
	}
}

Druga klasa opisująca zachowanie przeciwnika:

using UnityEngine;
using System.Collections;

public class GhostAI : MonoBehaviour {

	public int baseHealth;
	public int currentHealth;
	public int attackDamage;
	public bool playerInRange;
	public float timer;

	GameObject player;                          
	PlayerHealth playerHealth;                  
	


	void Awake() {
		currentHealth = baseHealth;
		player = GameObject.FindGameObjectWithTag ("Player");
		playerHealth = player.GetComponent <PlayerHealth> ();
	}
	
	void Update () {

		timer +=Time.deltaTime;
		if (playerInRange)
		{
			Attack();
		}
	}

	void OnTriggerEnter2D(Collider2D other)
	{
		if (other.CompareTag("Player")){
			playerInRange = true;
		}
	}

	void OnTriggerExit2D(Collider2D other)
	{
		if (other.CompareTag("Player")){
			playerInRange = false;
		}
	}

	void Attack()
	{
		timer = 0f;
		if (playerHealth.currentHealth >0)
		{
			playerHealth.TakingDamage(attackDamage);
		}
	}
}

Jeżeli ktoś miałby jakiś pomysł, to proszę o odpowiedź. Z góry dziękuję.

2 odpowiedzi

+2 głosów
odpowiedź 24 czerwca 2015 przez Strategiusz Dyskutant (9,220 p.)
wybrane 24 czerwca 2015 przez BlupiSpidi
 
Najlepsza
Dobra, to może coś oczywistego. Na pewno otagowałeś obiekt jako "Player"?

Edit: Chyba jednak nie, bo błąd wskazałby na Awake() a nie Attack(). Nie umiem odtworzyć tego błędu. Po prostu "u mnie działa".
komentarz 24 czerwca 2015 przez BlupiSpidi Użytkownik (960 p.)
Dobrze, że o tym wspomniałeś. Sprawdziłem i rzeczywiście obiekt był otagowany jako Player ale jedno z jego dzieci również i własnie to powodowało komplikację. Czasami rzeczywiście lepiej sprawdzić banały :)

Dziękuje Ci za odpowiedź, wreście będę mógł ruszyć dalej.
0 głosów
odpowiedź 24 czerwca 2015 przez Strategiusz Dyskutant (9,220 p.)

Zobacz czy pomoże przeniesienie dwóch linii z drugiego skryptu czyli:

player = GameObject.FindGameObjectWithTag ("Player");
playerHealth = player.GetComponent <PlayerHealth> ();

z Awake() do Start().

komentarz 24 czerwca 2015 przez BlupiSpidi Użytkownik (960 p.)
Niestety nie, problem dalej wystepuje.

Podobne pytania

0 głosów
0 odpowiedzi 143 wizyt
pytanie zadane 24 października 2018 w C# przez koyoo Początkujący (340 p.)
0 głosów
1 odpowiedź 307 wizyt
pytanie zadane 18 czerwca 2020 w C# przez ZIXOZIZ Nowicjusz (220 p.)
0 głosów
2 odpowiedzi 295 wizyt
pytanie zadane 18 grudnia 2016 w C# przez mo290103 Obywatel (1,860 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...