Пятница, 19 Апреля 2024, 11:56

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Вращение и поворот обьекта
Вращение и поворот обьекта
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
заслуженный участник
Сейчас нет на сайте
Нет, один раз. Внимательней читай документацию и делай отладочный вывод когда не уверен.
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Вращение и поворот обьекта
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг