Вопрос-[ответ] по Unity
| |
QWER56 | Дата: Понедельник, 09 Августа 2010, 10:58 | Сообщение # 1 |
старожил
Сейчас нет на сайте
| Вопрос-[Ответ] по Unity3d
База скриптов Unity3d Курс Уроков по Unity 3D от Alcatraz
ConsMark - поисковик по интернет магазинам.
Сообщение отредактировал QWER56 - Вторник, 26 Июля 2011, 20:54 |
|
| |
seaman | Дата: Вторник, 16 Июля 2013, 23:27 | Сообщение # 4281 |
старожил
Сейчас нет на сайте
| Цитата как мне сделать чтобы он центр координат отсчитывал не от центра мира,а от камеры? Vector3 result = Vector3.исходный - camera.transform.position;
|
|
| |
error111 | Дата: Среда, 17 Июля 2013, 04:25 | Сообщение # 4282 |
заслуженный участник
Сейчас нет на сайте
| Прошу помощи. Начал ковыряться в Андроиде. Не могу понять как сделать инпут. По тутору из документации пытался сделать создание партикла в точке касания экрана. Тутор на js, я переделывал в c#. Код using UnityEngine; using System.Collections;
public class InputScript : MonoBehaviour { public GameObject particle; public Vector3 position; void Update() { foreach (Touch touch in Input.touches) { if (touch.phase == TouchPhase.Began) { Ray ray = Camera.main.ScreenPointToRay(touch.position); position = touch.position; if( Physics.Raycast(ray)) { Instantiate (particle, transform.position, transform.rotation); } } } } void OnGUI() { GUI.Label(new Rect(0,0,300,100), "PosX: " + position.x.ToString()); GUI.Label(new Rect(0,30,300,100), "PosY: " + position.y.ToString()); } }
Тачи приложение видит, коорды выводятся в ГУИ. Но вот партикл не создается. Что не так и что почитать? Юнити 4.1.
[Shmup/RPG] Fantasy Shmup!
|
|
| |
NEBR | Дата: Среда, 17 Июля 2013, 08:50 | Сообщение # 4283 |
почти ветеран
Сейчас нет на сайте
| error111, На С# вот так нужно :
public GameObject particle; void Update() { int i = 0; while (i < Input.touchCount) { if (Input.GetTouch(i).phase == TouchPhase.Began) { Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(i).position); if (Physics.Raycast(ray)) Instantiate(particle, transform.position, transform.rotation) as GameObject; } ++i; } }
King Size #Gamiron12
Сообщение отредактировал NEBR - Среда, 17 Июля 2013, 08:53 |
|
| |
error111 | Дата: Среда, 17 Июля 2013, 09:07 | Сообщение # 4284 |
заслуженный участник
Сейчас нет на сайте
| Цитата (NEBR) На С# вот так нужно
Увы, но не работает. Плюс приведение в виде as GameObject так не используется.
[Shmup/RPG] Fantasy Shmup!
Сообщение отредактировал error111 - Среда, 17 Июля 2013, 09:10 |
|
| |
NEBR | Дата: Среда, 17 Июля 2013, 09:11 | Сообщение # 4285 |
почти ветеран
Сейчас нет на сайте
| error111, а если попробовать не GameObject а Transform ?
King Size #Gamiron12
|
|
| |
error111 | Дата: Среда, 17 Июля 2013, 09:24 | Сообщение # 4286 |
заслуженный участник
Сейчас нет на сайте
| Цитата (NEBR) а если попробовать не GameObject а Transform ?
Нет, не канает. Ну и плюс в туторе стоит ГО - значит можно и через него сделать. У меня еще один косяк - не могу Ремоут настроить, приходится для теста каждый раз компилировать и закидывать на девайс(( Сейчас параллельно с тачем поставил инстаншиейт на инпут с клавы. Патиклы создаются, но только на МейнКамере. Это вполне логично - скрипт висит на ней. Судя по всему и в Андроид-версии патиклы спаунятся там-же и их просто не видно. Но чем задать им правильный трансформ?..не догоняю..
[Shmup/RPG] Fantasy Shmup!
|
|
| | |
NEBR | Дата: Среда, 17 Июля 2013, 10:36 | Сообщение # 4288 |
почти ветеран
Сейчас нет на сайте
| error111, щас быстренько соберу такую же сценку и через ремоут запущу, проверим )
Добавлено (17.07.2013, 10:06) --------------------------------------------- error111, скрипт правильный, все работает. Три нюанса : 1 - партиклы создаются при прикосновении к объекту с коллайдером. (на сцену нужно добавить хоть кубик, и нажимать на него) 2 - скрипт вешать нужно не на камеру, а на другой объект, который будет в поле зрения камеры. 3 - координаты созданных партиклов нужно приравнять к координатам нажатия. Сейчас набросаю рабочий скрипт и пришлю
Добавлено (17.07.2013, 10:14) --------------------------------------------- error111, кстати, твой скрипт рабочий, просто партиклы создаются не в поле видимости камеры (рабочий, опять же, если нажимать на объект с коллайдером)
---------------------------------------------
King Size #Gamiron12
Сообщение отредактировал NEBR - Среда, 17 Июля 2013, 11:22 |
|
| |
error111 | Дата: Среда, 17 Июля 2013, 10:36 | Сообщение # 4289 |
заслуженный участник
Сейчас нет на сайте
| Цитата (NEBR) кстати, твой скрипт рабочий, просто партиклы создаются не в поле видимости камеры
Ну это я уже более-менее понял. Создавать патиклы при Рэйхите у меня получалось. Вся загвоздка в создании ГО без хита по другому объекту. Ведь как-то же это возможно..
[Shmup/RPG] Fantasy Shmup!
|
|
| |
NEBR | Дата: Среда, 17 Июля 2013, 10:51 | Сообщение # 4290 |
почти ветеран
Сейчас нет на сайте
| error111, без хита по другому объекту это делается так: int i = 0; while (i < Input.touchCount) { if (Input.GetTouch(i).phase == TouchPhase.Began) Instantiate(prefab, transform.position, transform.rotation) as GameObject; ++i; }
King Size #Gamiron12
Сообщение отредактировал NEBR - Среда, 17 Июля 2013, 10:56 |
|
| |
E][pert | Дата: Среда, 17 Июля 2013, 11:04 | Сообщение # 4291 |
C#-XNA-Unity
Сейчас нет на сайте
| Цитата (E||pert) У меня такой вопрос, в какую сторону мне копать для отслеживания какое именно действие игрок сделал на таче. Например провел ли он снизу вверх пальцем прямую(возможны небольшие отклонения) или кривую.
Помогаю по мере возможностей, учусь по мере сил. ©E}{pert Tower defence in processing... For Web/iOS/Android.
|
|
| |
NEBR | Дата: Среда, 17 Июля 2013, 11:20 | Сообщение # 4292 |
почти ветеран
Сейчас нет на сайте
| E][pert, написать свой скрипт с использованием TouchPhase.Moved. Тут самое сложное - в апдейте просчитывать положение transform.position пальца на экране и (если проверяем прямая ли линия, проведенная снизу вверх) если разница между значениями по Y (здесь поможет Mathf.Clamp) больше определенного значения (диапазон самому нужно рассчитать) - то линия кривая. Если разница меньше нашего значения - то относительно прямая
King Size #Gamiron12
Сообщение отредактировал NEBR - Среда, 17 Июля 2013, 11:24 |
|
| |
error111 | Дата: Среда, 17 Июля 2013, 11:23 | Сообщение # 4293 |
заслуженный участник
Сейчас нет на сайте
| Цитата (NEBR) без хита по другому объекту это делается так
Работает, но ГО создается в координатах префаба. А как инстансить в точке нажатия?.
[Shmup/RPG] Fantasy Shmup!
|
|
| |
NEBR | Дата: Среда, 17 Июля 2013, 11:32 | Сообщение # 4294 |
почти ветеран
Сейчас нет на сайте
| error111, я сейчас работаю над этим. Ввел опять же твой вектор position и играю с ним. Видимо, придется самому делать калибровку экрана в этой сцене. Сделал камеру оргографической, по Z -10. Посмотрел диапазон зоны видимости, она составила (x(-66,66)y(-160,160)). Соответственно если партиклы попадают в этот диапазон , они видны. Сейчас нужно рассчитать коэффициент, и при создании частиц умножать позиции на него
King Size #Gamiron12
|
|
| |
error111 | Дата: Среда, 17 Июля 2013, 11:54 | Сообщение # 4295 |
заслуженный участник
Сейчас нет на сайте
| Цитата (NEBR) Сделал камеру оргографической, по Z -10. Посмотрел диапазон зоны видимости, она составила (x(-66,66)y(-160,160)). Соответственно если партиклы попадают в этот диапазон , они видны. Сейчас нужно рассчитать коэффициент, и при создании частиц умножать позиции на него
Ну так на сколько я понимаю если мы у камеры изменим размер проекции, то все эти коэффициенты полетят к чертям или нет?.Мне кажется должен быть более эргономичный способ.
[Shmup/RPG] Fantasy Shmup!
|
|
| |
NEBR | Дата: Среда, 17 Июля 2013, 11:59 | Сообщение # 4296 |
почти ветеран
Сейчас нет на сайте
| error111, верно, все полетит к чертям ) Способ должен быть. Вот думаю может все из за локальных/глобальных координат... Переключал их, не помогло...
King Size #Gamiron12
|
|
| |
E][pert | Дата: Среда, 17 Июля 2013, 12:14 | Сообщение # 4297 |
C#-XNA-Unity
Сейчас нет на сайте
| NEBR, спасибо, но это как бы очевидно) Я уже начал реализовывать на этой основе. Тут у меня еще такой вопрос, как оптимальней записывать в массив позицию?
Помогаю по мере возможностей, учусь по мере сил. ©E}{pert Tower defence in processing... For Web/iOS/Android.
Сообщение отредактировал E][pert - Среда, 17 Июля 2013, 12:14 |
|
| |
NEBR | Дата: Среда, 17 Июля 2013, 17:16 | Сообщение # 4298 |
почти ветеран
Сейчас нет на сайте
| error111, может проблема в единицах измерения? Размер экрана 320 на 480 в пикселях, и координаты соответственно в них. А transform.position партиклов - в юнит, равном 1 метру...
Добавлено (17.07.2013, 13:11) --------------------------------------------- Да, проблема именно в них. Настроил камеру так чтобы 1 пиксель соответствовал стандартной еденице измерения юнити unit, равной 1 метру. Дописываю скрипт, половина его уже готова, работает корректно. Как закончу - выложу
Добавлено (17.07.2013, 13:48) --------------------------------------------- error111, Проблема решена. Подойдет только для разрешения 320 на 480, но по аналогии можно под любое сделать. Вообщем сперва на пустой сцене (без камеры) создаем куб. На него вешаем ortho2dCamera . Этот скрипт создаст на кубе камеру и автоматически выставит в ее настройках нужные значения, чтобы экран был пиксель в юнит. using UnityEngine; [ExecuteInEditMode] [RequireComponent(typeof(Camera))] internal class ortho2dCamera : MonoBehaviour { [SerializeField] private bool uniform = true; [SerializeField] private bool autoSetUniform = false; private void Awake() { camera.orthographic = true; if (uniform) SetUniform(); } private void LateUpdate() { if (autoSetUniform && uniform) SetUniform(); } private void SetUniform() { float orthographicSize = camera.pixelHeight/2; if (orthographicSize != camera.orthographicSize) camera.orthographicSize = orthographicSize; } } Затем на этот же куб вешаем скрипт touchParticle using UnityEngine; using System.Collections; public class touchParticle : MonoBehaviour { public GameObject particle; public Vector3 position; public Vector3 positionTouch; void Update() { int i = 0; foreach (Touch touch in Input.touches) { if (Input.GetTouch(i).phase == TouchPhase.Began) { position = touch.position; if(position.x < 160) { positionTouch.x = (-(160 - position.x)-10); // последнее значение 10 возможно вам не понадобится, скорее всего мне пришлось его ввести из за плохой калибровки экрана // на своем девайсе } else { positionTouch.x = (160 - (320 - position.x) + 10); } if(position.y < 240) { positionTouch.y = (-(240 - position.y)-10); } else { positionTouch.y = (240 - (480 - position.y) + 10); } Instantiate(particle,positionTouch,transform.rotation); ++i; } } } void OnGUI() { GUI.Label(new Rect(0,0,300,100), "PosX: " + position.x.ToString()); GUI.Label(new Rect(0,30,300,100), "PosY: " + position.y.ToString()); } } Затем создаем префаб партиклов и линкуем его со скриптом. Все, отлично работаетДобавлено (17.07.2013, 17:16) --------------------------------------------- E][pert, как записывать в массив позицию http://unity3d.ru/distribution/viewtopic.php?f=104&t=8418&p=65539&hilit=%D0%BA%D0%B0%D0%BA+%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C+%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2+%D1%81+%D0%BA%D0%BE%D0%BE%D1% 80%D0%B4%D0%B8%D0%BD%D0%B0%D1%82%D0%B0%D0%BC%D0%B8#p65539
King Size #Gamiron12
Сообщение отредактировал NEBR - Среда, 17 Июля 2013, 13:52 |
|
| |
Omlette | Дата: Среда, 17 Июля 2013, 22:43 | Сообщение # 4299 |
частый гость
Сейчас нет на сайте
| Всем здрасьте! А у меня такая проблема...
В общем нужно сделать, чтоб при нажатии на ГО с некоторым тегом появлялся бар. Это все легко. Проблем не было, когда я все писал в одном скрипте:
Код using UnityEngine; using System.Collections;
public class monster_bar : MonoBehaviour { public readonly int lv = monster_stats.monster_level; public readonly int hp = monster_stats.monster_hp; public int cur_hp = monster_stats.monster_cur_hp; public Texture2D monster_img; public bool Show_bar = false; public string Target_name; public GUISkin skin; //strings public string mclass; public string class_title; //sound public AudioClip Click_mob; // Use this for initialization void Start () { cur_hp = hp; } // Update is called once per frame void Update() { if (Input.GetMouseButtonUp(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit, 65)) { Debug.DrawLine(ray.origin, hit.point); if(hit.collider.gameObject.tag == "monster") { Show_bar = true; target_name = hit.collider.gameObject.name; audio.PlayOneShot(Click_mob); } else { Show_bar = false; target_name = null; } } } if (Input.GetKeyDown(KeyCode.Escape)) { Show_bar = false; target_name = null; } } void OnGUI() { GUI.skin = skin; if (ShowBar == true) { GUI.Box(new Rect(0.5f * Screen.width, 0.048f * Screen.height, Screen.width * 0.109f, Screen.height * 0.08f), Target_name, GUI.skin.GetStyle("monster_bar")); GUI.Label(new Rect(0.503f * Screen.width, 0.077f * Screen.height, Screen.width * 0.01f, Screen.height * 0.01f), "Health: " + hp + " / " + cur_hp, GUI.skin.GetStyle("hp_ch_status")); GUI.Label(new Rect(0.503f * Screen.width, 0.103f * Screen.height, Screen.width * 0.01f, Screen.height * 0.01f), class_title + ": " + mclass, GUI.skin.GetStyle("hp_ch_status")); } } }
Однако мне нужно, чтобы все это лежало во втором скрипте, а этот только отображал на экран.
Пытаюсь так:
1. Основной скрипт monster_targetting:
Код using UnityEngine; using System.Collections;
public class monster_targetting : MonoBehaviour { static private bool _Show_bar = false; static private string _target_name; static public bool Show_bar { get { return _Show_bar; } set { _Show_bar = value; } } static public string target_name { get { return _target_name; } set { _target_name = value; } } //sounds static readonly AudioClip Click_mob; // Use this for initialization void Start () { } // Update is called once per frame void Update() { if (Input.GetMouseButtonUp(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //получим координаты мышки RaycastHit hit; //Объявим структуру, из которой будем брать данные if (Physics.Raycast(ray, out hit, 65)) //возвращает true если сталкивается с чем либо { Debug.DrawLine(ray.origin, hit.point); //покажем линией на выделяемый объект. if(hit.collider.gameObject.tag == "monster") // Разрешаем помечать объекты только с этим тегом { Show_bar = true; target_name = hit.collider.gameObject.name; audio.PlayOneShot(Click_mob); } else { Show_bar = false; target_name = null; } } } if (Input.GetKeyDown(KeyCode.Escape)) { Show_bar = false; target_name = null; } } }
2. Ну и второй, получающий переменные и выводящий на экран панель:
Код using UnityEngine; using System.Collections;
public class monster_bar : MonoBehaviour { public readonly int lv = monster_stats.monster_level; public readonly int hp = monster_stats.monster_hp; public int cur_hp = monster_stats.monster_cur_hp; public Texture2D monster_img; public string Target_name = monster_targetting.target_name; public bool ShowBar = monster_targetting.Show_bar; public GUISkin skin; //strings public string mclass; public string class_title; //sound public AudioClip Click_mob; // Use this for initialization void Start () { cur_hp = hp; } // Update is called once per frame void Update () { } void OnGUI() { GUI.skin = skin; if (ShowBar == true) { GUI.Box(new Rect(0.5f * Screen.width, 0.048f * Screen.height, Screen.width * 0.109f, Screen.height * 0.08f), Target_name, GUI.skin.GetStyle("monster_bar")); GUI.Label(new Rect(0.503f * Screen.width, 0.077f * Screen.height, Screen.width * 0.01f, Screen.height * 0.01f), "Health: " + hp + " / " + cur_hp, GUI.skin.GetStyle("hp_ch_status")); GUI.Label(new Rect(0.503f * Screen.width, 0.103f * Screen.height, Screen.width * 0.01f, Screen.height * 0.01f), class_title + ": " + mclass, GUI.skin.GetStyle("hp_ch_status")); } } }
Очень много чего испробовал, ничего не вышло. Отображающий скрипт не ловит значения переменных (свойств)....
П.С. Сорри если есть где копи-паст ошибка в скриптах. Заранее благодарю откликнувшимся!
Я все смогу! Я все сумею! Переживу! Переболею! Перекантуюсь! Перебьюсь! Но своего таки добьюсь! Не упаду! Не утону! Из грязи вырвусь! Я смогу! И вновь улыбка засияет! Я все смогу! Я все сумею! Я не боюсь! Я не жалею!
Сообщение отредактировал Omlette - Среда, 17 Июля 2013, 22:44 |
|
| |
NEBR | Дата: Четверг, 18 Июля 2013, 11:41 | Сообщение # 4300 |
почти ветеран
Сейчас нет на сайте
| Omlette, попробуй другим способом. Здесь ведь можно сделать проще, не через get set, а использовать GetComponent.
King Size #Gamiron12
|
|
| |
|