|
Общие вопросы вопросы не попадающие ни в один из доступных разделов |
10.07.2011, 17:29
|
#1
|
Оператор ЭВМ
Регистрация: 10.07.2011
Сообщений: 30
Написано одно полезное сообщение
|
Поиск ближайшего объекта по тэгу. Вопрос.
Нужна помощь.
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
GameObject FindClosestEnemy() {
GameObject[] gos;
gos = GameObject.FindGameObjectsWithTag("Enemy");
GameObject closest;
float distance = Mathf.Infinity;
Vector3 position = transform.position;
foreach (GameObject go in gos) {
Vector3 diff = go.transform.position - position;
float curDistance = diff.sqrMagnitude;
if (curDistance < distance) {
closest = go;
distance = curDistance;
}
}
return closest;
}
void Awake() {
print(FindClosestEnemy().name);
}
}
Вот есть несколько объектов с тэгов врага, необходимо найти из этих объектов самый ближайший. На юнити.ком нашел в скриптах пример который помойму мне и нужен ( он как раз выше ) , но загрузив его себе юнитти стала ругаться. Ругается на return closest; ... Вот я не могу исправить и понять почему ругается. Если выносить GameObject closest за пределы GameObject FindClosestEnemy() { ...} юнити не ругается но опять же найдя единственный близкий больше не чего не ищет, как бы близко я не перемещался к другим объектам с тэгом враг. Как подлатать скрипт?
|
(Offline)
|
|
10.07.2011, 18:21
|
#2
|
Бывалый
Регистрация: 24.05.2011
Адрес: Украина,Харьков
Сообщений: 890
Написано 359 полезных сообщений (для 880 пользователей)
|
Ответ: Поиск ближайшего объекта по тэгу. Вопрос.
Скопируйте ошибку из консоли и покажите в коде,как вы применяете метод FindClosestEnemy.Чтобы искал постоянно ближайший,нужно в Update искать.И по хорошим делам переписать,чтобы в Update не искать обьекты по тэгу.
Например так
using UnityEngine; using System.Collections;
public class example : MonoBehaviour { GameObject[] gos; GameObject closest;
void Start() { gos = GameObject.FindGameObjectsWithTag("Enemy"); }
GameObject FindClosestEnemy() { float distance = Mathf.Infinity; Vector3 position = transform.position; foreach (GameObject go in gos) { Vector3 diff = go.transform.position - position; float curDistance = diff.sqrMagnitude; if (curDistance < distance) { closest = go; distance = curDistance; } } return closest; } void Update() { print(FindClosestEnemy().name); } }
Мой пример подходит,если у вас количество элеметнов массива gos неизменно.Вывод print в каждом фрейме существенно садит fps.Будте к этому готовы.
P.S. Ну и в добавок я предпочитаю использовать вместо
Vector3 diff = go.transform.position - position; float curDistance = diff.sqrMagnitude;
в таком виде
float curDistance=Vector3.Distance(go.transform.position,position)
__________________
Нам суждено построить мосты и храмы,которых никогда не существовало и не могло существовать в природе.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
10.07.2011, 20:01
|
#3
|
Оператор ЭВМ
Регистрация: 10.07.2011
Сообщений: 30
Написано одно полезное сообщение
|
Ответ: Поиск ближайшего объекта по тэгу. Вопрос.
Спасибо большое за помощь и разъяснение, все работает на ура.
У меня пока колличество gos ограниченно, но в далеком будущем будет увеличиваться и уменьшаться. (враги будут респится). Чтобы это реализовать надо будет это все переписать в update?
И еще вопрос. Как сделать так чтобы команда Print обновлялась? а то скажем значение которое оно выводит ( в консоли) указывается только один раз. Грубо говоря у меня есть два объекта с именами, подъезжаю к одному имя пишется в консоли, подъезжаю ко второму пишится имя второго, возвращаясь к первому имя все также остается второго, но если я очищу консоль кнопкой "clear" то имя обновится на имя первого.
|
(Offline)
|
|
10.07.2011, 22:52
|
#4
|
Бывалый
Регистрация: 24.05.2011
Адрес: Украина,Харьков
Сообщений: 890
Написано 359 полезных сообщений (для 880 пользователей)
|
Ответ: Поиск ближайшего объекта по тэгу. Вопрос.
Сообщение от Fockerian
Чтобы это реализовать надо будет это все переписать в update?
|
Да,после каждого дестроя обьекта или его инстанса нужно будет очищать массив и искать все обьекты с тегом заново,но единоразово.То есть запускать например корутину,которая будет отвечать за очистку массива и его заполнение.Ну и в случае с непостоянным размером коллекции,использовать List<>,а не массив.
Сообщение от Fockerian
И еще вопрос. Как сделать так чтобы команда Print обновлялась? а то скажем значение которое оно выводит ( в консоли) указывается только один раз. Грубо говоря у меня есть два объекта с именами, подъезжаю к одному имя пишется в консоли, подъезжаю ко второму пишится имя второго, возвращаясь к первому имя все также остается второго, но если я очищу консоль кнопкой "clear" то имя обновится на имя первого.
|
Кнопка Collapse в консоли отвечает за отображение повторяющихся сообщений ,выводите через Debug.Log().
__________________
Нам суждено построить мосты и храмы,которых никогда не существовало и не могло существовать в природе.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
11.07.2011, 13:38
|
#5
|
Оператор ЭВМ
Регистрация: 10.07.2011
Сообщений: 30
Написано одно полезное сообщение
|
Ответ: Поиск ближайшего объекта по тэгу. Вопрос.
Спасибо большое, вы мне очень помогли.
У меня созрел один вопрос давным давно, но найти ответа так до сих пор и не смог. Есть два значения, нужно чтобы одно значение переросло в другое.
Х=Х+10 или -10 не идет, по скольку у меня эти значение углы поворота башни, если так прописать то будет проскакиваться нужный угол, и башня будет поворачиватсья в обратку. Начнет дергаться. Если задать условие в котором будет сказано, если угол до цели меньше 5 градусов то угол башни равен углу цели то при поворое башни к цели она тоже дерганется и встанет как нужно, да и строк слишком много в скрипте, а как я понял надо экономить на всем. В общем есть же какаято команда которая с заданым шагом приращает значение из одного в другое независимо от того больше значение или меньше?
|
(Offline)
|
|
11.07.2011, 21:25
|
#6
|
Оператор ЭВМ
Регистрация: 10.07.2011
Сообщений: 30
Написано одно полезное сообщение
|
Ответ: Поиск ближайшего объекта по тэгу. Вопрос.
Вопрос с поворотом башни решил через :
transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation(direction), rotationSpeed * Time.deltaTime);
transform.eulerAngles = new Vector3(0, transform.eulerAngles.y, 0);
вопрос собственно говоря снят.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:11.
|