Суббота, 20 Августа 2022, 00:18

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Записи участника » absolute_null [9]
Результаты поиска
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 проблемы, и походу, он не подойдёт для такой вещи.
Форум игроделов » Записи участника » absolute_null [9]
  • Страница 1 из 1
  • 1
Поиск:

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