Четверг, 28 Ноября 2024, 04:54

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Поворот объекта по клику на 90 градусов.
absolute_nullДата: Понедельник, 11 Июня 2018, 20:34 | Сообщение # 1
был не раз
Сейчас нет на сайте
Вид 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
drcrackДата: Понедельник, 11 Июня 2018, 20:56 | Сообщение # 2
старожил
Сейчас нет на сайте
Код
 
IEnumerator Rotate() {

  var duration = 0.5f;
  var startTime = Time.time;
  var startRotation = transform.localRotation;
  // чтобы не ломать голову об кватернионы просто берем то что получается твоим методом
  transform.Rotate(transform.forward, 90);
  var endRotation = transform.localRotation;

  while (true) {

   var k = (Time.time - startTime) / duration;

   if (k >= 1) break;

   transform.localRotation = Quaternion.Slerp(startRotation, endRotation, k);

   yield return null;

  }

  transform.localRotation = endRotation;

}
//
StartCoroutine(Rotate());

не тестил


Сообщение отредактировал drcrack - Понедельник, 11 Июня 2018, 20:57
absolute_nullДата: Понедельник, 11 Июня 2018, 21:45 | Сообщение # 3
был не раз
Сейчас нет на сайте
drcrack, этот код работает и там и там, спасибо. Но странно, что мой код работает только на пк, а на телефоне баги. Дело в функции Update? На пк и телефоне разное время тика движка? Но он же всё равно должен проходить проверку...
drcrackДата: Понедельник, 11 Июня 2018, 22:11 | Сообщение # 4
старожил
Сейчас нет на сайте
ну ты сравниваешь float с помощью ==, это на пк-то во многих ситуациях не работает, чего уж говорить о телефонах
вторая проблема твоего кода это зависимость от фпс, чем круче телефон, тем резже будет движение, это косяк
absolute_nullДата: Понедельник, 11 Июня 2018, 22:25 | Сообщение # 5
был не раз
Сейчас нет на сайте
drcrack, ну с флоатом я схитрил и привёл вообще всё к инту, а вот про зависимость от фпс я думал, скорее всего из-за этого
drcrackДата: Понедельник, 11 Июня 2018, 22:42 | Сообщение # 6
старожил
Сейчас нет на сайте
Цитата
drcrack, ну с флоатом я схитрил и привёл вообще всё к инту

вот тока каст флоата в инт отбрасывает дробную часть, а не округляет, и если из-за неточности флоатов после поворота получилось 89.9999999981f то после каста будет 89
ты лучше не хитри а делай как положено))

Цитата
а вот про зависимость от фпс я думал, скорее всего из-за этого

точно не из-за этого, это скорее просто мелкий UX косяк


Сообщение отредактировал drcrack - Понедельник, 11 Июня 2018, 22:43
absolute_nullДата: Понедельник, 11 Июня 2018, 23:39 | Сообщение # 7
был не раз
Сейчас нет на сайте
drcrack,
Цитата
если из-за неточности флоатов после поворота получилось 89.9999999981f то после каста будет 89

блин, вот, точно, теперь я понял. Вот оно и вылезло, поэтому на телефоне он просто не проходил проверку.
  • Страница 1 из 1
  • 1
Поиск:

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