|
Unity Мультиплатформенный инструмент для разработки игр |
10.09.2010, 23:37
|
#286
|
Разработчик
Регистрация: 06.08.2007
Сообщений: 473
Написано 131 полезных сообщений (для 257 пользователей)
|
Ответ: Визуальный редактор логики для Unity
расскажите пожалуйста об антаресе подробней. желательно отдельной темой. Кто, когда, для чего, как, зачем?
|
(Offline)
|
|
10.09.2010, 23:40
|
#287
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Визуальный редактор логики для Unity
Сообщение от Illidan
расскажите пожалуйста об антаресе подробней. желательно отдельной темой. Кто, когда, для чего, как, зачем?
|
документация на русском
Страница скачивания
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.09.2010, 23:53
|
#288
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Фак по Юнити.
там его точно нет Да и кто его будет переозвучивать...
|
(Offline)
|
|
26.09.2010, 00:34
|
#289
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Фак по Юнити.
Сообщение от Andvrok
Ну не создавать же тему ради одного вопроса о мануале?
|
А кто говорил о создании тамы ?
|
(Offline)
|
|
24.10.2010, 04:38
|
#290
|
Разработчик
Регистрация: 06.08.2007
Сообщений: 473
Написано 131 полезных сообщений (для 257 пользователей)
|
Ответ: Фак по Юнити.
как перевести 3д координаты в двумерные?
|
(Offline)
|
|
24.10.2010, 08:42
|
#291
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Фак по Юнити.
Если я правильно понял, то нужно спроецировать точку на экран? Тогда вот эти функции камеры помогут:
Camera.WorldToScreenPoint
Camera.WorldToViewportPoint
Camera.ScreenToViewportPoint
Последний раз редактировалось pax, 24.10.2010 в 09:51.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
03.11.2010, 17:22
|
#292
|
AnyKey`щик
Регистрация: 23.10.2010
Адрес: UKRAINE,Crimea,Simferopol
Сообщений: 4
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Фак по Юнити.
Всем привет)
У меня вопрос!
о GUILayer.HitTest
я для камеры игрока сделал такой скрипт - камера над игроком и не поворачивается и привязал кней управление:
кликаю мышью в пустое место на плане - ставлю объект (маркер),
кликаю на врага - атакую.
проблема в том, что когда кликаю на GUI ставиться и маркер , я попробовал сделать это с помощью GUILayer.HitTest, но ничего не получилось
вот скрипт , помогите решить такую задачу
using UnityEngine;
using System.Collections;
public class PlayerCamera: MonoBehaviour {
// положение камеры относительно Player
public float XCamera = -20;
public float YCamera = 30;
public float ZCamera = -20;
private Transform _thisTransform;
private Transform _playerTransform;
private Transform _MarkerTransform;
private GameObject _Marker;
private GameObject _player;
// Use this for initialization
void Start () {
// Получаем компонент трансформации объекта, к которому привязан данный компонент
_thisTransform = transform;
// Получаем компонент трансформации игрока и маркера
_player = GameObject.Find("Player");
_playerTransform = _player.transform;
_Marker = GameObject.Find("Marker");
_MarkerTransform = _Marker.transform;
}
public void OnGUI() {
// тестовая GUI область
GUILayout.BeginArea(new Rect(100, 100, 200, 200), GUI.skin.box);
GUILayout.Button("TEST");
GUILayout.EndArea();
}
// Update is called once per frame
void Update () {
GUILayer _GUILayer = Camera.main.GetComponent<GUILayer>();
if (Input.GetMouseButtonDown(0) && _GUILayer.HitTest(Input.mousePosition) == null) {
Ray _ray = camera.ScreenPointToRay (Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast (_ray, out hit)) {
// атакуем Enemy
if (hit.collider.gameObject.tag == "Enemy") {
if (Vector3.Distance(_playerTransform.position, рit.collider.gameObject.transform.position) < 3.0f) {
hit.collider.gameObject.GetComponent<Enemy>().HealthInc();
}
}
// ставем маркер на поле
if (hit.collider.gameObject.tag == "Plane") {
_MarkerTransform.position = new Vector3(hit.point.x, 1, hit.point.z);
_Marker.active = true;
}
}
}
_thisTransform.position = new Vector3( _playerTransform.position.x+XCamera, YCamera, _playerTransform.position.z+ZCamera);
}
}
|
(Offline)
|
|
03.11.2010, 19:05
|
#293
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Фак по Юнити.
Должно решиться просто. Смотрим пост выше и применяем первую функцию. Заменяем:
if (Input.GetMouseButtonDown(0) && _GUILayer.HitTest(Input.mousePosition) == null) {
на
if (Input.GetMouseButtonDown(0) && _GUILayer.HitTest(Camera.main.WorldToScreenPoint (Input.mousePosition)) == null) {
UPD:
Хотя только сейчас понял что не прав... наверное из-за того что голова болит... возможно стоит инвертировать ось Y у мыши. Т.е.:
Vector2 mp = Input.mousePosition; mp.y = Screen.height - mp.y; if (Input.GetMouseButtonDown(0) && _GUILayer.HitTest(mp) == null) {
Сам бы я пошел другим путем, я бы проверил попадает ли mp в Rect области GUI, т.е. (new Rect(100, 100, 200, 200)).Contains(mp);.
Последний раз редактировалось pax, 03.11.2010 в 20:46.
|
(Offline)
|
|
03.11.2010, 21:44
|
#294
|
Дэвелопер
Регистрация: 21.11.2009
Адрес: Киев
Сообщений: 1,699
Написано 657 полезных сообщений (для 1,962 пользователей)
|
Ответ: Фак по Юнити.
Я знаю координаты объекта. Как мне получить доступ к самому объекту?
|
(Offline)
|
|
03.11.2010, 22:31
|
#295
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Фак по Юнити.
Как-то с другого конца...
Можно найти все трансформы в сцене и сравнить их координаты с имеющимися.
Но проще дать объекту имя или тэг по которому можно будет его найти или ограничить поиск.
|
(Offline)
|
|
03.11.2010, 23:50
|
#296
|
Дэвелопер
Регистрация: 21.11.2009
Адрес: Киев
Сообщений: 1,699
Написано 657 полезных сообщений (для 1,962 пользователей)
|
Ответ: Фак по Юнити.
Сообщение от pax
Как-то с другого конца...
Можно найти все трансформы в сцене и сравнить их координаты с имеющимися.
Но проще дать объекту имя или тэг по которому можно будет его найти или ограничить поиск.
|
Примерно так я думал, спасибо. Ещё, я не нашёл, как перебирать все трансформы в сцене.
|
(Offline)
|
|
04.11.2010, 03:34
|
#297
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Фак по Юнити.
Вот так можно:
Transform[] transforms = (Transform[]) FindObjectsOfType(typeof (Transform)); foreach (Transform sceneTransform in transforms) { if (sceneTransform.position == myPos) { //объект найден
break; } }
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
04.11.2010, 10:14
|
#298
|
AnyKey`щик
Регистрация: 23.10.2010
Адрес: UKRAINE,Crimea,Simferopol
Сообщений: 4
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Фак по Юнити.
Хотя только сейчас понял что не прав... наверное из-за того что голова болит... возможно стоит инвертировать ось Y у мыши. Т.е.:
Vector2 mp = Input.mousePosition; mp.y = Screen.height - mp.y; if (Input.GetMouseButtonDown(0) && _GUILayer.HitTest(mp) == null) {
Сам бы я пошел другим путем, я бы проверил попадает ли mp в Rect области GUI, т.е. (new Rect(100, 100, 200, 200)).Contains(mp);.
|
Y - мыши я переворачивал, забыл написать, ничего не происходило, хотя именно так конечно правильно, но и так GUI не видит .
А перебирать все GUI на пересечение по Rect не очень удобно, это у меня в примере тестовый GUI, а ведь их может быть много на экране и еще динамические, хотелось бы победить эту штуку, второй день бъюсь
Ну а если с Rect, то как найти все GUI?
|
(Offline)
|
|
04.11.2010, 11:27
|
#299
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Фак по Юнити.
Сообщение от Stanis1av
Ну а если с Rect, то как найти все GUI?
|
Достаточно зарегистрировать в каком-то компоненте все области, в которых находятся элементы GUI.
Можно попробовать так:
public class MouseOnGUITester:MonoBehaviour { public static readonly Dictionary<string,Rect> GUIRects = new Dictionary<string,Rect>(); public static bool mouseOnGUI = false;
public void Update() { Vector2 mp = Input.mousePosition; mp.y = Screen.height - mp.y; mouseOnGUI = false; foreach (var rect in GUIRects) { if(rect.Value.Contains(mp)) { mouseOnGUI = true; break; } } }
public static void RegisterRect(string rectName, Rect rect) { GUIRects[rectName] = rect; }
public static void UnRegisterRect(string rectName) { if(GUIRects.ContainsKey(rectName) GUIRects.Remove(rectName); } }
Бросить этот компонент на любой объект в сцене и регистрировать по имени все области, в которых GUI есть. Если область исчезает - разрегистрировать ее (например в OnDisable компонента с GUI). Если Область изменила размер или положение, то ее можно зарегистрировать заново.
Пользоваться:
// регистрация public void Start() { MouseOnGUITester.RegisterRect("MyMenuRect", new Rect(100, 100, 200, 200)); }
// разрегистрация public void OnDisable() { MouseOnGUITester.UnRegisterRect("MyMenuRect"); }
// проверка public void Update() { if (!MouseOnGUITester.mouseOnGUI ) { // действие } }
PS: писал сразу сюда, возможно ошибок налепил...
|
(Offline)
|
|
05.11.2010, 10:22
|
#300
|
AnyKey`щик
Регистрация: 23.10.2010
Адрес: UKRAINE,Crimea,Simferopol
Сообщений: 4
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Фак по Юнити.
идея понятна, но всё же - это как-то "сложно" должно быть какое-то стандартное решение.
Спасибо paxу
за подержку
Ведь эта тема толком нигде не описана
Единственное, что я нашел - это существует какая-то несовместимось GUI в Unity, это - старый стиль графического интерфейса (из классов GUIElement, GUITexture, GUIText, GUILayer) и новый (именуемые " UnityGUI "и из всех других классов GUIAnything, и OnGUI () вызова). Так что если вы используете UnityGUI, HitTest ничего не найдете.
pax если что-то знаете , расскажите плз
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:04.
|