Суббота, 28 Декабря 2024, 17:47

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
Вопрос-[ответ] по Unity
QWER56Дата: Понедельник, 09 Августа 2010, 10:58 | Сообщение # 1
старожил
Сейчас нет на сайте
Вопрос-[Ответ] по Unity3d

  • База скриптов Unity3d
  • Курс Уроков по Unity 3D от Alcatraz

    ConsMark - поисковик по интернет магазинам.

    Сообщение отредактировал QWER56 - Вторник, 26 Июля 2011, 20:54
  • 8Observer8Дата: Суббота, 30 Апреля 2016, 16:44 | Сообщение # 7801
    заслуженный участник
    Сейчас нет на сайте
    Цитата Sanprabhu ()
    Есть ли способ закрепления объектов в скрипте или как-то еще, чтобы не перетаскивать их вручную на каждый объект с префарба?

    Я немного не понял вопрос. Нужно инициализировать поля объекта из префабов? Тогда Resources.Load

    Нужно чтобы префабы лежали в папке: Assets/Resources

    Код

    using UnityEngine;

    using System.Collections;

    public class ExampleClass : MonoBehaviour {

        void Start() {

        // Instantiates a prefab named "enemy" located in any Resources
        // folder in your project's Assets folder.
      GameObject instance = Instantiate(Resources.Load("enemy", typeof(GameObject))) as GameObject;

        }

    }


    Сообщение отредактировал 8Observer8 - Суббота, 30 Апреля 2016, 16:45
    SanprabhuДата: Суббота, 30 Апреля 2016, 18:50 | Сообщение # 7802
    частый гость
    Сейчас нет на сайте
    Спасибо, пока помогло копи-пастить ))
    Буду пробовать Resources.Load. Наверно тоже то, что нужно, спасибо 8Observer8


    Сообщение отредактировал Sanprabhu - Суббота, 30 Апреля 2016, 18:52
    ShortKedrДата: Суббота, 30 Апреля 2016, 18:57 | Сообщение # 7803
    Renword Studio
    Сейчас нет на сайте
    Resource.Load скорее подгруздка ресурсов, чем поиск нужных объектов в сцене

    Сообщение отредактировал ShortKedr - Суббота, 30 Апреля 2016, 18:58
    8Observer8Дата: Суббота, 30 Апреля 2016, 19:31 | Сообщение # 7804
    заслуженный участник
    Сейчас нет на сайте
    Цитата ShortKedr ()
    Resource.Load скорее подгруздка ресурсов, чем поиск нужных объектов в сцене

    Я так и не понял вопрос: либо нужен поиск объектов в сцене либо заменить инстанцирование из префабов через открытые поля на автоматическое инстанцирование объектов из префабов через Resource.Load


    Сообщение отредактировал 8Observer8 - Суббота, 30 Апреля 2016, 19:32
    ShortKedrДата: Суббота, 30 Апреля 2016, 19:37 | Сообщение # 7805
    Renword Studio
    Сейчас нет на сайте
    8Observer8, Автоматическое? Большой разницы не вижу, что так вы указываете путь к префабу, что так. Через поля считаю удобней, можно срарзу префаб заменить на другой не переписывая значение константы, а иногда оно может быть длинное) Resource у себя использую для хранения данных в префабах игровых, вроде библиотеки вещей, локализаций и т.п. Конечно можно это всё в файлы вынести, но вот например для библиотеки вещей так удобней) + доступ сложнее получить посторонним)

    Вопрос стоял в том, что в префабах стираются данные о объектах сцен, и нужно нужные объекты при создании находить)


    Сообщение отредактировал ShortKedr - Суббота, 30 Апреля 2016, 19:37
    berilДата: Суббота, 30 Апреля 2016, 21:11 | Сообщение # 7806
    Я не ленивый, я — энергосберегающий
    Сейчас нет на сайте
    Цитата Sanprabhu ()
    Еще такой вопрос: я создаю несколько объектов (перетаскиваю с префарба), cкрипт копируется, все ок. Но у них не определены поля и вываливается NullReferenceException. Есть ли способ закрепления объектов в скрипте или как-то еще, чтобы не перетаскивать их вручную на каждый объект с префарба?

    ScriptableObject




    Накодил? Убери за собой!
    Инвентарь в Unity(UI)
    Инвентарь в Unity(GUI)
    8Observer8Дата: Суббота, 30 Апреля 2016, 23:43 | Сообщение # 7807
    заслуженный участник
    Сейчас нет на сайте
    Цитата ShortKedr ()
    Вопрос стоял в том, что в префабах стираются данные о объектах сцен, и нужно нужные объекты при создании находить)

    Вот я с самого начала так и понял, чтобы данные в открытых полях в инспекторе не терялись можно инициализировать переменные с помощью Resource.Load Как вариант.
    ShortKedrДата: Суббота, 30 Апреля 2016, 23:47 | Сообщение # 7808
    Renword Studio
    Сейчас нет на сайте
    8Observer8, оно вроде из директории грузит, а эти переменные и так не теряются. Теряются объекты которые сохранены в сцене, прямого доступа к ним нет. В реалтайме только поиск нужного объекта по тегу, типу или ещё чему-нибудь. В редакторе можно кинуть префаб на сцену расставить нужные значения и дублировать его)
    berilДата: Воскресенье, 01 Мая 2016, 00:28 | Сообщение # 7809
    Я не ленивый, я — энергосберегающий
    Сейчас нет на сайте
    Цитата 8Observer8 ()
    Вот я с самого начала так и понял, чтобы данные в открытых полях в инспекторе не терялись можно инициализировать переменные с помощью Resource.Load Как вариант.

    Что вы еще там думаете, для этих целей существует ScriptableObject )




    Накодил? Убери за собой!
    Инвентарь в Unity(UI)
    Инвентарь в Unity(GUI)
    8Observer8Дата: Воскресенье, 01 Мая 2016, 00:34 | Сообщение # 7810
    заслуженный участник
    Сейчас нет на сайте
    Цитата ShortKedr ()
    оно вроде из директории грузит, а эти переменные и так не теряются. Теряются объекты которые сохранены в сцене, прямого доступа к ним нет. В реалтайме только поиск нужного объекта по тегу, типу или ещё чему-нибудь. В редакторе можно кинуть префаб на сцену расставить нужные значения и дублировать его)

    Значит, я неправильно понял вопрос. Я подумал, что человек кидает мышкой префаб на сцену и ему не нравится, что ему приходится раскидывать мышкой вручную на открытые поля этого префаба другие требуемые префабы. Поэтому я предложил вместо ручного раскидывания по открытым полям написать один раз Resource.Load для каждого требуемого префаба. Я понял. Вопрос закрыт.

    Добавлено (01 мая 2016, 00:34)
    ---------------------------------------------

    Цитата beril ()
    то вы еще там думаете, для этих целей существует ScriptableObject )

    Я пока не понял зачем это нужно. Сижу, читаю.


    Сообщение отредактировал 8Observer8 - Воскресенье, 01 Мая 2016, 00:33
    ShortKedrДата: Воскресенье, 01 Мая 2016, 00:59 | Сообщение # 7811
    Renword Studio
    Сейчас нет на сайте
    beril, 8Observer8, ключевые слова в описании этого класса: " При этом экземпляры считают, что обладают разными данными". Но они то обладают одними и теми же данными, точнее ссылкой на эти данные. Это как ссылка на объект. Напридумывали же в Unity API много чего ненужного...)
    Короче, смысл ScriptableObject в том, что он говорит Юньке не копировать данные класса из префаба в объект, а взять тупо ссылку из префаба на этот объект(класс). Т.е если мы будем заменять эти данные, то их первоначальному виду будет капец)
    Я все важные, уникальные и незаменимые данные храню в синглтон(система постороения класса) классах или в статических переменных класса)

    beril, так вот, вопрос не в этом был)

    Добавлено (01 мая 2016, 00:59)
    ---------------------------------------------
    Цитата ShortKedr ()
    Короче, смысл ScriptableObject в том, что он говорит Юньке не копировать данные класса из префаба в объект, а взять тупо ссылку из префаба на этот объект(класс)

    Типа так...)
    Код

    using UnityEngine;
    using System.Collections;
    using System;

    public class AbraKadabra : MonoBehaviour{

        [Serializable]
        public class UnknownPotato : ScriptableObject{
          
            public double potatoMass = 5d; // неплоха картошечка)
            public int[] potatoQuality = new int[1000];

            public UnknownPotato(){
            }
        }

        public UnknownPotato myPotato = new UnknownPotato();

        void Start(){
            
            myPotato.potatoMass = new System.Random().Sample() * 1000d;
            Debug.Log("First potato's data was broken!"); // :D
        }
    }


    Повторюсь, я использую MonoBehaviour только с уникальными значениями для каждого экземпляра, в целях универсализации. Всё остальное у меня в другом месте находится happy
    Скорее всего это сделано для "не программистов". Потому как думаю, что программист, который пишет ещё на Java(например как я), PHP и других языках, вряд ли своим принципам изменять будет с ScriptableObject
    ИМХО. Для меня это извращение, так сказать - путать визуальную часть редактора с программной biggrin
    Я воздержусь от изврата)


    Сообщение отредактировал ShortKedr - Воскресенье, 01 Мая 2016, 01:12
    berilДата: Воскресенье, 01 Мая 2016, 01:31 | Сообщение # 7812
    Я не ленивый, я — энергосберегающий
    Сейчас нет на сайте
    Цитата 8Observer8 ()
    Я пока не понял зачем это нужно. Сижу, читаю.

    Для оптимизации :)
    И частично для удобства, в данном случае, что бы руками у каждого префаба не заполнять поля
    Ну само собой для кастомных редакторов, это наверно основное назначение
    Цитата
    ScriptableObject необходимо использовать в тех случаях, когда нужно снизить расход памяти путём избежания копирования значений, но его также можно использовать для определения включаемых наборов данных.




    Накодил? Убери за собой!
    Инвентарь в Unity(UI)
    Инвентарь в Unity(GUI)
    БозингарДата: Понедельник, 02 Мая 2016, 10:48 | Сообщение # 7813
    почетный гость
    Сейчас нет на сайте
    А если я хочу, что бы объект остановился, плавно повернулся на рандомный градус (90, -90, 180) и продолжил движение в новом направление - писать таймер или использовать Coroutine лучше?

    #Хийвэл бүү ай, айвал бүү хий.
    8Observer8Дата: Понедельник, 02 Мая 2016, 12:30 | Сообщение # 7814
    заслуженный участник
    Сейчас нет на сайте
    Бозингар, может быть NevMesh можно настроить, чтобы объект повернулся, и только после завершения поворота начал движение?
    ShortKedrДата: Понедельник, 02 Мая 2016, 13:11 | Сообщение # 7815
    Renword Studio
    Сейчас нет на сайте
    8Observer8, Зачемм всё усложнять? Ему нужна разве навигация?! Нет не нужна

    Бозингар, сделай переменную targetEuler и в нужный момент её изменяй. Плавное вращение с помощью интерполяции любой. Ну и движение только тогда, когда градус объекта близок к градусу targetEuler
    8Observer8Дата: Понедельник, 02 Мая 2016, 13:21 | Сообщение # 7816
    заслуженный участник
    Сейчас нет на сайте
    Цитата ShortKedr ()
    Зачемм всё усложнять? Ему нужна разве навигация?! Нет не нужна

    Наоборот, зашил NavMesh одним нажатием и потом устанавливай в скрипте точку назначения объект сам будет разворачиваться и ещё обходить препятствия
    ShortKedrДата: Понедельник, 02 Мая 2016, 13:49 | Сообщение # 7817
    Renword Studio
    Сейчас нет на сайте
    8Observer8, Так то оно так, но уже есть минусы. NavMesh по другому не используешь и как-то не оптимизировано для этого использовать систему просчёта пути
    БозингарДата: Понедельник, 02 Мая 2016, 15:44 | Сообщение # 7818
    почетный гость
    Сейчас нет на сайте
    Цитата ShortKedr ()
    Бозингар, сделай переменную targetEuler и в нужный момент её изменяй. Плавное вращение с помощью интерполяции любой. Ну и движение только тогда, когда градус объекта близок к градусу targetEuler

    Хм, и правда. Благодарю.


    #Хийвэл бүү ай, айвал бүү хий.
    berilДата: Понедельник, 02 Мая 2016, 17:57 | Сообщение # 7819
    Я не ленивый, я — энергосберегающий
    Сейчас нет на сайте
    Цитата Бозингар ()
    А если я хочу, что бы объект остановился, плавно повернулся на рандомный градус (90, -90, 180) и продолжил движение в новом направление - писать таймер или использовать Coroutine лучше?

    Можешь еще vector.Dot(скалярное произведение) использовать

    Код


                    Vector3 forward = transform.TransformDirection(Vector3.forward);
                    //Позиция цели относительно игрока
                    Vector3 Target = myTarget.position - transform.position;
                    //Если цель впереди
                    if (Vector3.Dot(forward, Target) > 0)
                    {
                          здесь начинаешь движение в нужную точку (Target)
                    }




    Накодил? Убери за собой!
    Инвентарь в Unity(UI)
    Инвентарь в Unity(GUI)
    SanprabhuДата: Вторник, 03 Мая 2016, 13:12 | Сообщение # 7820
    частый гость
    Сейчас нет на сайте
    Всем привет. Насколько я понял, конструктор MonoBehaviour создавать нельзя. Отсюда вопрос, кто как реализует передачу параметров объекту MonoBehaviour?
    Я использую метод, с помощью которого передаю необходимые параметры. Это нормальный подход или можно как-то лучше реализовать?
    Спасибо.


    Сообщение отредактировал Sanprabhu - Вторник, 03 Мая 2016, 16:19
    Поиск:

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