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 22.08.2012 07:43

Цитата:

Сообщение от WISHMASTER35 (Сообщение 236707)
изучаю злых роботов. там все построенно на посылке сообщений с помощью SignalSender. вроде бы и удобно т.к. не надо создавать много скриптов, а один настраивать можно, чтобы при каких-то событиях он еосылал обьектам сообщения(например при взломе компа открывать двери и др) но пока разобрался что куда сообщения посылает пол дня прошло.
вот думаю как хорошо было бы, если в юнити был такой тип в который можно было записать ссылку на скрипт и метод. и конечно в инспекторе выводился бы список методов скрипта из которых можно было бы выбирать нужный. а то одну букву неправильно напишешь и ж@п@.
думаю это было бы и не сложно сделать, но создать свой инспектор для простого класса нельзя(
никому такая идея не приходила?

Так жеж это просто: obj.GetType().GetMethods()
где obj это скрипт.
Скрипт типа Component, имя метода - string. При старте получить метод по имени если надо вызывать через MethodInfo, если через мессаджи, то не надо. Делал много таких инспекторов в Antares Universe.


Цитата:

Сообщение от Gector (Сообщение 236841)

Код:

GameObject cube;
GameObject cube2;
cube = GameObject.Find("Cube");
cube2 = GameObject.Find("Cube2");


Лучше так не делать каждый кадр, ибо поиск по имени - сложная операция. Вынеси это в Start если кубы не заменяются новыми со временем.

Цитата:

Сообщение от Костян (Сообщение 236867)
Это прикол Unity что оно не вызывает OnCollision*** если ригид кинематический???

Если кинематический и сталкивается с коллайдером или другим кинематическим телом - вероятно да.

Gector 22.08.2012 17:57

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

Сообщение от pax (Сообщение 236887)
Лучше так не делать каждый кадр, ибо поиск по имени - сложная операция. Вынеси это в Start если кубы не заменяются новыми со временем.

Моя забыть...:-)

pie 24.08.2012 18:38

Ответ: Вопросы от новичка
 
Добрый день. Решил сделать какую нибудь небольшую казуалку. Хотелось сделать все на GUI без лишних объектов. Возник вопрос по "тыку" по гемам. Как определить по какой текстурке ткнули мышкой?

WISHMASTER35 24.08.2012 22:06

Ответ: Вопросы от новичка
 
pie, проверяй попала ли мышь в rect твоей текстуры. вообще gui для этого не очень годится. хотч в 4й версии он уже навеоно батчится.
pax, вот именно что я не пойму как в инспекторе изменить поле, чтобы при нажатии на него было не редактирование строки, а выподал список методов скрипта. но как я понимаю такое не сделать. хотя еще можно было бы сделать, если можно было бы сделать инспектор не для скрипта, а для обычного класса. в данном случае класса SignalSender.

что вы за инспекторы в своей вселенной делаете? давно интересно было. можешь не очень тяжелый скрин сделать, а то инет мобильный.

pie 25.08.2012 01:23

Ответ: Вопросы от новичка
 
Спасибо. На wiki нашел шейдер Planet. Вроде бы все хорошо, но не хватает бампа. Не могли бы Вы помочь прикрутить бамп к этому шейдеру?

Код:

Shader "planets"
{
    Properties
    {
        _MainTex("Texture (RGB)", 2D) = "black" {}
        _Color("Color", Color) = (0, 0, 0, 1)
        _AtmoColor("Atmosphere Color", Color) = (0.5, 0.5, 1.0, 1)
        _Size("Size", Float) = 0.1
        _Falloff("Falloff", Float) = 5
        _FalloffPlanet("Falloff Planet", Float) = 5
        _Transparency("Transparency", Float) = 15
        _TransparencyPlanet("Transparency Planet", Float) = 1
    }
 
        SubShader
    {
        Pass
        {
            Name "PlanetBase"
            Tags {"LightMode" = "Always"}
            Cull Back
         
            CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
             
                #pragma fragmentoption ARB_fog_exp2
                #pragma fragmentoption ARB_precision_hint_fastest
             
                #include "UnityCG.cginc"
             
                uniform sampler2D _MainTex;
                uniform float4 _MainTex_ST;
                uniform float4 _Color;
                uniform float4 _AtmoColor;
                uniform float _FalloffPlanet;
                uniform float _TransparencyPlanet;
             
                struct v2f
                {
                    float4 pos : SV_POSITION;
                    float3 normal : TEXCOORD0;
                    float3 worldvertpos : TEXCOORD1;
                    float2 texcoord : TEXCOORD2;
                };

                v2f vert(appdata_base v)
                {
                    v2f o;
                 
                    o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
                    o.normal = v.normal;
                    o.worldvertpos = mul(_Object2World, v.vertex).xyz;
                    o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
                 
                    return o;
                }
             
                float4 frag(v2f i) : COLOR
                {
                    i.normal = normalize(i.normal);
                    float3 viewdir = normalize(_WorldSpaceCameraPos-i.worldvertpos);
                 
                    float4 atmo = _AtmoColor;
                    atmo.a = pow(1.0-saturate(dot(viewdir, i.normal)), _FalloffPlanet);
                    atmo.a *= _TransparencyPlanet*_Color;
             
                    float4 color = tex2D(_MainTex, i.texcoord)*_Color;
                    color.rgb = lerp(color.rgb, atmo.rgb, atmo.a);
             
                    return color*dot(normalize(i.worldvertpos-_WorldSpaceLightPos0), i.normal);
                }
            ENDCG
        }
 
        Pass
        {
            Name "AtmosphereBase"
            Tags {"LightMode" = "Always"}
            Cull Front
            Blend SrcAlpha One
         
            CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
             
                #pragma fragmentoption ARB_fog_exp2
                #pragma fragmentoption ARB_precision_hint_fastest
             
                #include "UnityCG.cginc"
             
                uniform float4 _Color;
                uniform float4 _AtmoColor;
                uniform float _Size;
                uniform float _Falloff;
                uniform float _Transparency;
             
                struct v2f
                {
                    float4 pos : SV_POSITION;
                    float3 normal : TEXCOORD0;
                    float3 worldvertpos : TEXCOORD1;
                };

                v2f vert(appdata_base v)
                {
                    v2f o;
                 
                    v.vertex.xyz += v.normal*_Size;
                    o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
                    o.normal = v.normal;
                    o.worldvertpos = mul(_Object2World, v.vertex);
                 
                    return o;
                }
             
                float4 frag(v2f i) : COLOR
                {
                    i.normal = normalize(i.normal);
                    float3 viewdir = normalize(i.worldvertpos-_WorldSpaceCameraPos);
                 
                    float4 color = _AtmoColor;
                    color.a = pow(saturate(dot(viewdir, i.normal)), _Falloff);
                    color.a *= _Transparency*_Color*dot(normalize(i.worldvertpos-_WorldSpaceLightPos0), i.normal);
                    return color;
                }
            ENDCG
        }
    }
 
    FallBack "Diffuse"
}


pie 25.08.2012 11:05

Ответ: Вопросы от новичка
 
Вложений: 3
И еще один вопрос. Вот скрипт: http://pastebin.com/ym0jxeHx.
Вроде все правильно. В первый раз местами кубы меняются. А при попытке снова поменять местами кубы выскакивает ошибка якобы я удалил нужный объект и его нет, но на самом деле он есть. (MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.)

Ругается на строчку GameObject gem = (GameObject)Instantiate(grid[i, j]);

Radnk 25.08.2012 16:42

Ответ: Вопросы от новичка
 
Что лучше одна большая модель или много маленьких?

WISHMASTER35 25.08.2012 18:15

Ответ: Вопросы от новичка
 
много моделей - много дравколлов. хотя совсем мелкие модели сбатчатся, если материал один. но на это тоже время уйдет.

pie 25.08.2012 18:35

Ответ: Вопросы от новичка
 
Вложений: 1
Кто нить сможет помочь с моей проблемой?

pax 25.08.2012 22:12

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

Сообщение от WISHMASTER35 (Сообщение 237155)
pax, вот именно что я не пойму как в инспекторе изменить поле, чтобы при нажатии на него было не редактирование строки, а выподал список методов скрипта. но как я понимаю такое не сделать.

Элементарно:
PHP код:

using UnityEngine;

public class 
MethodsExample MonoBehaviour
{
    public 
string messageName "";

    
void Start()
    {

    }

    
void Update()
    {

    }


PHP код:

using System.Reflection;
using UnityEditor;
using UnityEngine;

[
CustomEditor(typeof(MethodsExample))]
public class 
MethodsExampleEditor Editor
{
    public 
override void OnInspectorGUI()
    {
        var 
obj = (MethodsExampletarget;

        
GUILayout.BeginHorizontal();
        
GUILayout.Label("Message");
        if (
GUILayout.Button(obj.messageName??""GUI.skin.textField))
        {
            var 
menu = new GenericMenu();

            foreach (var 
methodInfo in typeof(MethodsExample).GetMethods(
                
BindingFlags.Instance BindingFlags.Public | BindingFlags.NonPublic BindingFlags.DeclaredOnly))
            {
                var 
methodName methodInfo.Name;
                
menu.AddItem(new GUIContent(methodName), false, () => obj.messageName methodName);
            }

            
menu.ShowAsContext();
        }
        
GUILayout.EndHorizontal();
    }



cahekp 26.08.2012 17:16

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

Сообщение от pie (Сообщение 237226)
Кто нить сможет помочь с моей проблемой?

А в чем, собственно, проблема?

Кольца должны всегда быть перпендикулярны камере?

pax 26.08.2012 20:04

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

Сообщение от cahekp (Сообщение 237318)
А в чем, собственно, проблема?

Проблема решена по аське.

WISHMASTER35 29.08.2012 17:50

Ответ: Вопросы от новичка
 
pax, вот будят у меня куча скриптов, которые посылают по несколько сообщений. мне тогда для каждого скрипта делать Editor?
Код:

[System.Serializable]
public class SignalSender {
       
        public bool onlyOnce;
        public ReceiverItem[] receivers;
        private bool hasFired = false;

       
        public void SendSignals(MonoBehaviour sender) {
                if (hasFired == false || onlyOnce == false) {
                        foreach(ReceiverItem receiver in receivers) {
                                receiver.Send(sender);
                        }
                        hasFired = true;
                }
        }
       
}

[System.Serializable]
public class ReceiverItem {
        public GameObject receiver;
        public string action = "OnSignal";
       
        public void Send(MonoBehaviour sender) {
                if (receiver)
                        receiver.SendMessage(action);
                else
                        Debug.LogWarning("No receiver of signal \""+action+"\" on object "+sender.name+" ("+sender.GetType().Name+")", sender);
        }
}

Вот если бы для этого ReceiverItem сделать Editor, то можно было бы во всех скриптах использовать SignalSender и не делать больше Editor'ов.

pax 29.08.2012 18:05

Ответ: Вопросы от новичка
 
Ты говорил про невозможность, я тебе показал что это возможно. Лень скрипты (эдиторы) писать? Так и скажи.

WISHMASTER35 29.08.2012 19:42

Ответ: Вопросы от новичка
 
Как создать инспектор для одного скрипта я знаю. Я имел ввиду как изменить поле для своего типа во всех скриптах. Либо изменить инспектор для простого класса как тот ReceiverItem.
Если бы твой пример изменял дефолтный инспектор для ВСЕХ скриптов, то еще было бы нормально.

Цитата:

Лень скрипты (эдиторы) писать? Так и скажи.
Если таких скриптов будет больше, чем пальцев на руку, то у меня конечно мало желания писать еще для каждого Editor'ы, а эти редакторы еще настраивать\перенастраивать при добавлении\удалении такого string messageName.
Я хотел более\менее универсальный способ.
кстати, впервые вижу такие конструкции
Цитата:

obj.messageName??""
Цитата:

() => obj.messageName = methodName


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

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