|
Общие вопросы вопросы не попадающие ни в один из доступных разделов |
10.01.2012, 00:24
|
#181
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
При рейкасте луч врезается в самого же игрока, который пустил луч. Если луч дальше отодвинуть от игрока, то может будет пропускать врагов, которые рядом(
|
(Offline)
|
|
10.01.2012, 00:34
|
#182
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Вопросы от новичка
помести игрока в другой слой, стреляй во все, кроме этого слоя. С врагами можно поступить так же.
|
(Offline)
|
|
10.01.2012, 17:37
|
#183
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
А как в С# лучше такое сообщение передать объекту в который попал?
Хотел повесить на скрипт интерфейс, которому и передавать это сообщение, но GetComponent не хочет искать компонент с моим интерфейсом(
Хотя можно просто все скрипты объекта проверить на принадлежность интерфейсу и вызвать нужный метод в нужных объектах.
Последний раз редактировалось WISHMASTER35, 10.01.2012 в 20:43.
|
(Offline)
|
|
10.01.2012, 22:40
|
#184
|
ПроЭктировщик
Регистрация: 12.02.2011
Сообщений: 131
Написано 23 полезных сообщений (для 52 пользователей)
|
Ответ: Вопросы от новичка
WISHMASTER35, странно, что не ищет. Ты уверен, что компонент висит? Может в имени ошибка? Код в студию.
Расскажу про свой топорный метод решения схожей задачи:
1. Создаем класс
class RayReceiver : MonoBehaviour {
public virtual void OnRay()
{
// тут помещаем стандартный обработчик, например уничтожить объект
}
}
Теперь допустим есть несколько разных классов, которые должны принимать сообщение о приходящем луче.
Тогда класс наследуем не от MonoBehaviour, а от RayRaceiver
class TestClass : RayReceiver {
// можно не писать, если устроит стандартный
public override void OnRay()
{
// тут помещается обработчик, уникальный для класса. Позже можем вызвать родительский, если надо
}
}
Где то в обработчиках нажатия
if (Input.GetMouseButtonDown(0))
{
Ray ray = mlCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (!Physics.Raycast(ray, out hit))
return;
RayReceiver rr = hit.collider.gameObject.GetComponent<RayReceiver>();
if (rr != null)
rr.OnRay();
}
C# вроде запрещает множественное наследование, но поскольку у меня иерархия объектов простая, как и сама задача, то такое вот решение меня вполне устраивает.
P.S. Кстати нашел баг: допустим лежит кубик с RigidBody на другом c BoxCollider, то сообщение OnCollissionStay через некоторое время перестает приходить, пока кубику с RigidBody WakeUp() не сделать.
|
(Offline)
|
|
10.01.2012, 23:10
|
#185
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
Aikon, не совсем правильно ты делаешь. Для этого используются интерфейсы.
И если у тебя есть класс, который уже наследуется от друга твоего класса, то твой способ не сработает.
Я сделал интерфейс
public interface BulletReceiver {
void Attacked(Vector3 point);
}
Могу добавить этот интерфейс любому скрипту.
А при выстреле делаю так:
MonoBehaviour[] components = hit.collider.gameObject.GetComponents<MonoBehaviour>();
foreach( MonoBehaviour component in components ) {
if( component is BulletReceiver ) {
( ( BulletReceiver ) component ).Attacked( hit.point );
}
}
GetComponents ищет все что унаследовано от Component, поэтому мой интерфейс и не искало. Вот только без поиска нельзя получить список всех скриптов?
Я вот только не понял в C# и родительские классы и интерфейсы пишутся через запятую после двоеточия? В java для наследования используется extends, а для интерфейсов implements.
|
(Offline)
|
|
11.01.2012, 00:10
|
#186
|
ПроЭктировщик
Регистрация: 12.02.2011
Сообщений: 131
Написано 23 полезных сообщений (для 52 пользователей)
|
Ответ: Вопросы от новичка
Я вот только не понял в C# и родительские классы и интерфейсы пишутся через запятую после двоеточия?
|
Как известно множественное наследование в таких языках как Java и С# отсутствует, т.к. является потенциальным источником ошибок. Вместо него разработчику предлагается использовать механизм интерфейсов.
|
Т.е. сначала пишем один базовый класс, если надо, потом через запятую далее необходимые интерфейсы сколько надо.
С классом да, налажал, забыл глянуть что есть интерфейсы. Переделал. У меня все проходит. Вот код
Интерфейс
public interface ITest {
void echo(string text);
}
Компонента CTest, которая реализует интерфейс ITest.
Чтобы она могла быть найдена через GetComponent я так же отнаследовал ее от базового класса MonoBehaviour
using UnityEngine;
using System.Collections;
public class CTest : MonoBehaviour, ITest {
public void echo(string text)
{
Debug.Log(text);
}
}
В пустом проекте на камеру повесил компонент CTest и общий компонент для теста
using UnityEngine;
using System.Collections;
public class Common : MonoBehaviour {
void Start () {
// Мне вот этот кривой перебор не нравится. Даже если для каждого объекта результат в член класса запихнуть.
foreach (MonoBehaviour mb in this.GetComponents<MonoBehaviour>())
{
if (mb is ITest)
((ITest)mb).echo("OK");
}
}
}
|
(Offline)
|
|
11.01.2012, 00:45
|
#187
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
Чтобы она могла быть найдена через GetComponent я так же отнаследовал ее от базового класса MonoBehaviour
|
Все равно ты ищешь по MonoBehaviour, а не по имени интерфейса.
А OnPostRender вызывается только у камеры? Нету методов, которые вызывались бы после рендеринга или перед Update?
Кстате, я так и не понял Raycast будет попадать в CharacterContoller? Ведь он сам использует CapsuleCast. Как тут быть?
|
(Offline)
|
|
11.01.2012, 00:58
|
#188
|
ПроЭктировщик
Регистрация: 12.02.2011
Сообщений: 131
Написано 23 полезных сообщений (для 52 пользователей)
|
Ответ: Вопросы от новичка
WISHMASTER35, т.е. ты хочешь выполнять поиск не компонентам и потом проверять у них наличие интерфейса, а выполнять поиск по наименованию интерфейса, отбирая компоненты, которые поддерживают его, а потом вызывать метод у тех компонент, где данный интерфейс реализован? Вроде теже яйца, только вид с боку и не факт, что поддерживается Unity (pax думаю придет напишет).
С главным циклов в Unity не все понятно. Т.е. если на сцену два кубика добавить и у каждого Update задать, то порядок вызовов этих Update-ов мне кажется заранее не будет известен, либо не стоит к нему привязываться.
Можно попробовать использовать LateUpdate (только для потомков MonoBehaviour) и FixedUpdate (только для физических тел).
|
(Offline)
|
|
11.01.2012, 01:34
|
#189
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
Aikon, да я же и писал, что GetComponent не ищет по имени интерфейса.
А зачем вообще нужно знать порядок вызовов Update?
У меня в Update у оружия вызывается метод принятия пули у врага. Я хочу в этом методе принятия пули сделать врага красным, а после одного рендеринга сделать его снова белым. Но как это сделать после того как отрендерился красный враг хз. По крайней мере без дополнительных переменных. А то можно в OnWillRender поднять флаг, что в следующем Update сделать врага снова белым.
|
(Offline)
|
|
11.01.2012, 02:17
|
#190
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Вопросы от новичка
А не проще
hit.collider.gameObject.SendMessage("OnRay", SendMessageOptions.DontRequireReceiver);
никакие интерфейсы не нужны. Просто реализуйте функцию где нужно.
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
|
|
11.01.2012, 19:54
|
#191
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
Жаль только через SendMessage не передать больше одного параметра(
А кто-нибудь делал GUI для разных экранов? Как его сделать, что бы нормально смотрелось? Настроил под свой размер, а на маленьком джойстик на пол экрана и даже сдвинуть его не куда. И можно получить плотность пикселей?
|
(Offline)
|
|
11.01.2012, 20:48
|
#192
|
Бывалый
Регистрация: 24.05.2011
Адрес: Украина,Харьков
Сообщений: 890
Написано 359 полезных сообщений (для 880 пользователей)
|
Ответ: Вопросы от новичка
Через Screen получить текущее разрешение экрана и исходя из него позиционировать. Мессаги медленная операция.
__________________
Нам суждено построить мосты и храмы,которых никогда не существовало и не могло существовать в природе.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
11.01.2012, 22:16
|
#193
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
Lestar, по ширине или длине экрана выравнивать? На планшетах не будет очень большими элементы? тут желательно плотность пикселей еще знать.
|
(Offline)
|
|
11.01.2012, 23:40
|
#194
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Вопросы от новичка
если использовать ортогональную камеру и плейны, то высота ортогональной камеры выстанавливается в половину высоты экрана, если экран уменьшается, то плены остаются в том же масштабе относительно размеров экрана. Единственное можно скорректировать горизонтальную позицию немного. Интерфейс такой можно рендерить отдельной камерой.
|
(Offline)
|
|
11.01.2012, 23:58
|
#195
|
Бывалый
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений (для 357 пользователей)
|
Ответ: Вопросы от новичка
pax, т.е. рисовать не через GUI, а в 3д? Тогда еще сложнее будет т.к. все будет растягиваться в зависимости от соотношения сторон. Ну ладно как нибудь буду подстраивать размеры GUITexture.
Кстати, нет скрипта что-то типа GUITexture, только чтобы отслеживал нажатие мышкой\тачем на текстуру как GUI.Button? А то из-за такой мелочи свой скрипт создавать не очень хочется)
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:07.
|