Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Unity > Общие вопросы

Общие вопросы вопросы не попадающие ни в один из доступных разделов

Ответ
 
Опции темы
Старый 10.07.2011, 17:29   #1
Fockerian
Оператор ЭВМ
 
Регистрация: 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
Lestar
Бывалый
 
Аватар для Lestar
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Fockerian (11.07.2011)
Старый 10.07.2011, 20:01   #3
Fockerian
Оператор ЭВМ
 
Регистрация: 10.07.2011
Сообщений: 30
Написано одно полезное сообщение
Ответ: Поиск ближайшего объекта по тэгу. Вопрос.

Спасибо большое за помощь и разъяснение, все работает на ура.
У меня пока колличество gos ограниченно, но в далеком будущем будет увеличиваться и уменьшаться. (враги будут респится). Чтобы это реализовать надо будет это все переписать в update?

И еще вопрос. Как сделать так чтобы команда Print обновлялась? а то скажем значение которое оно выводит ( в консоли) указывается только один раз. Грубо говоря у меня есть два объекта с именами, подъезжаю к одному имя пишется в консоли, подъезжаю ко второму пишится имя второго, возвращаясь к первому имя все также остается второго, но если я очищу консоль кнопкой "clear" то имя обновится на имя первого.
(Offline)
 
Ответить с цитированием
Старый 10.07.2011, 22:52   #4
Lestar
Бывалый
 
Аватар для Lestar
 
Регистрация: 24.05.2011
Адрес: Украина,Харьков
Сообщений: 890
Написано 359 полезных сообщений
(для 880 пользователей)
Ответ: Поиск ближайшего объекта по тэгу. Вопрос.

Сообщение от Fockerian Посмотреть сообщение
Чтобы это реализовать надо будет это все переписать в update?
Да,после каждого дестроя обьекта или его инстанса нужно будет очищать массив и искать все обьекты с тегом заново,но единоразово.То есть запускать например корутину,которая будет отвечать за очистку массива и его заполнение.Ну и в случае с непостоянным размером коллекции,использовать List<>,а не массив.
Сообщение от Fockerian Посмотреть сообщение
И еще вопрос. Как сделать так чтобы команда Print обновлялась? а то скажем значение которое оно выводит ( в консоли) указывается только один раз. Грубо говоря у меня есть два объекта с именами, подъезжаю к одному имя пишется в консоли, подъезжаю ко второму пишится имя второго, возвращаясь к первому имя все также остается второго, но если я очищу консоль кнопкой "clear" то имя обновится на имя первого.
Кнопка Collapse в консоли отвечает за отображение повторяющихся сообщений ,выводите через Debug.Log().
__________________
Нам суждено построить мосты и храмы,которых никогда не существовало и не могло существовать в природе.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Fockerian (11.07.2011)
Старый 11.07.2011, 13:38   #5
Fockerian
Оператор ЭВМ
 
Регистрация: 10.07.2011
Сообщений: 30
Написано одно полезное сообщение
Ответ: Поиск ближайшего объекта по тэгу. Вопрос.

Спасибо большое, вы мне очень помогли.
У меня созрел один вопрос давным давно, но найти ответа так до сих пор и не смог. Есть два значения, нужно чтобы одно значение переросло в другое.
Х=Х+10 или -10 не идет, по скольку у меня эти значение углы поворота башни, если так прописать то будет проскакиваться нужный угол, и башня будет поворачиватсья в обратку. Начнет дергаться. Если задать условие в котором будет сказано, если угол до цели меньше 5 градусов то угол башни равен углу цели то при поворое башни к цели она тоже дерганется и встанет как нужно, да и строк слишком много в скрипте, а как я понял надо экономить на всем. В общем есть же какаято команда которая с заданым шагом приращает значение из одного в другое независимо от того больше значение или меньше?
(Offline)
 
Ответить с цитированием
Старый 11.07.2011, 21:25   #6
Fockerian
Оператор ЭВМ
 
Регистрация: 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)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 20:23.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com