2016-02-22 2 views
1

По какой-то причине я не могу изменить название игрового объекта (аватара), но мне нужно иметь 2 разных версии и активировать их в коде.Активация неактивных одноименных объектов с разными тегами

Таким образом, дублируя аватар не вариант, но мне еще нужно, чтобы создать идентичный и внести изменения в режиме редактирования, так что на основе состояния, выбран ли один или другой.

Мне пришло в голову, теперь, что изменение названия не представляется возможным, возможно, я могу дать другой другой тег и активировать правильный на основе выбранного сценария.

Итак, я проверил несколько ручных документы и некоторые сообщения на форуме и придумал следующие 3 альтернативы место в моем Start() но никто не работает:

void Start() 
{ 
    if (GameObject.FindGameObjectWithTag("John")) 
     gameObject.FindGameObjectWithTag("John").SetActive(true); 

    if (GameObject.FindWithTag("John")) 
     gameObject.FindWithTag("John").SetActive(true); 
} 

Может кто-то пожалуйста, помогите мне понять, что я делаю неправильно и как я могу добиться этого: найти объект, который не является активным (из числа 2 неактивных объектов с тем же именем, но различные теги: один untagged и другой помеченных как, скажем, John)

+1

*** ПРИМЕЧАНИЕ *** - одна строка вашего кода была очень запутанной, так как она ссылалась на «этот» игровой объект. Я отредактировал его, чтобы избежать конфузии. – Fattie

ответ

3

Не может быть проще, просто назначить их различных переменных

public GameObject johnCharacterOnLeft; 
public GameObject johnCharacterWhoJoinsLater; 

void Start() 
    { 
    johnCharacterOnLeft.SetActive(true); 
    johnCharacterOnLeft.Whatever(true); 
    johnCharacterOnLeft.Whatever(true); 
    johnCharacterOnLeft.Whatever(true); 
    johnCharacterWhoJoinsLater.SetActive(false); 
    johnCharacterWhoJoinsLater.Whatever(false); 
    johnCharacterWhoJoinsLater.Whatever(false); 
    ... 
    } 

Обратите внимание, что, как правило, когда вы изучаете, не использования Find. Это так просто. Используйте общедоступные переменные и перетащите, чтобы подключиться к инспектору.

enter image description here

(Если кто-то читает еще не знает, как перетащить для подключения в инспекторе, проверить любой основной tutorial.)


Если вы хотите, чтобы найти все объекты с определенный тег:

GameObject[] allCats; 
allCats = GameObject.FindGameObjectsWithTag("cat"); 
foreach (GameObject g in allCats) 
Debug.Log("I found one, name is: " +g.name); 

Если вы хотят, чтобы найти один из тех, кто с определенным именем вы должны искать их все ..

GameObject[] allCats; 
allCats = GameObject.FindGameObjectsWithTag("cat"); 
foreach (GameObject g in allCats) 
{ 
Debug.Log("I found one, name is: " +g.name); 
if (g.name == "Felix") 
    { 
    Debug.Log("I did find Felix the cat"); 
    g.Whatever ... 
    } 

Если вы хотите, чтобы найти все объекты с определенным именем ...

это очень важно понять, что

... вы просто не можете сделать это в Unity - это просто не имеет смысла.

Жизненный цикл жизни - Find - это хак, который вы никогда не должны использовать в любом случае, кроме как в редких ситуациях. Если вам (по какой-то причине?) Нужно «найти» все игровые объекты с определенным именем, вы должны просто просмотреть каждую вещь в сцене (что не так просто сделать). Вы можете легко это сделать. Но нет абсолютно никакой причины, по которой вы это сделаете.

Обратите внимание, что только один пример .. говорят, что у вас в вашей сцене было множество вещей «кошки». Очень просто - ничего сложнее, чем это - вы бы получили их все в одной и той же папке. (То есть все под одним и тем же держателем игрового объекта.) Это всего лишь один невероятно простой подход, чтобы полностью избежать той проблемы, с которой вы сталкиваетесь.

Опять буквально нет никакого способа найти «все игровые объекты с тем же именем» - Find вызова хак, который никогда не должен был быть в единстве; у них явно нет


И самое главное не забывайте ... Найти не работает, если неактивно!

Find звонок - это взлом, который никогда не должен был быть в Unity: всегда помните он даже не работает на неактивных объектах. Поскольку они бросили концепцию «найти имя», вероятно, самое лучшее, что она не работает на неактивных объектах: но все это путаница - просто не используйте «найти», никогда.

В частности, как новичок просто перетащить в инспекторе - это честно, что легко. (И опять же, почти во всех случаях ваши вещи начнут неактивно, поэтому, конечно, вы должны это сделать, так как вы не можете «найти» неактивные вещи.)

(И примечание - не забывайте, что если вы просто введите сценарий типа «босс», скажем, ваш или SoundEffects, никогда не пользуйтесь поиском. Просто сделайте this easy idiom.)

+0

Спасибо, Джо. Я пробовал первую часть, но ничего не найдено. Может быть, это связано с тем, что они оба изначально неактивны? – Joshua

+0

Конечно, я не могу использовать общедоступный метод GameObject johnCharacterOnLeft; ', потому что оба они называются одинаковыми, но теги разные. – Joshua

+0

Привет @Jtech. Я могу абсолютно заверить вас, что вы используете 'public GameObject johnCharacterOnLeft' Скопируйте мой код в свой скрипт. ** НЕ ЗАБЫВАЙТЕ, ЧТОБЫ ПРОВЕРИТЬ ПОДКЛЮЧЕНИЕ В ИНСПЕКТОРЕ **. работает нормально сейчас? – Fattie

Смежные вопросы