FindWithTag

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

FindWithTag

Сообщение lokenpoken 24 фев 2017, 21:51

Здравствуйте. Скрипт для бота-хищника, который гоняется за ботом-добычей. У ботов-добычи тэг Player. Когда все боты-добыча убиты боты-хищники должны уничтожиться, а они останавливаются и юнити выдаёт ошибку:

NullReferenceException: Object reference not set to an instance of an object
bot.Update () (at Assets/Scripts/bot.cs:27)

Скрипт:

using UnityEngine;
using System.Collections;

public class bot : MonoBehaviour
{
public float seeDistance = 5f;
public float attackDistance = 2f;
public float speed = 6;
private Transform target;
public GameObject a;

void Update()
{
if (target = GameObject.FindWithTag("Player").transform) //ругается на эту строчку
{
if (Vector3.Distance(transform.position, target.transform.position) < seeDistance)
{
if (Vector3.Distance(transform.position, target.transform.position) > attackDistance)
{
transform.LookAt(target.transform);
transform.Translate(new Vector3(0, 0, speed * Time.deltaTime));
}
}

}
else
{
Destroy(a);
}
}
}
lokenpoken
UNец
 
Сообщения: 19
Зарегистрирован: 01 фев 2017, 03:11

Re: FindWithTag

Сообщение samana 24 фев 2017, 22:03

target = GameObject.FindWithTag("Player").transform, скорее всего причина в том, что вы напрямую пытаетесь присвоить target трансформ из объекта, которого может и не существовать.
Давайте разберём последовательно:
GameObject.FindWithTag("Player") - возвращает либо объект, либо null,
допустим объекта не нашлось и вернулось null и вы пытаетесь получить трансформ из него, то-есть null.transform.

Попробуйте сначала узнать - если ли объект, а потом уже вытащить из него трансформ.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: FindWithTag

Сообщение seaman 24 фев 2017, 22:40

Вообще то ошибка тут еще и в другом.
Нужно == иначе if не будет работать. Ему же bool нужен
Или if нужно убрать
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: FindWithTag

Сообщение Anonymyx 24 фев 2017, 23:12

Вообще то ошибка тут еще и в другом.
Нужно == иначе if не будет работать. Ему же bool нужен
Или if нужно убрать

Почему не будет? Там же на null проверяется.
Для экономия строк я часто делаю подобное.
if(collider2d = Physics2D.OverlapCircle(transform.position, 3))

Автору, раз он все ровно пишет .transform, можно тип Transform заменить на GameObject.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: FindWithTag

Сообщение lokenpoken 25 фев 2017, 00:21

Попробовал, то что вы писали, но по прежнему не работает.


public class bot : MonoBehaviour
{
public float seeDistance = 5f;
public float attackDistance = 2f;
public float speed = 6;
public GameObject target;
public GameObject a;

void Update()

{
if (GameObject.FindWithTag("Player").gameObject != null)
{
target = GameObject.FindWithTag("Player").gameObject;
if (target != null)
{

if (Vector3.Distance(transform.position, target.transform.position) < seeDistance)
{
if (Vector3.Distance(transform.position, target.transform.position) > attackDistance)
{
//walk
transform.LookAt(target.transform);
transform.Translate(new Vector3(0, 0, speed * Time.deltaTime));

}
}

}
else
{
Destroy(a);
}
}
}
}
lokenpoken
UNец
 
Сообщения: 19
Зарегистрирован: 01 фев 2017, 03:11

Re: FindWithTag

Сообщение samana 25 фев 2017, 15:05

lokenpoken писал(а):Попробовал, то что вы писали, но по прежнему не работает.
if (GameObject.FindWithTag("Player").gameObject != null)


Вы делаете практически то же самое, что и с трансформом.

Я имею ввиду сделать вот так:
Синтаксис:
Используется csharp
GameoObject go = GameObject.FindWithTag("Player");
if(go != null)
{

}
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: FindWithTag

Сообщение lokenpoken 25 фев 2017, 15:37

Спасибо за помощь, все работает.
lokenpoken
UNец
 
Сообщения: 19
Зарегистрирован: 01 фев 2017, 03:11

Re: FindWithTag

Сообщение ilkalawson 25 фев 2017, 21:42

Anonymyx писал(а):
Вообще то ошибка тут еще и в другом.
Нужно == иначе if не будет работать. Ему же bool нужен
Или if нужно убрать

Почему не будет? Там же на null проверяется.
Для экономия строк я часто делаю подобное.
if(collider2d = Physics2D.OverlapCircle(transform.position, 3))

Автору, раз он все ровно пишет .transform, можно тип Transform заменить на GameObject.

Не на null а все таки на bool там проверяется через implicit operator который возвращает bool. И коолайдер вы также проверяете, возвращая bool.
ilkalawson
UNIверсал
 
Сообщения: 412
Зарегистрирован: 19 янв 2015, 20:38
Skype: lawsonunity


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18


cron