 |
Общие вопросы вопросы не попадающие ни в один из доступных разделов |
22.08.2012, 07:43
|
#601
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Сообщение от WISHMASTER35
изучаю злых роботов. там все построенно на посылке сообщений с помощью SignalSender. вроде бы и удобно т.к. не надо создавать много скриптов, а один настраивать можно, чтобы при каких-то событиях он еосылал обьектам сообщения(например при взломе компа открывать двери и др) но пока разобрался что куда сообщения посылает пол дня прошло.
вот думаю как хорошо было бы, если в юнити был такой тип в который можно было записать ссылку на скрипт и метод. и конечно в инспекторе выводился бы список методов скрипта из которых можно было бы выбирать нужный. а то одну букву неправильно напишешь и ж@п@.
думаю это было бы и не сложно сделать, но создать свой инспектор для простого класса нельзя(
никому такая идея не приходила?
|
Так жеж это просто: obj.GetType().GetMethods()
где obj это скрипт.
Скрипт типа Component, имя метода - string. При старте получить метод по имени если надо вызывать через MethodInfo, если через мессаджи, то не надо. Делал много таких инспекторов в Antares Universe.
Сообщение от Gector
GameObject cube;
GameObject cube2;
cube = GameObject.Find("Cube");
cube2 = GameObject.Find("Cube2");
|
Лучше так не делать каждый кадр, ибо поиск по имени - сложная операция. Вынеси это в Start если кубы не заменяются новыми со временем.
Сообщение от Костян
Это прикол Unity что оно не вызывает OnCollision*** если ригид кинематический???
|
Если кинематический и сталкивается с коллайдером или другим кинематическим телом - вероятно да.
Последний раз редактировалось pax, 22.08.2012 в 11:34.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
22.08.2012, 17:57
|
#602
|
Легенда
Регистрация: 14.10.2007
Сообщений: 3,878
Написано 2,012 полезных сообщений (для 5,072 пользователей)
|
Ответ: Вопросы от новичка
Сообщение от pax
Лучше так не делать каждый кадр, ибо поиск по имени - сложная операция. Вынеси это в Start если кубы не заменяются новыми со временем.
|
Моя забыть... 
|
(Offline)
|
|
24.08.2012, 18:38
|
#603
|
ПроЭктировщик
Регистрация: 04.11.2011
Сообщений: 176
Написано 19 полезных сообщений (для 64 пользователей)
|
Ответ: Вопросы от новичка
Добрый день. Решил сделать какую нибудь небольшую казуалку. Хотелось сделать все на GUI без лишних объектов. Возник вопрос по "тыку" по гемам. Как определить по какой текстурке ткнули мышкой?
|
(Offline)
|
|
24.08.2012, 22:06
|
#604
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
pie, проверяй попала ли мышь в rect твоей текстуры. вообще gui для этого не очень годится. хотч в 4й версии он уже навеоно батчится.
pax, вот именно что я не пойму как в инспекторе изменить поле, чтобы при нажатии на него было не редактирование строки, а выподал список методов скрипта. но как я понимаю такое не сделать. хотя еще можно было бы сделать, если можно было бы сделать инспектор не для скрипта, а для обычного класса. в данном случае класса SignalSender.
что вы за инспекторы в своей вселенной делаете? давно интересно было. можешь не очень тяжелый скрин сделать, а то инет мобильный.
|
(Offline)
|
|
25.08.2012, 01:23
|
#605
|
ПроЭктировщик
Регистрация: 04.11.2011
Сообщений: 176
Написано 19 полезных сообщений (для 64 пользователей)
|
Ответ: Вопросы от новичка
Спасибо. На 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"
}
|
(Offline)
|
|
25.08.2012, 11:05
|
#606
|
ПроЭктировщик
Регистрация: 04.11.2011
Сообщений: 176
Написано 19 полезных сообщений (для 64 пользователей)
|
Ответ: Вопросы от новичка
И еще один вопрос. Вот скрипт: 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]);
|
(Offline)
|
|
25.08.2012, 16:42
|
#607
|
ПроЭктировщик
Регистрация: 17.07.2012
Сообщений: 118
Написано 25 полезных сообщений (для 54 пользователей)
|
Ответ: Вопросы от новичка
Что лучше одна большая модель или много маленьких?
|
(Offline)
|
|
25.08.2012, 18:15
|
#608
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
много моделей - много дравколлов. хотя совсем мелкие модели сбатчатся, если материал один. но на это тоже время уйдет.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.08.2012, 18:35
|
#609
|
ПроЭктировщик
Регистрация: 04.11.2011
Сообщений: 176
Написано 19 полезных сообщений (для 64 пользователей)
|
Ответ: Вопросы от новичка
Кто нить сможет помочь с моей проблемой?
|
(Offline)
|
|
25.08.2012, 22:12
|
#610
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Вопросы от новичка
Сообщение от WISHMASTER35
pax, вот именно что я не пойму как в инспекторе изменить поле, чтобы при нажатии на него было не редактирование строки, а выподал список методов скрипта. но как я понимаю такое не сделать.
|
Элементарно:
using UnityEngine;
public class MethodsExample : MonoBehaviour
{
public string messageName = "";
void Start()
{
}
void Update()
{
}
}
using System.Reflection;
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(MethodsExample))]
public class MethodsExampleEditor : Editor
{
public override void OnInspectorGUI()
{
var obj = (MethodsExample) target;
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();
}
}
|
(Offline)
|
|
26.08.2012, 17:16
|
#611
|
Разработчик
Регистрация: 14.12.2008
Адрес: Томск
Сообщений: 530
Написано 270 полезных сообщений (для 883 пользователей)
|
Ответ: Вопросы от новичка
Сообщение от pie
Кто нить сможет помочь с моей проблемой?
|
А в чем, собственно, проблема?
Кольца должны всегда быть перпендикулярны камере?
|
(Offline)
|
|
26.08.2012, 20:04
|
#612
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Вопросы от новичка
Сообщение от cahekp
А в чем, собственно, проблема?
|
Проблема решена по аське.
|
(Offline)
|
|
29.08.2012, 17:50
|
#613
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
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'ов.
|
(Offline)
|
|
29.08.2012, 18:05
|
#614
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Вопросы от новичка
Ты говорил про невозможность, я тебе показал что это возможно. Лень скрипты (эдиторы) писать? Так и скажи.
|
(Offline)
|
|
29.08.2012, 19:42
|
#615
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
Как создать инспектор для одного скрипта я знаю. Я имел ввиду как изменить поле для своего типа во всех скриптах. Либо изменить инспектор для простого класса как тот ReceiverItem.
Если бы твой пример изменял дефолтный инспектор для ВСЕХ скриптов, то еще было бы нормально.
Лень скрипты (эдиторы) писать? Так и скажи.
|
Если таких скриптов будет больше, чем пальцев на руку, то у меня конечно мало желания писать еще для каждого Editor'ы, а эти редакторы еще настраивать\перенастраивать при добавлении\удалении такого string messageName.
Я хотел более\менее универсальный способ.
кстати, впервые вижу такие конструкции
() => obj.messageName = methodName
|
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:23.
|