unity实现方向盘转动效果

 更新时间:2021年09月07日 16:00:35   作者:我寄人间雪满头丶  
这篇文章主要为大家详细介绍了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));
            }
        }
    }
}

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

您可能感兴趣的文章:

相关文章

  • c#实现的操作oracle通用类

    c#实现的操作oracle通用类

    这篇文章主要介绍了c#实现的操作oracle通用类,用来操作oracle数据库十分的方便,需要的朋友可以参考下
    2014-08-08
  • 给c#添加SetTimeout和SetInterval函数

    给c#添加SetTimeout和SetInterval函数

    Javascript中的SetTimeout和SetInterval函数很方便,把他们移植到c#中来。
    2008-03-03
  • C#实现在控制台输入密码显示星号的方法

    C#实现在控制台输入密码显示星号的方法

    这篇文章主要介绍了C#实现在控制台输入密码显示星号的方法,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • C# 如何获取当前进程或线程的ID

    C# 如何获取当前进程或线程的ID

    这篇文章主要介绍了C# 如何获取当前进程或线程的ID,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • C#检测两个矩阵是否相等的方法

    C#检测两个矩阵是否相等的方法

    这篇文章主要介绍了C#检测两个矩阵是否相等的方法,涉及C#进行数组操作的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C#实现实时监控文件夹变化

    C#实现实时监控文件夹变化

    在开发各种应用程序时,我们经常需要对文件系统中的文件或文件夹进行实时监测,下面就跟随小编一起来看看具体如何使用C#实现这一功能吧
    2024-03-03
  • LINQ基础之Intersect、Except和Distinct子句

    LINQ基础之Intersect、Except和Distinct子句

    这篇文章介绍了LINQ使用Intersect、Except和Distinct子句的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • 使用c#+IMap实现收取163邮件

    使用c#+IMap实现收取163邮件

    本文给大家推荐的是使用c#+IMap实现收取163邮件的具体方法和示例代码,并附上了smtp邮箱发送邮件的代码,有需要的小伙伴可以参考下
    2018-02-02
  • C#中执行SQL的几种方法讲解

    C#中执行SQL的几种方法讲解

    这篇文章介绍了C#中执行SQL的几种方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • UnityShader实现百叶窗效果

    UnityShader实现百叶窗效果

    这篇文章主要为大家详细介绍了UnityShader实现百叶窗效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11

最新评论