Вращение и поворот обьекта
|
|
ZVEN | Дата: Суббота, 10 Сентября 2016, 21:32 | Сообщение # 1 |
почетный гость
Сейчас нет на сайте
| Привет. Нужно чтобы по кругу (внутри фигуры) вращался прямоугольник маленький. Нужно поворачивать его на определенный угол каждый кадр. Как так сделать? Сейчас пробую задать одну позицию и повернуть его относительно центра? Вот скрин Скрин
Код void NewPos() { angle = 180; angle = angle * Mathf.Deg2Rad;
float x = 0 + Mathf.Cos(angle) * distance; float y = -1.9f + Mathf.Sin(angle) * distance;
Vector2 pos = new Vector2(x, y); Debug.Log(pos); transform.Rotate(0, 0, angle); transform.position = pos; }
Добавлено (10 сентября 2016, 21:32) --------------------------------------------- А с transform.Rotate(0, 0, angle); он крутится постоянно((
|
|
| |
Lertmind | Дата: Суббота, 10 Сентября 2016, 21:59 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| RotateAround в помощь - крутит вокруг точки в пространстве. Чаще всего использование тригонометрических функций не нужно и их стоит избегать.
|
|
| |
ZVEN | Дата: Суббота, 10 Сентября 2016, 22:04 | Сообщение # 3 |
почетный гость
Сейчас нет на сайте
| Тогда как сделать что прямоугольник постоянно бегал например по окружности круга и при этом как бы поворачивался в зависимости от положения? Без тригонометрических функция я не знаю как обойтись.Добавлено (10 сентября 2016, 22:04) --------------------------------------------- А... Понял идею
|
|
| |
Lertmind | Дата: Суббота, 10 Сентября 2016, 22:16 | Сообщение # 4 |
заслуженный участник
Сейчас нет на сайте
| ZVEN, сейчас проверил, прямоугольник движется как стрелка часов:
Код using UnityEngine;
public class RotateAroundPoint : MonoBehaviour { void Update() { transform.RotateAround(new Vector3(0f, 0f, 0f), Vector3.forward, -20 * Time.deltaTime); } } Добавлено (10 сентября 2016, 22:16) --------------------------------------------- Про тригонометрические функции погорячился, забыл что в матрицах поворота это тоже используется, хотя есть кватернионы. Но я не знаю как это реализовано в Unity, просто лучше не использовать свои велосипеды, скорее всего в Unity это работает эффективнее.
|
|
| |
ZVEN | Дата: Суббота, 10 Сентября 2016, 22:22 | Сообщение # 5 |
почетный гость
Сейчас нет на сайте
| Спасибо, только у меня точка в двухмерном простанстве (0, -1.9). Не могу чет сместить. А так спасибо.
|
|
| |
Lertmind | Дата: Суббота, 10 Сентября 2016, 22:33 | Сообщение # 6 |
заслуженный участник
Сейчас нет на сайте
| ZVEN, должно работать, если написать transform.RotateAround(new Vector3(0f, -1.9f, 0f), Vector3.forward, -20 * Time.deltaTime); Кстати, в твоём коде была ошибка из-за того, что ты не изменял angle и позиция всегда была одна и та же.
|
|
| |
ZVEN | Дата: Суббота, 10 Сентября 2016, 22:41 | Сообщение # 7 |
почетный гость
Сейчас нет на сайте
| Я так пробовал, тогда он крутится на месте вокруг себя. Я изначально так и пробовал. Только когда (0,0,0) попробовал, удивился что все заработало.
А на счет моего кода, могу сказать, что я специально не менял позицию чтоб хотя бы раз поставить нужное положение, а потом менять.Добавлено (10 сентября 2016, 22:40) --------------------------------------------- Пробую так transform.RotateAround(new Vector3(0f, -1.9f, 0f), Vector3.forward, -50 * Time.deltaTime); Не могу понять от чего зависит размах траектории Добавлено (10 сентября 2016, 22:41) --------------------------------------------- Если пишу -2.9 то крутится но не быстро и размах небольшой
|
|
| |
Lertmind | Дата: Суббота, 10 Сентября 2016, 22:46 | Сообщение # 8 |
заслуженный участник
Сейчас нет на сайте
| ZVEN, у прямоугольника есть родитель? Предполагаю проблема в pivot point.
|
|
| |
ZVEN | Дата: Суббота, 10 Сентября 2016, 23:23 | Сообщение # 9 |
почетный гость
Сейчас нет на сайте
| Есть, это как раз круг. То-есть он наследуется от круга.Добавлено (10 сентября 2016, 23:23) --------------------------------------------- Пробовал выше поставить, без наследования. Чет ничего не изменилось.
|
|
| |
Lertmind | Дата: Суббота, 10 Сентября 2016, 23:31 | Сообщение # 10 |
заслуженный участник
Сейчас нет на сайте
| ZVEN, когда вынес в корень, координаты должны были измениться на мировые, это надо учесть. Можешь кинуть проект, я посмотрю.
|
|
| |
ZVEN | Дата: Воскресенье, 11 Сентября 2016, 14:49 | Сообщение # 11 |
почетный гость
Сейчас нет на сайте
| Спасибо огромное. Просто перенес в корень, но забыл убрать -1.9 у прямоугольника. В итоге заработало, только расположение поменял чуток (вместо -1.9 поставил 0.6)Добавлено (11 сентября 2016, 14:47) --------------------------------------------- Как просто проверить по нажатию мышки в 2d совпадает ли объект, к которому скрипт прикреплен с другим объектом. Добавлено (11 сентября 2016, 14:48) --------------------------------------------- ? Добавлено (11 сентября 2016, 14:49) --------------------------------------------- вроде столкновение так можно проверить, а как соеденить чет голова не варит void OnTriggerEnter2D(Collider2D other) { Debug.Log(other.name); }
|
|
| |
Lertmind | Дата: Воскресенье, 11 Сентября 2016, 14:58 | Сообщение # 12 |
заслуженный участник
Сейчас нет на сайте
| ZVEN, не понятно что за "другим объектом" и куда нажимается мышь. Объекты можно сравнивать по имени, тегу, наличию компонентов.
|
|
| |
ZVEN | Дата: Воскресенье, 11 Сентября 2016, 16:15 | Сообщение # 13 |
почетный гость
Сейчас нет на сайте
| ну например вот прямоугольник крутится по кругу, а на одном из мест стоит точка. Я мышку нажимаю, если положение их совпадает, то все хорошо.Добавлено (11 сентября 2016, 16:15) --------------------------------------------- Еще пока не забыл интересует вопрос как остановить вращение при использовании RotateArround
|
|
| |
Lertmind | Дата: Воскресенье, 11 Сентября 2016, 17:10 | Сообщение # 14 |
заслуженный участник
Сейчас нет на сайте
| ZVEN, сделать можно по-разному, если через OnTriggerStay:
Код void OnTriggerStay(Collider other) { if (мышкаНажата && other.CompareTag("тег_точки")) { // Всё хорошо } } Чтобы каждый раз не вызывался OnTriggerStay, можно сделать через OnTriggerEnter / OnTriggerExit, где сначала переменная bool выставляется в true, потом в false, а когда нажимается мышь проверяется эта переменная. Другой способ, это делать Raycast и тому подобное.
Цитата ZVEN ( ) как остановить вращение при использовании RotateArround Просто не вызывай RotateAround Условие ставишь.
|
|
| |
ZVEN | Дата: Воскресенье, 11 Сентября 2016, 17:46 | Сообщение # 15 |
почетный гость
Сейчас нет на сайте
| Цитата Просто не вызывай RotateAround Условие ставишь. Это понятно. А если вызывается постоянно и в какой-то момент надо остановить?Добавлено (11 сентября 2016, 17:46) --------------------------------------------- Блин, чет не робит, хотя вроде коллайдеры и на том и на том, галочка Is trigger есть. Вот код
Код void OnTriggerEnter2D(Collider2D other) { if ((Input.GetMouseButtonDown(0)) && (other.gameObject.CompareTag("Give")) ) { Debug.Log("OK"); } }
|
|
| |
Lertmind | Дата: Воскресенье, 11 Сентября 2016, 18:01 | Сообщение # 16 |
заслуженный участник
Сейчас нет на сайте
| Условия ставишь, а когда надо остановиться условие не срабатывает и код не вызывается.
Нужно использовать OnTriggerStay.
|
|
| |
ZVEN | Дата: Воскресенье, 11 Сентября 2016, 18:07 | Сообщение # 17 |
почетный гость
Сейчас нет на сайте
| Цитата Нужно использовать OnTriggerStay. А чем он отличается от OnTriggerEnter. Вроде и с Enter сработать должен. Stay значит оставаться же. Вроде и так и так работать должен
|
|
| |
Lertmind | Дата: Воскресенье, 11 Сентября 2016, 18:23 | Сообщение # 18 |
заслуженный участник
Сейчас нет на сайте
| OnTriggerEnter вызывается один раз при контакте, а Stay каждый кадр пока они пересекаются.
|
|
| |
ZVEN | Дата: Воскресенье, 11 Сентября 2016, 18:42 | Сообщение # 19 |
почетный гость
Сейчас нет на сайте
| Ну так мне при контакте и надо. Энтер же тоже при каждом кадре работает.
|
|
| |
Lertmind | Дата: Воскресенье, 11 Сентября 2016, 19:25 | Сообщение # 20 |
заслуженный участник
Сейчас нет на сайте
| Нет, один раз. Внимательней читай документацию и делай отладочный вывод когда не уверен.
|
|
| |