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