Страница 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.