Результаты поиска
| |
absolute_null | Дата: Понедельник, 11 Июня 2018, 23:39 | Сообщение # 1 | Тема: Поворот объекта по клику на 90 градусов. |
был не раз
Сейчас нет на сайте
| drcrack, Цитата если из-за неточности флоатов после поворота получилось 89.9999999981f то после каста будет 89 блин, вот, точно, теперь я понял. Вот оно и вылезло, поэтому на телефоне он просто не проходил проверку.
|
|
| |
absolute_null | Дата: Понедельник, 11 Июня 2018, 22:25 | Сообщение # 2 | Тема: Поворот объекта по клику на 90 градусов. |
был не раз
Сейчас нет на сайте
| drcrack, ну с флоатом я схитрил и привёл вообще всё к инту, а вот про зависимость от фпс я думал, скорее всего из-за этого
|
|
| |
absolute_null | Дата: Понедельник, 11 Июня 2018, 21:45 | Сообщение # 3 | Тема: Поворот объекта по клику на 90 градусов. |
был не раз
Сейчас нет на сайте
| drcrack, этот код работает и там и там, спасибо. Но странно, что мой код работает только на пк, а на телефоне баги. Дело в функции Update? На пк и телефоне разное время тика движка? Но он же всё равно должен проходить проверку...
|
|
| |
absolute_null | Дата: Понедельник, 11 Июня 2018, 20:34 | Сообщение # 4 | Тема: Поворот объекта по клику на 90 градусов. |
был не раз
Сейчас нет на сайте
| Вид 2d (поворот по часовой или против по координате Z). Нужно реализовать такой алгоритм. При нажатии на клавишу, объект плавно поворачивается на 90 градусов и останавливается. Затем, если опять нажать на клавишу, он повернётся ещё на 90 градусов и остановится. И так сколько угодно. Вот написал код:
Код using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;
public class PlayerController : MonoBehaviour {
private int x; private bool click;
private int currentPosition; private bool canInteract; private BoxCollider2D collisionPlayer;
private void Start() { x = 0; click = false; canInteract = false; collisionPlayer = GetComponent<BoxCollider2D>(); }
private void OnMouseDown() { if (collisionPlayer.enabled) { click = true; currentPosition = (int)transform.localEulerAngles.z; } }
private void Update() { if (click) { x = 10; transform.Rotate(transform.forward, x); int y = (int)transform.localEulerAngles.z - currentPosition; collisionPlayer.enabled = false; if (y == 90 || y == -270) { click = false; collisionPlayer.enabled = true; } } }
}
То есть, я кликаю, проверка в update срабатывает, и на каждый кадр объект поворачивается на 10 градусов (значение можно менять), пока разница между текущим и начальным положением поворота не будет 90 градусов (чтобы останавливать объект, когда пройдёт 90 градусов). Плюс под конец ещё проверка на -270, это потому что когда объект пройдёт полный круг, 0 - предыдущие 270 будет -270. Всё работает. Но на компе. Скомпилил на телефон, и либо объект проскакивает за 90, и поворачивается на 100 и больше градусов, либо начинает крутиться (потому что проверка не проходит, хотя фиг знает почему). Уже неделю не могу решить простую задачу: поворачивать плавно объект на 90 градусов на каждый клик.
Сообщение отредактировал absolute_null - Понедельник, 11 Июня 2018, 20:35 |
|
| |
absolute_null | Дата: Пятница, 08 Июня 2018, 18:27 | Сообщение # 5 | Тема: Slerp вращение по клику. |
был не раз
Сейчас нет на сайте
| Всем добрый день. Возник такой вопрос. Вращаю объект по Slerp на 90 градусов. Нужно, чтобы по клику, объект плавно повернулся по оси Z (вид 2d, т.е. объект повернётся по кругу), на 90 градусов. При следующем нажатии он повернулся на следующие 90 градусов. Делал так:
Код Quaternion a; Quaternion b; Quaternion rotate; float speed; bool test;
private void Start() { b = Quaternion.Euler(0f, 0f, 90f); //rotate = GetComponent<Quaternion>(); speed = 4f; test = false; }
private void OnMouseDown() { test = true; }
private void Update() { if (test) { transform.rotation = Quaternion.Slerp(transform.rotation, b, Time.deltaTime * speed); } Debug.Log(test); Debug.Log(transform.rotation.z); if(transform.rotation.z == 0.7f) { test = false; Debug.Log(test); b = Quaternion.Euler(0f, 0f, 180f); } }
Но здесь очень много проблем. Во-первых, не понятно, почему log даёт значение b и b.z как 0.7 (что это вообще), а не 90. Думал сравнивать, каждый раз, как закончит лерпиться, его вращение с нужным значением, чтобы давать булевую переменную false и прекращать лерп. А при клике опять начинать. Но не получается.
|
|
| |
absolute_null | Дата: Вторник, 08 Мая 2018, 20:50 | Сообщение # 6 | Тема: del |
был не раз
Сейчас нет на сайте
| del
Сообщение отредактировал absolute_null - Вторник, 08 Мая 2018, 23:48 |
|
| |
absolute_null | Дата: Воскресенье, 22 Апреля 2018, 20:50 | Сообщение # 7 | Тема: Динамическая отрисовка линии. |
был не раз
Сейчас нет на сайте
| InsaneSystems, да, спасибо. Всё решилось, когда я понял механизм LineRenderer. Не подумал, что нужно использовать две точки, думал, что в SetPosition и так можно задать две координаты типа Vector, 2 или 3, и про индексы не знал, в описании мало что написано.
|
|
| |
absolute_null | Дата: Воскресенье, 22 Апреля 2018, 19:31 | Сообщение # 8 | Тема: Динамическая отрисовка линии. |
был не раз
Сейчас нет на сайте
| Всем добрый вечер. Столкнулся с такой проблемой: пытаюсь рисовать динамически линию от одной точки на экране к другой. Механика: Пальцем нажимаю на экран, и веду по нему, и, от точки нажатия, до места, куда я повёл, рисуется линия, которая может увеличиваться, или, если я поведу обратно, уменьшаться. Так же эта линия прямая, и вращается за движением пальца. Ну т.е. рисуется на апдейте от точки нажатия до точки, куда я повёл палец.
Я дошёл до динамического измерения расстояния, между двумя точками. Вот код:
Код public Vector2 mousePos1; public Vector2 mousePos2;
public LineRenderer lineRenderer;
private void Start() { lineRenderer = GetComponent<LineRenderer>(); mousePos1 = new Vector2(0, 0); }
private void OnMouseDown() { mousePos2 = Camera.main.ScreenToWorldPoint(Input.mousePosition); }
private void OnMouseDrag() { if (mousePos2 != new Vector2(0, 0)) { mousePos1 = Camera.main.ScreenToWorldPoint(Input.mousePosition); Debug.Log(mousePos1); Debug.Log(Vector2.Distance(mousePos2, mousePos1));
lineRenderer.SetPosition(1, new Vector3( mousePos2.x, 0, 0)); } }
Т.е. у меня получилось определять точку нажатия, и следить за второй точкой. Но я не могу разобраться с самой отрисовкой линии. С LineRenderer проблемы, и походу, он не подойдёт для такой вещи.
|
|
| |
absolute_null | Дата: Воскресенье, 22 Апреля 2018, 19:29 | Сообщение # 9 | Тема: Вопрос-[ответ] по Unity |
был не раз
Сейчас нет на сайте
| Всем добрый вечер. Столкнулся с такой проблемой: пытаюсь рисовать динамически линию от одной точки на экране к другой. Механика: Пальцем нажимаю на экран, и веду по нему, и, от точки нажатия, до места, куда я повёл, рисуется линия, которая может увеличиваться, или, если я поведу обратно, уменьшаться. Так же эта линия прямая, и вращается за движением пальца. Ну т.е. рисуется на апдейте от точки нажатия до точки, куда я повёл палец.
Я дошёл до динамического измерения расстояния, между двумя точками. Вот код:
Код public Vector2 mousePos1; public Vector2 mousePos2;
public LineRenderer lineRenderer;
private void Start() { lineRenderer = GetComponent<LineRenderer>(); mousePos1 = new Vector2(0, 0); }
private void OnMouseDown() { mousePos2 = Camera.main.ScreenToWorldPoint(Input.mousePosition); }
private void OnMouseDrag() { if (mousePos2 != new Vector2(0, 0)) { mousePos1 = Camera.main.ScreenToWorldPoint(Input.mousePosition); Debug.Log(mousePos1); Debug.Log(Vector2.Distance(mousePos2, mousePos1));
lineRenderer.SetPosition(1, new Vector3( mousePos2.x, 0, 0)); } }
Т.е. у меня получилось определять точку нажатия, и следить за второй точкой. Но я не могу разобраться с самой отрисовкой линии. С LineRenderer проблемы, и походу, он не подойдёт для такой вещи.
|
|
| |
|