forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   Вопросы от новичка (http://forum.boolean.name/showthread.php?t=15809)

pax 18.05.2015 07:28

Ответ: Вопросы от новичка
 
Я боюсь у тебя это не получится, property может указывать на свойства нескольких объектов одновременно, т.к. в редакторе можно выделить сразу много объектов. Самый простой путь - преобразовать target к типу своего скрипта и все рисовать с помощью EditorGUI/EditorGUILayout для одного первого объекта. Но появится проблема с Undo/Redo.

ANIK123 18.05.2015 16:56

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от pax (Сообщение 295933)
Я боюсь у тебя это не получится, property может указывать на свойства нескольких объектов одновременно, т.к. в редакторе можно выделить сразу много объектов. Самый простой путь - преобразовать target к типу своего скрипта и все рисовать с помощью EditorGUI/EditorGUILayout для одного первого объекта. Но появится проблема с Undo/Redo.

Но... target ведь у Editor, а не у PropertyDrawer-a? (
Да и Undo/Redo не нужен, а если понадобится, то его же можно вручную сделать

pax 18.05.2015 17:06

Ответ: Вопросы от новичка
 
Вручную сложно, а у Editor target это первый из targets

UPD: сорри я немного не понял сначала о чем речь. в PropertyDrawer никак не получить что рисуешь. Вроде кто-то пробовал через рефлексию. Но это геморрой еще тот.

ILonion 20.05.2015 19:47

Ответ: Вопросы от новичка
 
Подскажите ответ на такой вопрос:
Мне нужно чтобы можно было определять объект под мышкой, но при этом, чтобы никаких столкновений между объектами не происходило.
В блитце была возможность сделать так без вызова UpdateWorld.
А как такое организовать в юнити? Как выключить расчет столкновения у всего?

UPD: или если у меня нет ни одного fixedUpdate(), то никакие столкновения рассчитываться нигде никогда не будут ?

pax 20.05.2015 21:26

Ответ: Вопросы от новичка
 
Вешай на объекты Collider'ы с Rigidbody в режиме IsKinematic

Жека 21.05.2015 11:42

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от ILonion (Сообщение 295973)
UPD: или если у меня нет ни одного fixedUpdate(), то никакие столкновения рассчитываться нигде никогда не будут ?

Наличие этой функции в твоём скрипте никак не повлияет на работу физики, она лишь позволяет тебе вклиниться в логику в момент обработки физики.

ILonion 21.05.2015 18:10

Ответ: Вопросы от новичка
 
Понятно..
Спасибо, pax, Жека!

ILonion 21.05.2015 21:36

Ответ: Вопросы от новичка
 
Посоветуйте, пожалуйста, как поступить. Штука такая:
Образно: есть массив 3д объектов. Большое кол-во. Те, что находятся на расстоянии от камеры n, должны определяться мышкой, прочие - нет. Камера перемещается, соответственно и объекты подверженные лучу камеры меняются.
Каким образом эффективно включать\выключать у объектов коллайдеры? Я так понял, что только через getcomponent>collider.
Но вопрос в том, что "id' объектов постоянно меняются (перманентно instantiate и destroy делаются) и создать массив ссылок на коллайдеры перед запуском скрипта не получается.
В руководстве же, написано, что getcomponent (в свете производительности) хорошо бы использовать по-реже (что и смущает).
getcomponent на лету единственный способ в данном случае?

ANIK123 21.05.2015 23:59

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от ILonion (Сообщение 295990)
Посоветуйте, пожалуйста, как поступить. Штука такая:
Образно: есть массив 3д объектов. Большое кол-во. Те, что находятся на расстоянии от камеры n, должны определяться мышкой, прочие - нет. Камера перемещается, соответственно и объекты подверженные лучу камеры меняются.
Каким образом эффективно включать\выключать у объектов коллайдеры? Я так понял, что только через getcomponent>collider.
Но вопрос в том, что "id' объектов постоянно меняются (перманентно instantiate и destroy делаются) и создать массив ссылок на коллайдеры перед запуском скрипта не получается.
В руководстве же, написано, что getcomponent (в свете производительности) хорошо бы использовать по-реже (что и смущает).
getcomponent на лету единственный способ в данном случае?

Вешай на объекты компонент, который имеет поле myCollider, которое можно вручную назначать, или в Start-е Getcomponent выполнять
И в массиве держать ссылки имеено на этот компонент
Как-то так?

pax 22.05.2015 07:29

Ответ: Вопросы от новичка
 
У Physics.Raycast есть много параметров, задай дистанцию действия луча и не парься о включении/выключении колайдеров.

ILonion 22.05.2015 19:10

Ответ: Вопросы от новичка
 
Спасибо, pax, так и сделаю!
ANIK123, спасибо, но предустановленный массив делать в моем случае нельзя - нет постоянных id объектов.

ANIK123 23.05.2015 09:18

Ответ: Вопросы от новичка
 
Пытаюсь смастерить свой Dictionary, который умеет сериализироваться
PHP код:

[Serializable]
public class 
DictionarySerializable<KV> : IEnumerable<KVPSerializable<KV>> {
    [
SerializeField] protected List<KVPSerializable<KV>> list = new List<KVPSerializable<KV>>();
    public 
int Count {get{return list.Count;}}
    protected 
void Add(K KeyV Value){
        list.
Add(new KVPSerializable<KV>{Key KeyValue Value});
    }
    public 
void Remove(K Key){
        list.
Remove(Find(Key));
    }
    public 
V this[K Key]{
        
get {return Find(Key).Value;}
        
set {
            
bool finded false;
            foreach (var 
v in list){
                if (
v.Key.Equals(Key)){v.Value valuefinded true; break;}
            }
            if (!
finded){Add(Keyvalue);}
        }
    }
    public 
KVPSerializable<KVFind(K Key){
        foreach (var 
v in list){
            if (
v.Key.Equals(Key)){return v;}
        }
        throw new 
System.InvalidOperationException();
    }
    public 
IEnumerator<KVPSerializable<KV>> GetEnumerator(){
        foreach (var 
v in list){
            yield return 
v;
        }
    }
    
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator(){
        return 
this.GetEnumerator();
    }
}

[
Serializable]
public class 
KVPSerializable<KV> {
    public 
K Key; public V Value;


PHP код:

EditorGUI.BeginChangeCheck();
foreach (var 
v in myTarget.dict){
        ....
    
v.Value.strength EditorGUILayout.IntField(v.Value.strength);
        ....
}
if (
EditorGUI.EndChangeCheck()){
    
EditorUtility.SetDirty(target);



Но он не сериализируется (при запуске "игры" и при выходе с нее - данные сбрасываются)
Не могу понять где налажал

pax 23.05.2015 10:32

Ответ: Вопросы от новичка
 
Твой пример, это не словарь, а простой перебор. Нет никаких преимуществ поиска. Ведь словарь это хэш таблица.

И зачем тебе мастерить свой словарь, ведь можно сериализовать любой другой.

Вот готовый пример сериализации стандартного словаря:
http://docs.unity3d.com/ScriptRefere...rialize.h tml

Я обычно поступаю так:
PHP код:

using UnityEngine;
using System.Collections.Generic;

public class 
ExampleMonoBehaviour
{
     [
System.Serializable]
     public class 
DictionaryItem
     
{
            public 
string key;
            public 
int value;
     }

     public List<
DictionaryItemitems;

     public 
Dictionary<stringintdic;

     
void Awake()
     {
            
dic = new Dictionary<stringint>();
            if(
items!= null)
            {
                 foreach(var 
item in items)
                   
dic[item.key] = item.value;
            }
     }
    


И не надо писать никакие свои редакторы для типов.

ILonion 29.05.2015 03:19

Ответ: Вопросы от новичка
 
Доброго времени!
Такой вопрос:
луч должен возвращать компонент объекта в сцене - скрипт, и из него метод, но при попытке запуска юнити говорит, что ссылается не на экземпляр (Object reference not set to an instance of an object):

PHP код:

hit.collider.GetComponent<xcalss>().xmethod(); 

энное кол-во объектов в сцене со скриптом с классом xclass.
как быть в данном случае?
нужно запускать методы xmethod().

pax 29.05.2015 06:56

Ответ: Вопросы от новичка
 
Вот так
PHP код:

var component hit.collider.GetComponent<xcalss>();
if(
componentcomponent.xmethod(); 



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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot