c # - скрипт в Unity3D только debug.log вместо ротации - PullRequest
1 голос
/ 25 сентября 2019

В моем проекте 3D Unity у меня есть этап Ground Plane с дочерним объектом.Пока я нажимаю кнопку пользовательского интерфейса, объект должен вращаться, если я отпускаю кнопку, вращение должно остановиться.К сожалению, это не работает.Он показывает только мою Debug.Log функцию, но объект не вращается.

Вот мой скрипт:

using System.Collections;
using System.Collections.Generic;
using Unity.Engine;

public class RotateCube : MonoBehaviour
{
    public Rigidbody rb;
    public rotateStatus = false;
    //public float rotationSpeed = 100f;

    public void rotateNow()
    {
        rotateStatus = !rotateStatus;
        Debug.Log("Rotation position = " + transform.eulerAngles.y)
    }

    void Update()
    {
        if(rotateStatus)
        {
             rb.transform.Rotate(0, 45, 0, Space.World);
             // Also tried it with;
             // rb.transform.Rotate(Vector3.up * rotationSpeed * Time.deltaTime);
             Debug.Log("Rotation should been happend.");
        }
     }
}

Скрипт прикреплен к моему gameObject.Пользовательская кнопка имеет событие OnClick с gameObject и связана с функцией rotateNow.

Я также попробовал метод Input.GetMouseButtonDown(0) и Input.GetButtonDown().Это будет работать, но с этими методами каждый раз, когда я нажимаю на экран, мой объект будет вращаться.

Это то, что показывает моя консоль, если я тестирую ее на iPad:

(Имя файла:./Runtime/Export/Debug.bindings.h Строка 45)

Поворот должен был произойти.

надеюсь, кто-то может помочь мне решить эту проблему

РЕДАКТИРОВАТЬ:

enter image description here

1 Ответ

2 голосов
/ 25 сентября 2019

это поворачивает объект примерно на 45 ° каждый кадр ... это просто быстро для ваших глаз

Вы должны использовать Time.deltaTime, чтобыпреобразовать вращение в плавное «вращение в секунду»

Rotate(0, 45 * Time.deltaTime, 0, Space.World);

Затем, как только Rigidbody задействован, вы должны не установить любые преобразования через Transformкомпонент, но вместо этого используйте RigidBody.MoveRotation в FixedUpdate, чтобы вращать объект, но сохранять физическую целостность

void FixedUpdate()
{
    if(rotateStatus)
    {
         rb.MoveRotation(rb.rotation * Quaternion.Euler(Vector3.up * rotationSpeed * Time.deltaTime));
         Debug.Log("Rotation should be happening.");
    }
 }

, еслия отпускаю кнопку, вращение должно остановиться

Этого не произойдет.Кнопка Unity по умолчанию не имеет никакой реализации для сообщения вашим сценариям, что кнопка больше не нажимается.

Вы можете написать собственное расширение для этого, используя IPointerUpHandler и IPointerExitHandler интерфейсы:

public class ReleaseButton : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler
{
    public UnityEvent onPointerUp;

    [SerializeField] private Button button;

    private void Awake()
    {
        if(!button) button = GetComponent<Button>();
    }

    // according to the Docs this has to be implemented in order to
    // receive OnPointerUp events ... though we don'T need it actually
    public void OnPointerDown(PointerEventData pointerEventData){ }

    public void OnPointerExit(PointerEventData pointerEventData)
    {
        if(!button.interactable) return;

        onPointerUp.Invoke();
    }

    public void OnPointerUp(PointerEventData pointerEventData)
    {
        if(!button.interactable) return;

        onPointerUp.Invoke();
    }
}

прикрепите это к своей кнопке и укажите свой RotateNow также в onPointerUp, чтобы rotateStatus будет сброшен при отпускании кнопки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...