@Gioo12x

Как сделать скрипт вращения объекта по оси Y плавным на зажатия левой кнопки мыши в юнити 2Д?

Мне нужна помощь со своим скриптом. У меня проблема объект поворачиваются резко когда я кликаю но он должен действовать, поворачивается плавно когда я зажимаю левую кнопку мыши.
И я хочу спросить как сделать так чтоб объект в этом скрипте когда мышь не зажата объект возвращался по оси Y в исходную точку (как руки в неон абисс после стрельбы).

Вот сам скрипт:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RotaleInMause : MonoBehaviour
{
    public float offset;

    void Update()
    {if (Input.GetMouseButtonDown(0))
        {
            Vector3 diference = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
            float rotateZ = Mathf.Atan2(diference.y, diference.x) * Mathf.Rad2Deg;
            transform.rotation = Quaternion.Euler(0f, 0f, rotateZ + offset);


            Vector3 LocalScale = Vector3.one;

            if (rotateZ > 90 || rotateZ < -90)
            {
                LocalScale.y = -1f;
            }
            else
            {
                LocalScale.y = +1f;
            }


            transform.localScale = LocalScale;
        }
      
    }
    
}
  • Вопрос задан
  • 229 просмотров
Решения вопроса 1
@Gioo12x Автор вопроса
Всем привет. Я закончил скрипт для игры над которым я работал и всем отвечающим (кроме freeExec) спасибо за ваши ответы. А теперь к самому скрипту точнее к скриптам.
Чтоб сделать то что я хотел потребовалась 4 скрипта.
Первый скрипт для поворот рук это тот же самый скрипт который я спросил как его изменить.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MouseLook : MonoBehaviour
{
    public float offset;

    void Update()
    {
        Vector3 diference = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
        float rotateZ = Mathf.Atan2(diference.y, diference.x) * Mathf.Rad2Deg;
        transform.rotation = Quaternion.Euler(0f, 0f, rotateZ + offset);

        Vector3 LocalScale = Vector3.one;

        if(rotateZ > 90 || rotateZ <-90)
        {
            LocalScale.y = -1f;
        }
        else
        {
            LocalScale.y = +1f;
        }
        transform.localScale = LocalScale;
    }
   
}

второй для поворачивание персонажа в сторону мыши(то есть на 180 градусов в ту сторону где мышка).
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RotatePlayer : MonoBehaviour
{
     Vector3 pos;
     Camera main;
   private void Start()
    {
        main = FindObjectOfType<Camera>();
    }

    void Update()
    {
        Flip();

        pos = main.WorldToScreenPoint(transform.position);
    }

    void Flip()
    {
        if(Input.mousePosition.x < pos.x)
        {
            transform.localRotation = Quaternion.Euler(0, 180, 0);
        }
        if (Input.mousePosition.x > pos.x)
        {
            transform.localRotation = Quaternion.Euler(0, 0, 0);
        }

но есть одно большое НО эти скрипты работают постоянна, а нам нужно чтобы скрипты работали только тогда когда мышь зажата. Для этого существует третий скрипт он активирует эти скрипты когда мышь зажата.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BtnHoldDetect : MonoBehaviour
{

    private MouseLook look;
    private GameObject Ruki;

void Start()
    {
        GameObject ruki = GameObject.Find("Ruki");
        MouseLook look = ruki.GetComponent<MouseLook>();
        look.enabled = false;

        GameObject player = GameObject.Find("Player");
        RotatePlayer look2 = player.GetComponent<RotatePlayer>();
        look2.enabled = false;
    }
    void Update() {
        if (Input.GetMouseButtonDown(0)) {
            GameObject ruki = GameObject.Find("Ruki");
            MouseLook look = ruki.GetComponent<MouseLook>();
            look.enabled = true;

            GameObject player = GameObject.Find("Player");
            RotatePlayer look2 = player.GetComponent<RotatePlayer>();
            look2.enabled = true;
        }
        if (Input.GetMouseButtonUp(0))
        {
            GameObject ruki = GameObject.Find("Ruki");
            MouseLook look = ruki.GetComponent<MouseLook>();
            look.enabled = false;

            GameObject player = GameObject.Find("Player");
            RotatePlayer look2 = player.GetComponent<RotatePlayer>();
            look2.enabled = false;
        }

    }
}

Четвёртый скрипт для возращения рук к исходному положению. А если быть точнее когда руки находится в промежутке z>270 z<90 то руки поворачиваются к точке z=0, а если z<270 z>90 то они поворачиваются к точке z=180.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Rotation_Swap : MonoBehaviour

{
    float  smooth= 5.0f;
    float toAngle1 = 0.0f;
    float toAngle2 = 180.0f;
 
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        Vector3 LocalScale = Vector3.one;
        if ( (transform.eulerAngles.z > 270) ||(transform.eulerAngles.z < 90))
        {
            Quaternion target = Quaternion.Euler(0, 0, toAngle1);
            transform.rotation = Quaternion.Slerp(transform.rotation, target, Time.deltaTime * smooth);
            LocalScale.y = +1f;
        }
       else if ((transform.eulerAngles.z > 90)||(transform.eulerAngles.z < 270))
        {
            Quaternion target = Quaternion.Euler(0, 0, toAngle2);
          transform.rotation = Quaternion.Slerp(transform.rotation, target, Time.deltaTime * smooth);
           LocalScale.y = -1f;
        }
        transform.localScale = LocalScale;


    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
freeExec
@freeExec
Участник OpenStreetMap
Задачка 5 класс.
Дано: нужно переместить объект из точки А в точку Б за 1 секунду.
Вопрос: на сколько объект переместиться за время, которое прошло с предыдущего кадра?

Не сразу его телепортируем в Б, а по чуть чуть, с каждым кадром.
Ответ написан
Комментировать
@Helpmiplis
Для плавности умножь координаты на Time.deltaTime.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы