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));
            }
        }
    }
}

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

(0)

相关推荐

  • unity实现车方向盘转动效果

    本文实例为大家分享了unity实现车方向盘转动效果的具体代码,供大家参考,具体内容如下 效果: C#脚本如下: using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; public class NewBehaviourScript : MonoBehaviour, IDragHandler,IBeginD

  • unity实现方向盘转动效果

    本文实例为大家分享了unity实现方向盘转动效果的具体代码,供大家参考,具体内容如下 效果 手指或鼠标拖动方向盘旋转,有角度限制,松手后自动回转. 代码 将代码添加到方向盘Image上. 注意需要赋值Canvas. using UnityEngine; using UnityEngine.EventSystems; public class SteeringWheel : MonoBehaviour,IDragHandler,IEndDragHandler { public Canvas Can

  • Unity shader实现遮罩效果

    本文实例为大家分享了Unity shader实现遮罩效果的具体代码,供大家参考,具体内容如下 效果: shader代码: Shader "Custom/Mask" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {}//目标图片,即需要被遮罩的图片 _MaskLayer("Culling Mask",2D) = "white"{}//混合的图片,设置

  • Unity shader实现消融效果

    本文实例为大家分享了Unity shader实现消融效果的具体代码,供大家参考,具体内容如下 效果图: shader代码: // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "Custom/EdgeColo" { Properties { _MainTex ("Texture", 2D) = "white" {} _N

  • Unity实现虚拟摇杆效果

    本文实例为大家分享了Unity实现虚拟摇杆效果的具体代码,供大家参考,具体内容如下 首先添加两者图片 从左到右分别是Back和Front 将Front放到Back中心 在Front身上添加脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems;//导入命名空间 public class JoyStick : MonoBehavi

  • Unity实现新手引导镂空效果

    本文实例为大家分享了Unity实现新手引导镂空效果的具体代码,供大家参考,具体内容如下 一.实现思路 创建有8个顶点的Mesh,内外边界都是四边形(矩形).只生成内.外边之间的Mesh,内层矩形就产生了镂空部分,外层的4个顶点,是组件自身RectTransform的四个顶点,内层的4个顶点,使用镂空目标(_target)RectTransform的四个顶点.确定内层的顶点的时候需要注意,多数情况下_target和HollowOutMask都不在同一个本地坐标空间,所以需要使用CalculateR

  • Unity实现引导页效果

    本文实例为大家分享了Unity实现引导页效果的具体代码,供大家参考,具体内容如下 效果图: 1.创建Canvas,设置RenderMode=ScreenSpace-Overlay,UIScaleMode = ScaleWithScreenSize, ReferenceResolution(x=1080,y=1920) 2.创建一个RawImage,命名为(parentGoImg),并做如下设置 3.在parentGoImg下建几个RawImage,赋予想展示的图片,并做如下设置 4.添加如下脚本

  • Unity Shader模拟玻璃效果

    本文实例为大家分享了Unity Shader实现玻璃效果的具体代码,供大家参考,具体内容如下 Shader "Glass Refraction" { Properties { _MainTex ("Main Tex", 2D) = "white" {} _BumpMap ("Normal Map", 2D) = "bump" {} _Cubemap ("Environment Cubemap&qu

  • Unity实现弧形移动效果

    本文实例为大家分享了Unity实现弧形移动效果的具体代码,供大家参考,具体内容如下 一.实现效果 二.第一种实现方法--弧形插值 using UnityEngine; public class ArcMove : MonoBehaviour { public GameObject curGo;//当前物体 public GameObject targetGo;//目标物体 public float value; private void Update() { //计算中心点 Vector3 ce

  • Unity实现刮奖效果

    本文实例为大家分享了Unity实现刮奖效果的具体代码,供大家参考,具体内容如下 需要一个Shader和一个CS脚本: // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "Custom/Transparent Colored Eraser" { Properties { _MainTex ("Base (RGB), Alpha (A)",

随机推荐