Как добавить Property (Attribute) объекту?

Программирование на Юнити.

Re: Как добавить Property (Attribute) объекту?

Сообщение Neyl 10 фев 2011, 22:42

От SphereCollider нельзя унаследовать класс, потому что он определен как sealed. Но можно
написать расширяющий метод для любого удобного класса. К примеру для GameObject
Справка на MSDN

Вот MSDN
Вот примитивный пример
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public static class SphereColliderExtension
{
        public static void SphereColliderMethod(this SphereCollider spherecollider)
    {
        spherecollider.radius += 2;
    }
}
 
Аватара пользователя
Neyl
UNIверсал
 
Сообщения: 404
Зарегистрирован: 20 июн 2010, 10:17

Re: Как добавить Property (Attribute) объекту?

Сообщение fallenart 10 фев 2011, 22:55

Neyl
Спасибо!
А как теперь все это волшебство повесить на объект?
fallenart
UNIт
 
Сообщения: 81
Зарегистрирован: 19 дек 2010, 23:52

Re: Как добавить Property (Attribute) объекту?

Сообщение fallenart 10 фев 2011, 22:58

[del]
Последний раз редактировалось fallenart 11 фев 2011, 19:50, всего редактировалось 1 раз.
fallenart
UNIт
 
Сообщения: 81
Зарегистрирован: 19 дек 2010, 23:52

Re: Как добавить Property (Attribute) объекту?

Сообщение fallenart 11 фев 2011, 19:49

Парни, ну 2 строчки же нашкрябать... Каждое слово выпрашивать нужно.

Ни как не получается подсунуть свой компонент так же как стандартный.
Сделал класс, точнее взял тот что сделал Neyl:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public static class SphereColliderExtension
{
        public static void SphereColliderMethod(this SphereCollider spherecollider)
    {
        spherecollider.radius += 2;
    }
}


Так как написано в справке этот компонент фиг добавишь. С справке так:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
         public SphereCollider sc;
         void Awake() {
                 sc = gameObject.AddComponent("SphereCollider") as SphereCollider;
         }
}
fallenart
UNIт
 
Сообщения: 81
Зарегистрирован: 19 дек 2010, 23:52

Re: Как добавить Property (Attribute) объекту?

Сообщение DbIMok 11 фев 2011, 20:27

ну а ссылку на msdn почитать. там ведь все русским языком написано.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Как добавить Property (Attribute) объекту?

Сообщение fallenart 11 фев 2011, 20:36

DbIMok
Написано. Но у меня не работает :) Мне вот ни как не вставиться, вот нафига меня который день подряд отправлять в справку, вместо того чтобы в двух словах объяснить что делать? Я не прогер. По-видимому поэтому и не вставиться...
Может кто-нибудь даст линк на урок или проект, где это реализовано?
fallenart
UNIт
 
Сообщения: 81
Зарегистрирован: 19 дек 2010, 23:52

Re: Как добавить Property (Attribute) объекту?

Сообщение Zaicheg 11 фев 2011, 20:58

fallenart писал(а):А как теперь все это волшебство повесить на объект?

Это волшебство не нужно вешать на объект.
Я с расширяющими методами один раз только работал, так что могу напутать. По-моему, это добавляет метод SphereColliderMethod к компонентам типа SphereCollider.

Может кто-нибудь даст линк на урок или проект, где это реализовано?

В Антаресе это где-то есть.
viewtopic.php?f=12&t=1162
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: Как добавить Property (Attribute) объекту?

Сообщение fallenart 11 фев 2011, 21:11

Zaicheg
Ок. Спасибо.
Вообще говоря, как это все задействовать - половина проблемы. Нужно еще как-то к классу добавить свои данные... менять радиус коллайдера как-то не интересно. :)
fallenart
UNIт
 
Сообщения: 81
Зарегистрирован: 19 дек 2010, 23:52

Re: Как добавить Property (Attribute) объекту?

Сообщение DbIMok 11 фев 2011, 21:11

ну, должно быть
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

namespace test
{
    public static class SphereColliderExtension
    {
        public static void SphereColliderMethod(this SphereCollider spherecollider)
        {
            spherecollider.radius += 2;
        }
    }
}


Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using test;

public class tеst_ext : MonoBehaviour {

    public SphereCollider sc;
    void test()
    {
        sc.SphereColliderMethod();
    }
}
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Как добавить Property (Attribute) объекту?

Сообщение fallenart 11 фев 2011, 21:21

DbIMok
А как быть с этим:
Don't use namespaces.

Unity doesn't support placing your scripts inside of a namespace at the moment. This requirement will be removed in a future version.

http://unity3d.com/support/documentatio ... sharp.html
fallenart
UNIт
 
Сообщения: 81
Зарегистрирован: 19 дек 2010, 23:52

Re: Как добавить Property (Attribute) объекту?

Сообщение DbIMok 11 фев 2011, 21:27

никак. у вас что-то не работает?
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Как добавить Property (Attribute) объекту?

Сообщение fallenart 11 фев 2011, 21:42

у вас что-то не работает?

Да, не работает. Error CS0723: Cannot declare a variable of static type... на строке с public SphereCollider sc;
Ну, раз должно работать, значит заработает.

[add]: Ну, теперь вроде бы ошибок не выдает. Осталось попробовать как это работает.
fallenart
UNIт
 
Сообщения: 81
Зарегистрирован: 19 дек 2010, 23:52

Re: Как добавить Property (Attribute) объекту?

Сообщение seaman 11 фев 2011, 22:21

А ничего, что в практическом руководстве написано, что для расширяющих методов нужно использовать LINQ?
http://msdn.microsoft.com/ru-ru/library/bb311042.aspx
Он в Юнити поддерживается?
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Как добавить Property (Attribute) объекту?

Сообщение Neyl 11 фев 2011, 22:33

К sealed классу свои данные не добавить же, но можно вешать на объект компонент со своими данными и с помощью расширяющих методов упростить работу с этим компонентом. Сейчас написал небольшой пример, который реализует то что вы хотите получить)
Создаем класс(компонент), который будет хранить необходимые переменные-атрибуты для объекта. Самостоятельно вешать его на объект не нужно.
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class AttributesHolder : MonoBehaviour
{
        public int Attribute01 = 0;
        public int Attribute02 = 0;
        public int Attribute03 = 0;
}
 


Далее создаем статический класс, который реализует расширяющий метод для GameObject. (Вешать его тоже на объект не нужно))
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public static class GameObjectExtension
{

        public static AttributesHolder Attribute(this GameObject go)
        {
                if (!go.GetComponent<AttributesHolder>())
                {
                        go.AddComponent<AttributesHolder>();
                }
                return go.GetComponent<AttributesHolder>();
    }
}


Все. Теперь для любого объекта типа GameObject можно получать доступ к свои аттрибутам просто написав gameObject.Attribute().Attribute01
Вот пример использования (его можно повесить на объект))
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class CollTester : MonoBehaviour {
        public int ourCounter1 = 0;
        public int ourCounter2 = 0;
        public int ourCounter3 = 0;

        // Use this for initialization
        void Start () {
       
        }
       
        // Update is called once per frame
        void Update ()
        {
                ourCounter1 = gameObject.Attribute().Attribute01;
                ourCounter2 = gameObject.Attribute().Attribute02;
                ourCounter3 = gameObject.Attribute().Attribute03;
        }
       
       
        [ContextMenu("SetAttribute1")]
        void SetAttribute1()
        {
                gameObject.Attribute().Attribute01 = 101;
        }
       
        [ContextMenu("SetAttribute2")]
        void SetAttribute2()
        {
                gameObject.Attribute().Attribute02 = 202;
        }
       
        [ContextMenu("SetAttribute3")]
        void SetAttribute3()
        {
                gameObject.Attribute().Attribute03 = 303;
        }
       
}
Аватара пользователя
Neyl
UNIверсал
 
Сообщения: 404
Зарегистрирован: 20 июн 2010, 10:17

Re: Как добавить Property (Attribute) объекту?

Сообщение fallenart 12 фев 2011, 01:35

Neyl: "написал небольшой пример"
Спасибо за помощь!
К sealed классу свои данные не добавить же

Разработчики злодеи просто какие-то... Из такого простого действия, как добавление атрибута (точнее не атрибута, а чего-то похожего) сделали целое приключение.

Может у меня какой-то нестандартный подход, но в моем понимании некоторые вещи в Unity реализованы, как бы это сказать... как минимум непривычно :)
fallenart
UNIт
 
Сообщения: 81
Зарегистрирован: 19 дек 2010, 23:52

Пред.След.

Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5