欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

unity实现方向盘转动效果

程序员文章站 2022-03-26 09:07:42
本文实例为大家分享了unity实现方向盘转动效果的具体代码,供大家参考,具体内容如下效果手指或鼠标拖动方向盘旋转,有角度限制,松手后自动回转。代码将代码添加到方向盘image上。注意需要赋值canva...

本文实例为大家分享了unity实现方向盘转动效果的具体代码,供大家参考,具体内容如下

效果

手指或鼠标拖动方向盘旋转,有角度限制,松手后自动回转。

unity实现方向盘转动效果

代码

将代码添加到方向盘image上。

注意需要赋值canvas。

using unityengine;
using unityengine.eventsystems;

public class steeringwheel : monobehaviour,idraghandler,ienddraghandler
{
    public canvas canvasroot;//需要指定画布 
    private recttransform m_recttransform;//坐标

    private bool m_isfirst = true;           //用于记录第一帧按下鼠标时鼠标的位置,便于计算
    private vector3 m_currentpos;            //记录当前帧鼠标所在位置
    private bool m_isclockwise;              //是否顺时针
    private float m_roundvalue = 0;          //记录总的旋转角度 用这个数值来控制一圈半
    private bool m_isturingsteeringwheel;    //是否在转方向盘 用这个判断复位

    public void ondrag(pointereventdata eventdata)
    {
        m_isturingsteeringwheel = true;
        vector2 pos;
        if (recttransformutility.screenpointtolocalpointinrectangle(m_recttransform, input.mouseposition, canvasroot.worldcamera, out pos))    //获取鼠标点击位置
        {

            pos.x = pos.x + (screen.width / 2) - getcomponent<recttransform>().position.x;
            pos.y = pos.y + (screen.height / 2) - getcomponent<recttransform>().position.y;

            vector3 pos3 = new vector3(pos.x, pos.y, 0);   //计算后鼠标以方向盘圆心为坐标原点的坐标位置

            if (m_isfirst)
            {
                m_currentpos = pos3;
                m_isfirst = false;
            }

            vector3 currentpos = vector3.cross(pos3, m_currentpos);      //计算当前帧和上一帧手指位置 用于判断旋转方向
            if (currentpos.z > 0)
            {
                m_isclockwise = true;
            }
            else if (currentpos.z < 0)
            {
                m_isclockwise = false;
            }

            if (m_currentpos != pos3)     //范围内让方向盘随着手指转动
            {
                if (m_isclockwise)
                {
                    if (m_roundvalue <= 180)
                    {
                        m_roundvalue += vector3.angle(m_currentpos, pos3);

                        transform.rotate(new vector3(0, 0, -vector3.angle(m_currentpos, pos3)));
                    }
                }

                else
                {
                    if (m_roundvalue >= -180)
                    {
                        m_roundvalue -= vector3.angle(m_currentpos, pos3);

                        transform.rotate(new vector3(0, 0, vector3.angle(m_currentpos, pos3)));
                    }
                }

            }
            m_currentpos = pos3;
        }
    }

    public void onenddrag(pointereventdata eventdata)
    {
        m_isfirst = true;
        m_isturingsteeringwheel = false;
    }

    void start()
    {
        canvasroot = gameobject.find("canvas").getcomponent<canvas>();
        m_recttransform = canvasroot.transform as recttransform;
    }


    void update()
    {
        if (!m_isturingsteeringwheel && m_roundvalue != 0)   //复位
        {
            if (m_roundvalue >= 0)
            {
                m_roundvalue -= 8f;               //复位速度
                if (m_roundvalue < 0)
                    m_roundvalue = 0;
                transform.rotation = quaternion.euler(new vector3(0, 0, -m_roundvalue));
            }
            else
            {
                m_roundvalue += 8f;
                if (m_roundvalue > 0)
                    m_roundvalue = 0;
                transform.rotation = quaternion.euler(new vector3(0, 0, -m_roundvalue));
            }
        }
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。