Понедельник, 25 Ноября 2024, 19:00

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Поиск деактивированных объектов.
pixeyeДата: Среда, 27 Июня 2012, 22:10 | Сообщение # 1
Red Winter Software
Сейчас нет на сайте
Как известно, в юнити нельзя через GameObject.Find найти уже деактивированный объект, однако иногда возникает ситуация когда это необходимо.
Скрипт изложенный в статье помогает решать такую задачу.

Стандартными средствами Unity сделать это не удастся, так что приступим;-)
Для решения задачи мы будем использовать словарь (dictionary).
Словарь - это тип контейнера, для тех кто совсем в танке приведу несколько некорректное пояснение: разновидность массива.
Его(словаря) особенностью является способ обращения к нему. Если в обычном массиве мы используем числовой индекс, то доступ к элементу словаря происходит через ключи.
Ключом может выступать любой объект. В нашем случае это будет переменная типа string.

Код ниже представлен для C#.

Создаем новый скрипт .cs . Для примера назовем его objHandler.cs.
Удалим его содержимое, автоматически созданное Unity ( оно нам не понадобится ).

Добавим в пространство имен следующие значения :
Code

using UnityEngine;  
using System.Collections;  
using System.Collections.Generic;  


Дальше пишем собственно класс:
Code

public static class objHandler  
{   
   public static Dictionary<string,GameObject> objRefs = new Dictionary<string, GameObject> ();  

   public static void AddReference (string name, GameObject obj)  
   {   
   if (!objRefs.ContainsKey (name))   
   objRefs.Add (name, obj);  
   }  

}  


Внутри мы создаем словарь где первое значение это ключ типа string(текстовое значение), второе это элемент типа юнити класса GameObject (Игровой Объект). objRefs это название словаря, дальше его инициализация. Пишем метод. Назовем его AddReference. В него передаем два значения, это текстовое значение ( имя объекта ), и сам игровой объект.
Code

if (!objRefs.ContainsKey (name))
- эта строчка является простой проверкой на наличие ключа. Дело в том, что если по какой-то причине вы попытаетесь дважды добавить объект с одинаковым ключом в словарь, то получите ошибку с содержанием "элемент с таким ключом уже существует и тп. и тд.). Чтобы избежать этого мы и совершаем небольшую проверку: если такого ключа нет, то добавляем объект, если есть, то ничего не делаем . Для того чтобы пользоваться objHandler его не нужно добавлять на сцену или крепить к игровым объектам.

Ну а теперь практика;-)

Перед тем как деактивировать объект, который как вы уверены будет необходимо в будущем найти, добавим его в наш словарь. Пишем такую строчку в скрипте объекта, хотя на самом деле неважно откуда и как вы получили реф на gameObject. Это уже индивидуально по вашему проекту.
Code
objHandler.AddReference ("player",gameObject);
Ну и спокойно деактивируем;-)
Когда нам потребуется найти этот объект, то вместо
Code
GameObject.Find("player")
мы используем
Code
GameObject o = objHandler.objRefs["player"];

По сути это простейшая основа и база для пула объектов.


ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю

MkasssДата: Среда, 27 Июня 2012, 22:14 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
Полезно happy
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг