说明:

这是一个UI界面中操作方向盘的演示,源于一个游戏项目,仅供学习参考,其中:
1、方向盘可复原
2、Android测试能够正常操作,没有出现轴心偏离现象(测试机型Galaxy S8-分辨率:2960x1440)

注意:

如果你要使用这个脚本,应将Rect Transfrom设置成如下属性,当然,某些属性不是必须要这么设定,但至少这样做可以正常工作,作为一个案例,供参考!

1、Rect Transfrom相关属性设定

2、其画布下的SteerWheel是Image类型的UI元素,图像设定为方向盘图片

3、Game

4、Inspector

5、演示结果

代码:

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using System.Collections;/// <summary>
/// Steering wheel.
/// Defines the steerign wheel behaviour.
/// Original source:
/// http://forum.unity3d.com/threads/touchscreen-steering-wheel-rotation-example-mouse-supported.196741/
/// </summary>
public class SteeringWheel2D : MonoBehaviour
{[Tooltip("UI_Element通常它是一个Image类型的图像")][Header("方向盘UI本体")]public Graphic UI_Element;[Header("方向盘最大旋转角度")]public float maximumSteeringAngle = 520f;[Header("方向盘旋转复原速度")]public float wheelReleasedSpeed = 700f;[Header("方向盘当前旋转角度")]public float wheelAngle = 0f;float wheelPrevAngle = 0f;bool wheelBeingHeld = false;RectTransform rectT;[Tooltip("centerPoint是方向盘旋转的中心,其中你应将设定UI_Element的Img图片")][Header("方向盘旋转中心点")]public Vector2 centerPoint;/// <summary>/// Gets the clamped value./// Returns a value in range [-1,1] similar to GetAxis("Horizontal")/// 返回旋转进度比/// </summary>/// <returns>The clamped value.</returns>public float GetClampedValue(){return wheelAngle / maximumSteeringAngle;}/// <summary>/// Gets the angle./// returns the wheel angle itself without clamp operation/// 获取实际旋转角度(-520°~520°)/// </summary>/// <returns>The angle.</returns>public float GetAngle(){return wheelAngle;}/// <summary>/// Use this for initialization./// </summary>void Start(){rectT = UI_Element.rectTransform;InitEventsSystem();UpdateRect();}/// <summary>/// Initializes the events system to catch/// the user movements.i.e. MouseDown/MouseDrag/MouseUp./// </summary>void InitEventsSystem(){EventTrigger events = UI_Element.gameObject.GetComponent<EventTrigger>();if (events == null)events = UI_Element.gameObject.AddComponent<EventTrigger>();if (events.triggers == null)events.triggers = new System.Collections.Generic.List<EventTrigger.Entry>();EventTrigger.Entry entry = new EventTrigger.Entry();EventTrigger.TriggerEvent callback = new EventTrigger.TriggerEvent();UnityAction<BaseEventData> functionCall = new UnityAction<BaseEventData>(PressEvent);callback.AddListener(functionCall);entry.eventID = EventTriggerType.PointerDown;entry.callback = callback;events.triggers.Add(entry);entry = new EventTrigger.Entry();callback = new EventTrigger.TriggerEvent();functionCall = new UnityAction<BaseEventData>(DragEvent);callback.AddListener(functionCall);entry.eventID = EventTriggerType.Drag;entry.callback = callback;events.triggers.Add(entry);entry = new EventTrigger.Entry();callback = new EventTrigger.TriggerEvent();functionCall = new UnityAction<BaseEventData>(ReleaseEvent);callback.AddListener(functionCall);entry.eventID = EventTriggerType.PointerUp;entry.callback = callback;events.triggers.Add(entry);}/// <summary>/// Initializes the center point of seetring wheel transform/// rectangle./// 初始化方向盘变换矩形的旋转中心点。/// </summary>void UpdateRect(){Vector3[] corners = new Vector3[4];rectT.GetWorldCorners(corners);for (int i = 0; i < 4; i++){corners[i] = RectTransformUtility.WorldToScreenPoint(null, corners[i]);}Vector3 bottomLeft = corners[0];Vector3 topRight = corners[2];float width = topRight.x - bottomLeft.x;float height = topRight.y - bottomLeft.y;Rect _rect = new Rect(bottomLeft.x, topRight.y, width, height);centerPoint = new Vector2(_rect.x + _rect.width * 0.5f, _rect.y - _rect.height * 0.5f);}/// <summary>/// Update is called once per frame./// Update the wheel status. If the /// wheel is released, reset the rotation/// to initial (zero) rotation by /// wheelReleasedSpeed degrees per second/// </summary>void Update(){if (!wheelBeingHeld && !Mathf.Approximately(0f, wheelAngle)){float deltaAngle = wheelReleasedSpeed * Time.deltaTime;if (Mathf.Abs(deltaAngle) > Mathf.Abs(wheelAngle))wheelAngle = 0f;else if (wheelAngle > 0f)wheelAngle -= deltaAngle;elsewheelAngle += deltaAngle;}rectT.localEulerAngles = Vector3.back * wheelAngle;}/// <summary>/// Presses the event./// Executed when mouse/finger starts touching the steering wheel./// </summary>/// <param name="eventData">Event data.</param>public void PressEvent(BaseEventData eventData){Vector2 pointerPos = ((PointerEventData)eventData).position;wheelBeingHeld = true;wheelPrevAngle = Vector2.Angle(Vector2.up, pointerPos - centerPoint);}/// <summary>/// Drags the event./// Executed when mouse/finger is dragged over the steering wheel./// Do nothing if the pointer is too close to the center of the wheel./// Make sure wheel angle never exceeds maximumSteeringAngle./// </summary>/// <param name="eventData">Event data.</param>public void DragEvent(BaseEventData eventData){Vector2 pointerPos = ((PointerEventData)eventData).position;float wheelNewAngle = Vector2.Angle(Vector2.up, pointerPos - centerPoint);if (Vector2.Distance(pointerPos, centerPoint) > 20f){if (pointerPos.x > centerPoint.x)wheelAngle += wheelNewAngle - wheelPrevAngle;elsewheelAngle -= wheelNewAngle - wheelPrevAngle;}wheelAngle = Mathf.Clamp(wheelAngle, -maximumSteeringAngle, maximumSteeringAngle);wheelPrevAngle = wheelNewAngle;}/// <summary>/// Executed when mouse/finger stops touching the steering wheel/// Performs one last DragEvent, just in case/// </summary>/// <param name="eventData">Event data.</param>public void ReleaseEvent(BaseEventData eventData){DragEvent(eventData);wheelBeingHeld = false;}
}

—END—

Unity实现的汽车方向盘转动效果[完整案例]相关推荐

  1. html中放大镜案列,Canvas实现放大镜效果完整案例分析(附代码)

    本文主要记录 canvas 在图像.文字处理.离屏技术和放大镜特效的实现过程中使用到的api.先看下效果吧: 一张模糊的图片: 鼠标点击任意位置,产生放大效果: 哇塞~ 一个帅哥,哈哈哈哈~ 1.放大 ...

  2. html放大镜原理,Canvas实现放大镜效果完整案例分析(附代码)

    本文主要记录 canvas 在图像.文字处理.离屏技术和放大镜特效的实现过程中使用到的API.先看下效果吧: 一张模糊的图片: 鼠标点击任意位置,产生放大效果: 哇塞~ 一个帅哥,哈哈哈哈~ 1.放大 ...

  3. 【Unity Shader】聚光灯体积光效果的简单实现

    效果如下: Unity中的聚光灯SpotLight,可以用作手电筒,射灯等类似的效果,比如这样的 但是如果想把光束的效果做出来,就超出了SpotLight的能力范围了,本篇就为了记录一下一种简单的实现 ...

  4. Unity 之 ShaderGraph 实现旋涡(传送门)效果入门级教程

    Unity 之 ShaderGraph 实现旋涡[传送门]效果入门级教程 一,最终效果展示 二,创建PBRGraph 三,实现原理介绍 四,完整效果实现 五,应用到场景中 若你的工程还没有进行基础配置 ...

  5. Unity接入罗技G29方向盘,通过SDK获取按键信息

    Unity接入罗技G29方向盘,通过SDK获取按键信息 说明:   最近需要做一个外设汽车驾驶相关的软件,采用的外设 罗技G29方向盘,项目中遇到的问题这里记录一下. 项目准备:   1.下载罗技的S ...

  6. Unity中创建本地多人游戏完整案例视频教程 Learn To Create A Local Multiplayer Game In Unity

    Unity中创建本地多人游戏完整案例视频教程 Learn To Create A Local Multiplayer Game In Unity MP4 |视频:h264,1280x720 |音频:A ...

  7. Unity的NGUI插件篇——入场效果

    Unity的NGUI插件篇--入场效果 入场效果 入场效果需要借助于NGUI提供的TweenPosition类来完成,为了说明此类的使用方法,本节将使会讲解两个示例.本文选自  大学霸 <NGU ...

  8. android金币动效_Android 仿余额宝数字跳动动画效果完整代码

    一:想都不用想的,有图有真相,看着爽了,在看下面源码 二:实例源码分析 ①:首先定义接口 package com.demo.tools.view; /** * 数字动画自定义 * * @author ...

  9. Unity Shader 之 简单 护盾Shield 效果的实现

    Unity Shader 之 简单 护盾Shield 效果的实现 目录 Unity Shader 之 简单 护盾Shield 效果的实现 一.简单介绍 二.实现原理

最新文章

  1. 汽车车牌识别系统(六)-- 项目中的各个文件解析
  2. 重构学习1-重命名方法、类、参数等
  3. 剑网三缘起的云端游戏,千呼万唤终于出来,有玩家不知道怎么玩?
  4. 16进制数组转成10进制 qt_QT 十六进制字符串转化为十六进制编码
  5. Python读取文本文档转化成列表
  6. js indexOf()
  7. 2754. [SCOI2012]喵星球上的点名【后缀数组】
  8. 【链接】Eclipse的Debug调试技巧
  9. socket.io实现客户端和服务端的双向通信
  10. 程序中的@Override是什么意思?
  11. 3┃音视频直播系统之浏览器中通过 WebRTC 直播视频实时录制回放下载
  12. Paused before potential out-of-memory crash页面崩溃
  13. Kibana启动报错 server is not ready yet的解决方案
  14. centos6.5 ifconfig 显示为eth2,配置文件只有eth0
  15. BZOJ---4484:[Jsoi2015]最小表示【bitset】
  16. 手机DIY自制现身南瓜网
  17. 计算机毕业设计网吧管理,【毕业设计】计算机毕业设计网吧管理系统
  18. 基于xc7k325t fbg900的IBRET的测试流程
  19. 21世纪东方美女标准[男士参考女士学习]
  20. 华容道 java swing

热门文章

  1. 多线程之 ForkJoinool线程池(二十四)
  2. PaddleClas预训练模型ResNet50_vd_ssld精度突破84%
  3. mac系统安装手机安装包
  4. 华为为何不上市?任正非:猪养太肥懒得哼声
  5. Linux学习笔记11——远程拷贝命令scp
  6. citespace与mysql_citespace问题
  7. 互联网公司招聘--奇虎360--研发工程师--2016年笔试题
  8. 丁鹿学堂:webstorm2022最新UI配置
  9. Firefox浏览器怎么安装adobe flash player插件
  10. 01-ESP8266 NodeMCU 物联网开发初识