Страница 1 из 1

FindWithTag

СообщениеДобавлено: 24 фев 2017, 21:51
lokenpoken
Здравствуйте. Скрипт для бота-хищника, который гоняется за ботом-добычей. У ботов-добычи тэг 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);
}
}
}

Re: FindWithTag

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

Попробуйте сначала узнать - если ли объект, а потом уже вытащить из него трансформ.

Re: FindWithTag

СообщениеДобавлено: 24 фев 2017, 22:40
seaman
Вообще то ошибка тут еще и в другом.
Нужно == иначе if не будет работать. Ему же bool нужен
Или if нужно убрать

Re: FindWithTag

СообщениеДобавлено: 24 фев 2017, 23:12
Anonymyx
Вообще то ошибка тут еще и в другом.
Нужно == иначе if не будет работать. Ему же bool нужен
Или if нужно убрать

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

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

Re: FindWithTag

СообщениеДобавлено: 25 фев 2017, 00:21
lokenpoken
Попробовал, то что вы писали, но по прежнему не работает.


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);
}
}
}
}

Re: FindWithTag

СообщениеДобавлено: 25 фев 2017, 15:05
samana
lokenpoken писал(а):Попробовал, то что вы писали, но по прежнему не работает.
if (GameObject.FindWithTag("Player").gameObject != null)


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

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

}

Re: FindWithTag

СообщениеДобавлено: 25 фев 2017, 15:37
lokenpoken
Спасибо за помощь, все работает.

Re: FindWithTag

СообщениеДобавлено: 25 фев 2017, 21:42
ilkalawson
Anonymyx писал(а):
Вообще то ошибка тут еще и в другом.
Нужно == иначе if не будет работать. Ему же bool нужен
Или if нужно убрать

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

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

Не на null а все таки на bool там проверяется через implicit operator который возвращает bool. И коолайдер вы также проверяете, возвращая bool.